JVM调优

JVM调优

JDK 7、8 和 8+版本的JVM调优方式有一些共通之处,但也存在差异,下面分别简述:

JDK 7 调优要点与参数:

  1. 内存管理与垃圾回收

    • -Xms 设置JVM初始堆内存大小。
    • -Xmx 设置JVM最大堆内存大小。
    • -XX:NewRatio 设置年轻代与老年代的内存比例。
    • -XX:SurvivorRatio 设置Eden区与Survivor区的比例。
    • -XX:+UseParallelGC 使用并行垃圾收集器(Parallel GC)。
    • -XX:+UseConcMarkSweepGC 使用CMS垃圾收集器(并发标记清除)。
  2. 方法区设置

    • -XX:PermSize 设置永久代初始大小(JDK 8中已废弃)。
    • -XX:MaxPermSize 设置永久代最大大小(JDK 8中已废弃)。
  3. 线程栈大小

    • -Xss 设置每个线程栈的大小。

JDK 8 调优要点与参数:

  1. 内存管理与垃圾回收

    • 仍保留 -Xms-Xmx 参数设置堆内存。
    • 引入了Metaspace(元空间),取代了原来的永久代,使用 -XX:MetaspaceSize 初始化元空间大小, -XX:MaxMetaspaceSize 设定最大大小。
    • -XX:+UseG1GC 引入了G1垃圾收集器,可以进行并行和并发的垃圾回收,并且具备区域化收集的特点。
    • -XX:+UseStringDeduplication 用于开启字符串去重优化。
  2. JDK 8 默认垃圾收集器

    • 服务器模式下,默认使用Parallel GC或G1 GC(取决于JVM版本和操作系统)。
  3. 其他改进

    • -XX:+UseCompressedOops 开启对象指针压缩,减小内存占用。

JDK 8+ 版本调优(包括JDK 11及以上版本):

  1. 内存管理与垃圾回收

    • 继续使用 -Xms-Xmx 设置堆内存。
    • Metaspace继续沿用,无需调整PermSize和MaxPermSize。
    • G1 GC 成为默认垃圾收集器(在某些版本和条件下)。
    • ZGC(Z Garbage Collector)和Shenandoah GC在较新版本JDK中可用,它们提供了更低的停顿时间和更大的堆支持。
  2. 模块系统

    • JDK 9引入了模块系统(Project Jigsaw),需要关注模块间的依赖和运行时资源需求。
  3. 去除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的注意事项:

  1. 大小匹配-Xms(初始堆内存)和 -Xmx(最大堆内存)通常建议设置为相同的值,以避免在运行过程中频繁地调整堆内存大小,减少GC带来的性能损失。

  2. 系统资源:设置 -Xms-Xmx 时,务必确保不超过物理内存总量,留出一部分内存供操作系统和系统缓存使用,避免因为JVM申请过多内存而导致系统出现内存不足的问题。

  3. 适配应用需求:根据应用的实际需求和负载情况进行调整,过大的堆内存可能导致GC时间过长,影响应用性能;过小的堆内存则可能导致频繁的GC,同样影响性能。

  4. 监控与调优:在实际部署后,需要通过JVM监控工具(如JMX、VisualVM、JProfiler等)观察堆内存使用情况以及GC行为,根据实际情况进行适时的调优。

  5. 并发线程数:同时注意,线程栈大小(-Xss)和并发线程数也会影响到总的内存消耗,需要综合考量。

在我给出的命令中,没有明确看到 -Xms 的设置,如果我希望设置初始堆内存大小,应当加入 -Xms 参数,例如 -Xms512m。不过,由于没有给出 -Xms 参数,JVM会根据默认规则或操作系统设置决定初始堆大小。

调优时应注意观察应用程序的行为特征,选择合适的垃圾收集器,并根据应用特点调整内存分配策略。同时,借助JDK自带的工具如JConsole、VisualVM、JFR(Java Flight Recorder)等进行监控和分析,结合具体的业务场景和性能指标进行针对性调优。在实际操作中,往往需要多次试验和对比才能找到最适合应用的JVM配置。

原文链接 https://www.hanyuanhun.cn | https://node.hanyuanhun.cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值