目录
本文内容
为什么要分为Eden和Survivor?
为什么要设置两个Survivor区?
一次完整的GC流程是怎样的?
你知道哪几种垃圾收集器?有什么区别?
本文内容
垃圾回收机制是JVM的一大特点,主要发生在JVM运行时数据区里的堆中。
不了解JVM内存模型的小伙伴可以点我(TP眼位)
为什么要分为Eden和Survivor?
1.如果没有Survivor的话每一次?Minor GC存活的对象就被送入老年代,那么老年代很快就被填满,从而触发Full GC,而一次FullGC的时间远大于?Minor GC,所以要划分Eden : from : to=8:1:1。
2.Survivor存在的意义就是减少被送到老年代的对象,进而减少Full GC只有经过16次的Minor GC的对象才能送到老年代。
为什么要设置两个Survivor区?
而设置两个Survivor区最大的好处就是解决了碎片化,当Eden区满后,进行?Minor GC,存活的对象就会被移动到第一块survivor from,Eden被清空;等Eden区再满了,就再触发一次Minor GC,Eden区和survivor from中的存活对象又会被复制送入第二块survivor to。这种复制算法保证了to中来自from和Eden两部分的存活对象占用连续的内存空间,避免了碎片化的发生。
一次完整的GC流程是怎样的?
当 Eden 区的空间满了, Java虚拟机会触发一次 Minor GC,以收集新生代的垃圾,存活下来的对象,被转移到 Survivor区此时年龄设为1。之后每经过一次Minor GC年龄就加1满15次还存活的对象就被送到老年代,当老年代满了无法再存对象时会触发Full GC,Full GC清理整个java堆。
大对象(需要大量连续内存空间的Java对象)直接进入老年代。
你知道哪几种垃圾收集器?有什么区别?
CMS收集器与G1收集器
区别: CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用; G1收集器收集范围是老年代和新生代,不需要结合其他收集器使用; CMS收集器以最小的停顿时间为目标的收集器; G1收集器可预测垃圾回收的停顿时间 CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片 G1收集器使用的是“标记-整理”算法,进行了空间整合,降低了内存空间碎片。
|