(转)JVM参数的说明、简单记法和GC调优策略
背景:在进行jvm调优的时候参数总是记不住,也不知道为啥要调优
https://blog.csdn.net/u013066244/article/details/88089766
环境
java7+
前言
看了大部分博文对JVM
所谓调优就是修改参数值,但是我觉得这不算调优,比如:将最大内存值调大了,这就叫调优吗?
每次别人问我服务器怎么调优,我都会理解成,怎么修改源码或者用某种算法去提升性能,而不是改什么参数;
好了,上面就是吐槽了,JVM
调优应该是个很高大上的东西,但是看别人博客就是调参数,不能苟同;
说起参数,JVM
的参数,对我这记性不好的人来说,还是蛮难记的;
看到知乎的上的评论,过来做个笔记
参数
JVM参数 | 说明 |
---|---|
- Xmx | 设置堆的最大内存值,等同于-XX:MaxHeapSize |
-Xms | 设置JVM 启动时,堆的初始化大小 |
-Xmn | 设置堆中新生代初始化及最大大小 |
-Xss | 设置线程大小,等同于-XX:ThreadStackSize |
-XX:PermGen | 设置永久代内存的初始化大小(Java8 中开始废弃永久代) |
-XX:MaxPermGen | 设置永久代的最大值 |
-XX:SurvivorRatio | 设置Eden区和Survivor区的空间比例:Eden/S0 = Eden/S1 默认为8 |
-XX:NewRatio | 设置年老代和年轻代的比例大小,默认值为2 |
-Xms 如果要进一步细化:初始化大小用
-XX:NewSize
,最大大小用-XX:MaxNewSize
简单记法
参数 | 记法 |
---|---|
-Xmx | Memory Maxumaximum 理解为max的缩写mx |
-Xms | Memory Start-up |
-Xmn | Memory new |
-Xss | Stack size |
GC调优原则
1、多数的Java
应用不需要在服务器上进行GC优化;
2、多数导致GC问题的情况,都不是因为设置参数错误造成的,而是代码问题;
3、在应用上线之前,先考虑将机器的JVM
参数设置到最合适(最优);
4、减少使用全局变量和大对象;如果迫不得已创建了很多大对象,在不使用时,应该手动赋予null
(在公司有过实际经历);
5、GC优化是最后不得已才采用的手段
GC的目的
1、将转移到老年代的对象数量降低到最小
2、减少GC的执行时间
策略1
将新对象预留在新生代,由于Full GC
的成本远高于Minor GC
,因此尽量将对象分配在新生代是明智的做法,实际项目中根据GC日志分析新生代空间是否分配合理,适当通过-Xmn
命令来调节新生代大小,最大限度降低新对象进入老年代的情况。
策略2
大对象进入老年代,虽然大部分情况下,将对象分配在新生代是合理。但是对于大对象这种做法却是不太好的,大对象如果首次在新生代分配可能会出现空间不足导致很多年龄不够的小对象被分配到老年代,破坏了新生代的结构,可能出现频繁的Full GC
。因此,对于大对象,可以设置直接进入老年代;-XX:PretenureSizeThreshold
可以设置直接进入老年代的对象大小。
策略3
合理设置进入老年代对象的年龄,-XX:MaxTenuringThreshold
设置对象进入老年代的年龄大小,减少老年代的内存占用,降低发生Full GC
的频率。
策略4
设置合理的堆大小,堆大小设置有两个参数:-Xms 初始化堆大小
,Xmx
最大堆大小。
不需要GC优化的情况
1、MinorGC 执行时间不到50ms
2、MinorGC 执行不频繁,约10秒一次
3、Full GC 执行时间不到1s
4、Full GC 执行频率不算频繁,不低于(大约)10分钟一次
参考地址:JVM 配置常用参数和常用 GC 调优策略
JVM的GC 参数为什么要这么命名:xms、xss、xmn和xmn?
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,让更多的人能够享受到获取知识的快乐!因为本人初入职场,鉴于自身阅历有限,所以本博客内容大部分来源于网络中已有知识的汇总,欢迎各位转载,评论,大家一起学习进步!如有侵权,请及时和我联系,切实维护您的权益!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
2018-08-05 阿里面试
2018-08-05 阿里笔试
2015-08-05 瞬间的感触
2015-08-05 (转)Collections类方法详解