java的基础较难知识点总结1

JVM相关

1.说一下Java的垃圾回收机制。
它使得java程序员在编写程序的时候不再考虑内存管理。垃圾回收器通常是作为以一个单独的低级别的线程运行,不可预知的情况下对内存堆中长时间没有使用的对象进行清除和回收,程序员不能实时调用垃圾回收器进行垃圾回收。但可以手动使用System.gc()来让垃圾回收机制(GC)运行,但由于Java的语言规范不一定会让GC运行。
简单来说GC就是Where(在哪里),When(什么时候需要被回收),how(如何被回收的)
2.JVM的内存模型/内存布局
java的基础较难知识点总结1
JVM堆:作用是用于为几乎所有的对象实例和数据实例提供内存空间,即为new关键字所有产生的对象进行空间分配
方法区:主要用于储存已经由JVM加载类的信息,常量,静态变量,即时编译器编译后的代码等数据
虚拟机栈:是随线程的产生而产生的,属于线程的私有区域,生命周期与线程保持一致,故JVM的内存管理器对这部分无需管理;
本地方法栈:本地方法栈是为Java的Native method方法调用的时候服务,与虚拟机栈十分类似
程序计数器:为线程私有,PC中保存了java字节码的命令地址,若为Native方法,则程序计数器内容为空
3.JVM的4种引用和使用场景
由高到低是:
1:强引用:
最普遍的引用,我们使用new关键字创建的所有实体类几乎全为强引用,垃圾回收器绝不会回收强引用所创造的类。
2.软引用
在内存足够时,垃圾回收器不会回收软引用。但如果内存空间不够了就会回收软引用来解决内存不足的问题。软引用可以用来实现内存敏感的高速缓存
3.弱引用
比软引用更短的生命周期,当垃圾回收器在所属内存区域发现只具有弱引用的对象时,就会回收它的内存
4.虚引用
不会决定对象的生命周期,若一个对象只具有虚引用,那么它就和没有引用一样,随时可以被垃圾回收器回收
综上所述是 Java 垃圾回收器会优先清理可达强度低的对象。
4.引用计数法与可达性分析算法。
引用计数法:在对象头处增加一个counter,当增加一次该对象的引用时counter自加,反之自减,当counter为0时表示,但这种方式无法区分JVM的引用类型,而且还会造成死锁,比如两个对象互相引用就始终无法释放counter
可达性分析算法:通过一系列为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明该对象是不可用的。如果对象在进行可行性分析后发现没有与GC Roots相连的引用链,也不会理解死亡。它会暂时被标记上并且进行一次筛选,若还没有新的关联时,就会被垃圾回收器进行回收。(是通过枚举根节点来实现的)
这两个方法也是判断对象是不是垃圾的方法
5.堆里面的分区和各自的特点
年轻代:分为两个存活区,两个存活区交替使用,循环往复,在下一次垃圾回收时,之前清除的存活区又用来放置存活下来的对象了,一般来说,年轻代的区域较小,而且大部分对象是需要清除的,采用“复制算法”进行垃圾回收
年老代:在年老代中,放置的都是生命周期较长的对象。而且垃圾回收器会使用一种称为“标记-清除-压缩”的算法来进行垃圾回收。
6.Minor GC 与 Full GC 分别在什么时候发生?
当每次对象从 Eden 复制到 Survivor Space 或者从 Survivor Space 中的一个复制到另外一个,有一个计数器会自动增加值。 默认情况下如果复制发生超过16次, JVM 会停止复制并把他们移到老年代中.
7.内存分配规则
1.对象优先分配在eden区(年轻代两个存活区中的一个),如果eden区没有足够空间时,虚拟机.Minor GC
2.大对象会直接进入老年代
3.长期存活的对象直接进入老年代
4.动态判断对象的年龄。
5.空间分配担保
8.四种方法创建Java对象
1.使用new语句(最常用的方法)
2.使用clone()克隆方法
A a1=a.clone();
注意:被克隆的类实现Cloneable接口
被克隆的类药重写clone()方法
java的基础较难知识点总结1
3.使用反射手段,使用Class.forName()
A a=(A)Class.forName(“A所在的位置”).newInstance();
4.运用反序列化手段,调用java.io.ObjectInputStream对象readObject()方法;