垃圾回收器算法:
常见的垃圾回收器
stop-the-world (暂停整个程序,简称STW)
1、Serial (单线程工作的年轻代) 作用于年轻代 串行回收
在程序运行过程中,内存满了以后,触发GC, 先STW以后然后单线程一个个标记清除,程序继续运行
2、ps (多线程工作的年轻代) 作用于年轻代 并行回收 不可以配合CMS
在程序运行过程中,内存满了以后,触发GC, 先STW以后然后多线程一个个标记清除,程序继续运行
3、ParNew (多线程工作的新年轻代) 作用于年轻代 可以配合CMS的并行回收
4、SerialOld (单线程工作的老年代)
5、ParallelOld (多线程工作的老年代)
6、ConcurrentMarkSweep (运行时多线程的老年代,简称CMS) 老年代 并发的 垃圾回收和应用程序同时运行,不需要stop-the-word
CMS为里程碑式的垃圾回收器。 这里出现难点,会出现浮动垃圾。如:垃圾处理过程中,已经标记为垃圾的内存。在程序运行过程中这块内存又使用了。
三色标记 ,做并发标记
在运行过程中,进行标记垃圾内存,标记完成以后。
也会发生STW,将已经标记为垃圾的内存,再次筛选标记。
然后程序继续运行,这时候将筛选完后的内存清理掉。然后开始第二轮标记。
7、G1 (分区回收) 逻辑分代,物理不分代 (三色标记+SATB)
8、ZGC 逻辑物理都不分代 ColoredPointers(颜色指针,着色指针)
9、Shenandoah 逻辑物理都不分代
10、Eplison (如果确认你的程序不需要垃圾回收器,可使用)
调优主要调优1、2和4、5。 因为1.8默认的垃圾回收:PS+ParallelOld
JVM调优
JVM运行命令参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
JVM参数分类
标准:-开头,所有的HotSpot都支持
非标准:-x开头
不稳定:-xx开头 常用: -xx:+PrintFlagsFinal(设置值); -xx:+PrintFlagslnitial(默认值) ; -xx:+PrintCommandLineFlags(命令行参数)
垃圾回收器的发展路线,是随着内存越来越大的过程来演进
从分代算法演化到不分代算法
在分代算法中,对象创建分配过程图: