Stop-the-World
这个单词就是说,JVM由于要执行GC而停止了应用程序的执行,即除了GC的线程执行外,所有线程都处于等待状态,并且这种情况在任何一种GC算法中都会发生.
多数GC优化就是通过减少Stop-the-World发生的时间
来提高程序性能.
Safepoint安全点
形象的说: jvm垃圾回收就好比是宝洁阿姨在打扫卫生,如果一边打扫,一边有人扔垃圾可咋整?为了不让这种情况发生,即保洁阿姨在开始打扫前就和所有人说,我要搞卫生了,别扔垃圾了就成了.
在jvm垃圾回收时,如何达到上面的情况呢?
在可达性分析算法中,要分析哪个对象没有被引用的时候,必须在一个快照的状态点(可以理解为一瞬间) 进行,在这个点,所有的线程都被冻结了
,不可以出现分析过程中引用关系还在变化的情况,因此,分析结果需要在某个节点具备确定性,该节点就叫安全点.
即安全点就是在可达性分析算法中对象引用关系不会发生变化的点,程序只有在安全点才会停下来.
产生Safepoint的地方:
方法调用;
循环跳转;
异常跳转等;
JVM的运行模式
- server模式:启动较慢,但是启动之后,由于采用的是重量级的虚拟机,优化更多,所以程序跑起来更快.
- client模式:启动较快,由于采用的是轻量级的虚拟机,所以程序跑起来相对慢一些.
- 通过在cmd的命令提示符窗口下输入
java -version
就可以看到我们当前jvm的运行模式了.
垃圾收集器之间的联系
垃圾收集器之间有连线就说明他们可以搭配使用.
年轻代常见的垃圾收集器
Serial收集器
- 通过命令
UseSerialGC
就可以使年轻代用这个收集器,它采用复制算法. - Serial收集器采用单线程收集,进行垃圾收集时,必须暂停所有工作线程.
- 它简单而且高效,是Client模式下默认的年轻代收集器.
ParNew收集器
- 通过命令
UseParNewGC
就可以使年轻代用这个收集器,它采用复制算法. - 它采用多线程收集.
- 其余的行为.特点和Serial收集器一样.
- 它是server模式下首选的年轻代垃圾收集器.
- 单核执行效率不如Serial,在多核下执行才有优势.
Parallel Scavenge收集器
吞吐量 = 运行用户代码时间/(运行用户代码时间+垃圾回收时间)
- 通过命令
UseParallelGC
就可以使年轻代用这个收集器,它采用复制算法. - 使用多线程进行垃圾回收.
- 比起关注用户线程停顿时间,更关注系统的吞吐量.
- 在多核下执行才有优势,Server模式下默认的年轻代收集器.