学习资料
【尚硅谷宋红康JVM全套教程(详解java虚拟机)】
【阿里巴巴Java开发手册】https://www.w3cschool.cn/alibaba_java
JDK 8 JVM官方手册
垃圾回收器
7种经典垃圾回收器总结
怎么选择垃圾回收器?
Java垃圾收集器的配置对于JVM优化来说是一个很重要的选择,选择合适的垃圾收集器可以让JVM的性能有一个很大的提升。
怎么选择垃圾收集器?
1、优先调整堆的大小让JVM自适应完成。
2、如果内存小于100M,使用串行收集器。
3、如果是单核、单机程序,并没有停顿时间的要求,串行收集器。
4、如果是多CPU、需要高吞吐量、允许停顿时间超过1秒,选择并行或者JVM自己选择。
5、如果是多CPU、追求低停顿时间,需快速响应(比如延迟不能超过1秒,如互联网应用),使用并发收集器。
官方推荐G1,性能高。现在互联网的项目,基本都是使用G1。
GC日志分析
通过阅读GC日志,我们可以了解Java虚拟机内存分配与回收策略。
内存分配与垃圾回收的参数列表
-XX:+PrintGC
输出GC日志。类似:-verbose:gc
-XX:+PrintGCDetails
输出GC的详细日志
-Xloggc:./logs/gc.log
日志文件的输出路径。
垃圾回收器的新发展
GC仍然处于飞速发展之中,目前的默认选项
G1 GC在不断的进行改进
,很多我们原来认为的缺点,例如串行的Full GC、Card Table扫描的低效等,都已经被大幅改进,例如,JDK 10以后,Full GC已经是并行运行,在很多场景下,其表现还略优于Parallel GC的并行Full GC实现。
即使是Serial GC,虽然比较古老,但是简单的设计和实现未必就是过时的,它本身的开销,不管是GC相关数据结构的开销,还是线程的开销,都是非常小的所以随着云计算的兴起,
在Serverless等新的应用场景下,Serial GC找到了新的舞台。
比较不幸的是CMS GC,因为其算法的理论缺陷等原因,虽然现在还有非常大的用户群体,但在JDK9中已经被标记为废弃,并在JDK14版本中移除。