JVM学习目录
1.JVM 概念简介
2.JVM 运行时内存
3.JVM算法简介
4.JVM 垃圾收集器
5.JVM 调优实战
一、JVM调整注意事项
- JVM供应商和版本
- 调整堆大小和垃圾回收
- 选择垃圾回收方案
- 客户端/服务器混合JVM
- UNIX线程模型
二、堆大小的调整技巧
以下部分提供了调整虚拟机堆大小的一般准则:
-
堆大小应设置为值,以使VM使用的最大内存量不超过可用物理RAM的量。如果超过该值,则操作系统将开始分页,并且性能会大大降低。VM总是使用比堆大小更多的内存。除了堆大小设置之外,还分配了内部VM功能所需的内存,VM外部的本机库以及永久生成的内存(仅对于Sun VM:存储类和方法所需的内存)。
-
使用分代垃圾回收方案时,托儿所的大小不应超过Java堆总大小的一半。通常,堆大小的25%到40%就足够了。
-
在生产环境中,将最小堆大小和最大堆大小设置为相同的值,以防止浪费用于不断增长和收缩堆的VM资源。这也适用于新一代堆大小(Sun)或苗圃大小(Jrockit)。
以上说明翻译自Oracle JVM 堆大小的调整 -
下图是对Java Host Spot VM 参数的总结
三、调优实战
3.1 默认JVM参数
我们以SpringBoot项目为例,配置GC日志打印:-XX:+PrintGCDetails
项目刚刚启动,什么都没干就发生了Full GC ,这是不是很尴尬
我们在来看一下监控,小编用的监控是 Visual VM ,可以看出,初始的对大小在450MB ,最大2G,上面我们说过初始最好和最大的相等,这个也看项目的需求,这里的值如何调整呢?让我们重新配置一下,在看看监控!
3.2 优化JVM
接下来进行优化:
通过之前的学习,我们应该知道了垃圾收集器了,如果没有了解,请阅读,小编的JVM专区
步骤
- 选取垃圾收集器
- 优化堆大小
- 调整新生代堆大小
- 调整新生代三个区域的比例
- 命令如下:
-XX:+PrintGCDetails -XX:+UseG1GC -XX:NewSize=521m -XX:MaxNewSize=1g -XX:SurvivorRatio=8 -Xmx2g -Xms2g
启动后我们发现并没有发生 Full GC 并且日志的输出非常详细
Visual VM 查看,可以看出配置生效,而且堆得大小很稳定,当然我这里设置的比较大,但是对比没配置的图片不难发现,没有配置的,堆一直在持续增长;
今天的分享就到这里,希望对大家有所帮助
关注 Java有货领取更多资料
联系小编。微信:372787553,带您进群互相学习
左侧小编微信,右侧获取免费资料
技术博客:https://blog.csdn.net/weixin_38937840
免费书籍:https://github.com/Dylan-haiji/Programmer-Learning-materials
SpringCloud学习代码: https://github.com/Dylan-haiji/javayh-cloud
Redis、Mongo、Rabbitmq、Kafka学习代码: https://github.com/Dylan-haiji/javayh-middleware
AlibabaCloud学习代码:https://github.com/Dylan-haiji/javayh-cloud-nacos
SpringBoot+SpringSecurity实现自定义登录学习代码:https://github.com/Dylan-haiji/javayh-distribution