JVM调优

78 阅读3分钟

什么情况下考虑调优?

  1. Heap内存持续上涨到设置的最大内存值。
  2. Full Gc次数频繁
  3. GC停顿时间7较长(超过1秒)
  4. 应用出现ouOfMemory等内存异常
  5. 应用中使用本地缓存且占用大量内存空间。
  6. 系统吞吐量或响应性能不高或下降

JVM调优步骤:

  1. 分析GC日志及dump文件,判断是否需要优化,确定瓶颈问题点
  2. 确定JVM调优量化目标
  3. 确定JVM调优参数(根据历史JVM参数来调整)
  4. 依次调优内存,延迟,吞吐量等指标。
  5. 对比观察调优前后的差异
  6. 不断分析和调整,直到找到合适的JVM参数配置;
  7. 找到最合适的参数,将这些参数应用到所有服务器,并进行后续跟踪。

JVM调优目标:

1延迟:GC低停顿或者GC低频率

2 低内存占用

3 高吞吐量

4 JVM调优量化目标: Heap内存使用率<= 70% Old generation内存使用率 <= 70% avg pause <= 1秒 Full gc次数0 或 avg pause interval >= 24小时。

调优命令有哪些?

Sun jdK监控和故障处理的命令有jps, jstat, jamp, jhat, jstack, jinfo:

  1. jps: jvm process status tool, 显示指定系统内所有的hotspot虚拟机进程。
  2. jinfo: jvm configuration info 用于实时查看和调整虚拟机运行参数。
  3. jmap: jvm memory map 命令用于生成heap dump文件。
  4. jstat: jvm statics monitoring 用于监视虚拟机运行时状态信息的命令,显示除虚拟机进程中的类装载, 内存, 垃圾收集, JIT编译等运行数据。
  5. jstack: 用于生成java虚拟机当前时刻某个线程的快照。
  6. jhat: jvm heap analysis tool 命令与jmap搭配使用, 用来分析jamp生成的dump, jhat内置了微型http/html 服务器, 生成dump的分析结果后, 可以通过浏览器查看。

如何打印线程堆栈信息: 输入jps,获得进程号 top -Hp pid 查看该进程中各线程的cpu耗时性能 jstack pid 查看当前进程的堆栈状态 或者jstack -l > output.txt将堆栈信息打到一个txt文件

有哪些JVM性能调优参数?

堆栈内存相关:

  1. -Xms 设置初始堆大小
  2. -Xmx 设置最大堆的大小
  3. -Xmn 设置新生代大小, 相当于配置-XX:NewSize和-XX:MaxNewSize为一样的值
  4. -Xss:每个线程的堆栈大小
  5. -XX:NewSize 设置新生代大小
  6. -XX:MaxNewSize:新生代最大值
  7. -XX:MaxPermSize 设置持久代大小
  8. -XX:NewRatio 新生代与老年代的比值(除去持久代)
  9. -XX:SurviorRatio Eden区与Survior区的比值
  10. -XX:PretenureSizeThreshold 当创建的对象超过指定大小时,直接把对象分配在老年代.
  11. -XX:MaxTenuringThreadshold设定对象在Survior复制的最大年龄阙值,超过阙值转移到老年代.

垃圾收集器相关:

  1. -XX:+USeParallelGC 选则并行收集器为垃圾收集器
  2. -XX:ParallelGCThreads=20 配置并行收集器的线程数
  3. -XX:UseConMarkSweepGC 设置年老代为CMS并发收集
  4. -XX:CMSFullGcsBeforeCompaction =5 由于并发收集器不对内存空间进行压缩,整理,所以运行一段事件以后就会产生"碎片", 是的运行效率降低. 此值运行5次之后对内存空间进行压缩,整理.
  5. -XX:UseCMSCompactionAtFullCollection 打开对年老代的压缩,可能影响性能,但是可以消除碎片

辅助信息相关:

  1. -XX:PringtGCDetails 打印GC详细信息.
  2. -XX:HeapDumpOnOutOfMemoryError,让JVM在内存溢出时自动生成内存快照,以便排查问题.
  3. -XX:+DisableExplictGC 禁止系统调用System.gc(), 防止手动误触发full gc 造成问题.
  4. -XX:PrintTLAB 查看TLAB空间的使用情况.