目录
5、Java虚拟机分代算法:新生代/老年代 from/to 原理
12、Java8默认使用什么收集器?并行收集器(Parallel)
1、Java虚拟机如何判断对象是否可以回收?
判断内存中的对象是否有被引用,如果没有则可以回收。
引用计数法:对象如果被引用的情况下就会+1,如果该对象的引用次数为0的情况下,则认为是垃圾对象。
缺陷:java中没用过。如果A引用B,B引用A,两个对象相互引用,永远不会当作垃圾处理。
2、Java虚拟机可达性分析算法(Java虚拟机使用)
关键词:GC Roots,标记。虚拟机栈、本地方法栈、方法区(元空间)
可达性分析:将“GC Roots”的对象作为起点开始向下搜索,搜索所走过的路径称为引用链,当一个对象没有被任何应用链相连时,没有做标记,则证明该对象是不可用的。
哪些可以作为GC Root:虚拟机栈、本地方法栈、方法区中引用的对象
1)虚拟机栈(栈帧中的本地变量表)中引用的对象。
2)本地方法栈中JNI引用的对象
3)元空间(方法区)中类静态属性引用对象
4)方法区中的常量引用的对象
3、Java虚拟机对象四种引用:强、软、弱、虚
关键词:永远不回收、溢出回收、gc回收、随时回收
强引用(StrongReference):对象默认关联强引用。被引用关联的对象永远不会被垃圾收集器回收,即使内存溢出,也不会回收。
软引用(SoftReference):软引用关联的对象,只有当系统内存溢出时,才会回收软引用的对象。
弱引用(WeakReference):只被弱引用关联的对象,当垃圾回收机制触发的时候就会被回收,不论内存是否够。
虚引用:和没有引用一样,随时可能被回收,不触发GC时也会被回收。
4、回收算法标记清除、标记整理、标记复制算法
1)标记清除算法
标记清除算法:标记被引用的对象,清除未被标记的对象。
优点:算法实现简单
缺点:清除之后会导致内存空间不连续,以至于空间利用率不高,容易产生空间【碎片化】。
应用场景:CMS并发收集器(用于老年代垃圾回收)。
2)标记整理算法(老年代)
标记整理算法:标记清除算法的升级版,将存活的对象向内存空间一端进行移动,然后直接清理掉边界以外的内存区域。
优点:空间具有连续性,不会产生空间碎片化问题
缺点:对象引用的内存地址会发生变化,效率比较低
应用场景:Serial Old(串行)、Parallel Old(并行)垃圾收集器的收集目标都是老年代。
当触发gc回收的时候,有可能会stop-the-world暂停用户的线程
3)标记复制算法(新生代ÿ