博客
关于我
【JVM系列】7、JVM调优
阅读量:488 次
发布时间:2019-03-07

本文共 1865 字,大约阅读时间需要 6 分钟。

JVM performans Optimization Guide

JVM的optimization是一个复杂但重要的任务,涉及堆设置、垃圾回收器选择以及性能监控等多个方面。本文将详细探讨JVM性能优化的关键点,帮助开发者和运维人员在搭建高性能Java应用时做出明智的决策。

1. Heap Setting

JVM的堆设置对于系统性能有着直接影响。堆的大小由三个因素决定:操作系统的数据模型(32位或64位)、系统的可用虚拟内存和物理内存。此外,"ksh"对于不同的应用场景有不同的最佳实践。

在Windows Server 2003环境下,物理内存为3.5 GB,搭配JDK5.0,最大堆大小可以设置为1478 MB。经典建议是将堆设置为3550 MB,以确保有足够的内存空间供应用运行。

2. Garbage Collector Selection

在JVM中,垃圾回收器的选择直接影响系统性能。JVM提供了三种垃圾回收器:串行收集器、并行收集器和并发收集器。基于不同的工作负载,选择合适的收集器类型可以显著提升性能。

a. 通过并行收集器优化吞吐量
  • 典型配置
    • java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20
    • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20
    • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100
b. 通过并发收集器优化响应时间
  • 推荐配置
    • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=20
    • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection

3. Monitoring and Tuning

a. 调用GC日志
  • -XX:+PrintGC:输出GC事件的详细信息。
  • -XX:+PrintGCDetails:打印每次GC的具体数据。
  • -XX:+PrintGCTimeStamps:记录GC事件发生的时间戳。
  • -XX:+PrintGCApplicationConcurrentTime:测量应用在GC期间未中断运行的时间。
  • -XX:+PrintGCApplicationStoppedTime:测量应用在GC期间暂停的总时间。
  • -XX:PrintHeapAtGC:在GC前后打印堆的状态信息。
  • -Xloggc:filename:将GC日志输出到文件,方便后续分析。
b. 开启压缩选项
  • -XX:+UseCMSCompactAtFullCollection:在Full GC时开启对年老代的压缩。
  • -XX:CMSFullGCsBeforeCompaction=0:确保每次Full GC后对内存空间进行压缩。

4. Common Tuning Recommendations

a. Heap Size Selection
  • 响应时间优先的应用:尽可能设大,直到接近最低响应时间限制,减少年轻代和年老代的回收频率。
  • 吞吐量优先的应用:设大,适合8核及以上多核系统,确保并行收集器运行高效。
b. 年老代和年轻代的平衡
  • 响应时间优先的应用:年老代应设置较小,确保并发收集器的效率,避免内存碎片问题。
  • 吞吐量优先的应用:年老代较小,适合大多数短期对象存活于年轻代。
c. 应对内存碎片问题
  • 如何解决内存碎片问题:
  • 开启压缩选项:-XX:+UseCMSCompactAtFullCollection
  • 调整GC频率:-XX:CMSFullGCsBeforeCompaction=5

5. Final Thoughts

JVM的性能优化是一个不断探索和实验的过程。通过合理设置堆大小、选择适合的垃圾回收器,并实时监控GC行为,开发者可以显著提升应用性能。在实践中,建议结合实际应用场景进行调整,并通过GC日志分析来优化配置。

转载地址:http://dngdz.baihongyu.com/

你可能感兴趣的文章
ORA-01207:文件比控制文件更新 - 旧的控制文件
查看>>
ORA-01795: 列表中的最大表达式数为 1000
查看>>
ORA-06575: 程序包或函数 NO_VM_DROP_PROC 处于无效状态
查看>>
ORA-08102的错误
查看>>
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor异常
查看>>
ORA-12514: TNS:listener does not currently know of service问题原因
查看>>
ora-12541:tns:no listener
查看>>
【docker知识】联合文件系统(unionFS)原理
查看>>
ORACEL学习--理解over()函数
查看>>
oracle 10g crs命令,Oracle 10g CRS安装问题解决一例
查看>>
Oracle 10g ORA-01034: ORACLE not available 错误
查看>>
oracle 10g的安装配置
查看>>
Oracle 11.2.0.4 x64 RAC修改public/private/vip/scan地址
查看>>
Oracle 11G INDEX FULL SCAN 和 INDEX FAST FULL SCAN 对比分析
查看>>
Oracle 11g UNDO表空间备份增强
查看>>
Oracle 11g 使用RMAN备份数据库
查看>>
Oracle 11g 单实例安装文档
查看>>
Oracle 11g 操作ASM权限问题
查看>>
Oracle 11g 数据类型
查看>>
Oracle 11g 编译使用BBED
查看>>