分代收集理论
当代的垃圾收集器,大多都遵循分代收集的理论进行设计。
分代假说
- 弱分代假说:绝大多数对象都是朝生夕死的。
- 强分代假说: 熬过越多次垃圾收集过程的对象就难以消亡。
这两个分代假说共同奠定了多个垃圾收集器的一致的设计原则:收集器应该将Java堆划分出不同的区域,然后将回收对象依据其年龄(年龄是对象熬过垃圾收过程的次数)分配到不同的区域之中存储。显而易见,如果一个区域中大多说的对象都是朝生夕死,难以熬过垃圾收集过程的话,那么应该把他们集中放在一起,每次回收时只关注如何保留少量存活而不是去标记那些大量将要被回收的对象,就能以较低的代价回收大量的空间。如果剩下的都是难以消亡的对象,那把他们集中放在一块,虚拟机便可以使用较低的频率来回收这个区域,这就同时兼顾了垃圾收集的时间开销和内存的空间有效利用。
对于Java虚拟机的分代收集理论,设计者一般至少会把Java堆划分为新生代和老年代两个区域。顾名思义,在新生代中,每次垃圾收集时都会发现大量的对象死去,而每次存活的少量对象,将会逐步晋升到老年代中存放。
- 部分收集(Partial GC):指目标不是完整的收集整个Java堆的垃圾收集,其中又分为:
- 新生代收集(Minor GC/Young GC):值目标是新生代的垃圾收集。
- 老年代收集(Major GC/Old GC):目标是老年代的垃圾收集。目前只有CMS收集器会有单独收集老年代的行为。
- 混合收集(Mixed GC):指目标是收集整个新生代以及部分老年代的垃圾收集。目前只有G1收集器会有这种行为。
- 整堆收集(Full GC):收集整个Java堆和方法区的垃圾收集。
标记-清除算法
标记-复制算法
标记-整理算法
经典的垃圾收集器
- Serial收集器
- ParNew收集器
- Parallel Scavenge收集器
- Serial Old收集器
- Parallel Old收集器
- CMS收集器
- Garbage First收集器
衡量垃圾收集器的三项最重要指标:内存占用,吞吐量,延迟,三者共同构成了一个不可能的三角。
查看Java 8默认的垃圾收集器:
./java -XX:+PrintCommandLineFlags -version
结论:通过-XX:+UseParallelGC可知,默认的垃圾收集器算法是:ParallelGC
查看Java 8新生代和老年代的默认比例:
jps - Java Virtual Machine Process Status Tool
参考网址:https://docs.oracle.com/javase/7/docs/technotes/tools/share/jps.html
查看Java 8新生代和Eden和Survivor比例:
./java -XX:+PrintFlagsInitial -version
Eden:SurvivorRatio=8:2,其中From:To=1:1。