JVM-垃圾收集的过程

时间:2023-03-10 06:09:24
JVM-垃圾收集的过程

JDK1.7 JVM的垃圾收集算法有

1. 标记-清除算法;
2. 复制算法;在商业虚拟机都是使用这种算法来回收新生代的
3. 标记-整理算法;

JDK1.7 JVM的垃圾收集器有

1. Serial收集器 -- 复制算法
2. parNew收集器 -- 复制算法
3. parallel scavenges收集器 -- 复制算法
4. serial old收集器 -- 标记整理算法
5. parallel old收集器-- 标记整理算法
6. CMS收集器-- 标记-清除算法
7. G1收集器 -- 标记整理算法

垃圾收集的过程:

  HosSpot JVM要判断对象的是"活的" 还是 "死的" 用的是“可达性分析算法”, 如果经过 “可达性分析算法” 发现没有与 GC Roots 相连接的引用链,那就会被第一次标记并且进行筛选,筛选的条件是次对象是否有必要执行 finalize() 方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,就被视作 “没有必要执行”。
  如果这个对象被判定为有必要执行finalize()方法,那么这个对象将被放置在F-Queue队列中,GC将会对F-Queue中的对象进行第二次小规模的标记(如果在调用finalize()方法时重新与引用链上的任何对象建立关联,那么在第二次标记时就会被移除 “即将回收” 的集合),当被两次标记后,就认定这个对象是 “死了”
  下面就来看看"对象死了"后 内存分配与回收策略
  对象的内存分配就是往堆上分配 ,主要分配在Eden区,当Eden区没有足够的空间时,会发起一次MinorGC,如果对象在Eden出生并经过第一次MinorGC后仍然存活,并且能够被Survivor容纳的话,将被移动到Survivor空间中,并且对象年龄设为1,对象在Survivor区中每“熬过”一次MinorGC,年龄就加1岁,当年龄(默认15岁)增加到一定程度就将被晋升到老年代中。