JVM调优
JVM调优
JDK 7、8 和 8+版本的JVM调优方式有一些共通之处,但也存在差异,下面分别简述:
JDK 7 调优要点与参数:
-
内存管理与垃圾回收:
-Xms
设置JVM初始堆内存大小。-Xmx
设置JVM最大堆内存大小。-XX:NewRatio
设置年轻代与老年代的内存比例。-XX:SurvivorRatio
设置Eden区与Survivor区的比例。-XX:+UseParallelGC
使用并行垃圾收集器(Parallel GC)。-XX:+UseConcMarkSweepGC
使用CMS垃圾收集器(并发标记清除)。
-
方法区设置:
-XX:PermSize
设置永久代初始大小(JDK 8中已废弃)。-XX:MaxPermSize
设置永久代最大大小(JDK 8中已废弃)。
-
线程栈大小:
-Xss
设置每个线程栈的大小。
JDK 8 调优要点与参数:
-
内存管理与垃圾回收:
- 仍保留
-Xms
和-Xmx
参数设置堆内存。 - 引入了Metaspace(元空间),取代了原来的永久代,使用
-XX:MetaspaceSize
初始化元空间大小,-XX:MaxMetaspaceSize
设定最大大小。 -XX:+UseG1GC
引入了G1垃圾收集器,可以进行并行和并发的垃圾回收,并且具备区域化收集的特点。-XX:+UseStringDeduplication
用于开启字符串去重优化。
- 仍保留
-
JDK 8 默认垃圾收集器:
- 服务器模式下,默认使用Parallel GC或G1 GC(取决于JVM版本和操作系统)。
-
其他改进:
-XX:+UseCompressedOops
开启对象指针压缩,减小内存占用。
JDK 8+ 版本调优(包括JDK 11及以上版本):
-
内存管理与垃圾回收:
- 继续使用
-Xms
和-Xmx
设置堆内存。 - Metaspace继续沿用,无需调整PermSize和MaxPermSize。
- G1 GC 成为默认垃圾收集器(在某些版本和条件下)。
- ZGC(Z Garbage Collector)和Shenandoah GC在较新版本JDK中可用,它们提供了更低的停顿时间和更大的堆支持。
- 继续使用
-
模块系统:
- JDK 9引入了模块系统(Project Jigsaw),需要关注模块间的依赖和运行时资源需求。
-
去除PermGen:
- JDK 8之后永久代被完全移除,类元数据存储在Metaspace中。
实例
假如我的Linux环境下设置JDK内存的命令是:
$JAVA_HOME/bin/java -server -Xmx1024m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -jar $APP_HOME/app-0.0.2-SNAPSHOT.jar >/dev/null 2>&1 &
这段命令意味着我正在启动一个Java应用程序(app-0.0.2-SNAPSHOT.jar),并且设置了以下JVM参数:
-server
: 指定使用服务器模式的JVM,通常比客户端模式有更好的性能优化。-Xmx1024m
: 设置JVM的最大堆内存大小为1024MB。-XX:MetaspaceSize=512m
: 设置元空间(Metaspace)的初始大小为512MB,这是JDK 8之后存储类元数据的地方。-XX:MaxMetaspaceSize=1024m
: 设置元空间的最大大小为1024MB。
关于Xms和Xmx的注意事项:
-
大小匹配:
-Xms
(初始堆内存)和-Xmx
(最大堆内存)通常建议设置为相同的值,以避免在运行过程中频繁地调整堆内存大小,减少GC带来的性能损失。 -
系统资源:设置
-Xms
和-Xmx
时,务必确保不超过物理内存总量,留出一部分内存供操作系统和系统缓存使用,避免因为JVM申请过多内存而导致系统出现内存不足的问题。 -
适配应用需求:根据应用的实际需求和负载情况进行调整,过大的堆内存可能导致GC时间过长,影响应用性能;过小的堆内存则可能导致频繁的GC,同样影响性能。
-
监控与调优:在实际部署后,需要通过JVM监控工具(如JMX、VisualVM、JProfiler等)观察堆内存使用情况以及GC行为,根据实际情况进行适时的调优。
-
并发线程数:同时注意,线程栈大小(
-Xss
)和并发线程数也会影响到总的内存消耗,需要综合考量。
在我给出的命令中,没有明确看到 -Xms
的设置,如果我希望设置初始堆内存大小,应当加入 -Xms
参数,例如 -Xms512m
。不过,由于没有给出 -Xms
参数,JVM会根据默认规则或操作系统设置决定初始堆大小。
调优时应注意观察应用程序的行为特征,选择合适的垃圾收集器,并根据应用特点调整内存分配策略。同时,借助JDK自带的工具如JConsole、VisualVM、JFR(Java Flight Recorder)等进行监控和分析,结合具体的业务场景和性能指标进行针对性调优。在实际操作中,往往需要多次试验和对比才能找到最适合应用的JVM配置。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~