JVM 工具

JVM调试与优化指南
本文介绍了JVM的调试工具,如使用jstat查看GC时间、jmap检查内存占用及对象分布,以及如何通过jstack查找CPU占用高的线程。同时,针对不同场景提供了响应时间和吞吐量优先的JVM配置建议。
  • jvm 调试工具
    • gc时间查看 jstat -gcutil pid 
    • jvm  堆内存使用情况 
    • jvm线程调试
  • jvm线上部署
    • 响应时间优先:
    • 吞吐量优先
    • 参数配置
  • 参考资料

 

 

jvm 调试工具

  1. gc时间查看 jstat -gcutil pid 

     

     S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT    0.00  85.38  39.77  27.86  59.94     83    0.444     4    0.657    1.101

    S0:Heap上的Survivor space 0段 已使用空间的百分比

    S1:Heap上的Survivor space 1段已使用的空间百分比

    E:Heap上Eden space已使用的空间百分比

    O:Heap上的Old space段已使用的空间百分比

    P:Perm space已使用的空间百分比

     

  2. jvm  堆内存使用情况 

    • jmap -live:histo pid  查看jvm中生存的类对象,按照实例数和占用空间大小排序
    • jmap -heap pid 查看jvm 内存占用情况

       

  3. jvm线程调试

 

ps -mp pid -o THREAD,tid,time

nid 转16进制  printf "%x\n" tid

显示jvm每个线程cpu使用率,如果jvm占用cpu过高,据此查看 查出对应的线程ID号。然后根据jstack -F pid 或 jstack pid查看jvm运行的线程,根据thread id找到对应的线程,可以找到占用cpu的代码。

 

jvm线上部署

响应时间优先:

年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得:

  1. 并发垃圾收集信息

  2. 持久代并发收集次数

  3. 传统GC信息

  4. 花在年轻代和年老代回收上的时间比例

减少年轻代和年老代花费的时间,一般会提高应用的效率

吞吐量优先

一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。

      参考资料:jvm调优案例及参数详解  

参数配置

  • args="-J-server -Xms10000M -Xmx10000M -Xmn4800M -Xss256k -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+UseParNewGC -XX:ParallelGCThreads=8 -XX:SurvivorRatio=2 -XX:TargetS
    urvivorRatio=50 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5 -XX:CMSMaxAbortablePrecleanT
    ime=5000 -XX:CMSInitiatingOccupancyFraction=70 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Djmagick.systemclassloader=false -DXCE_USE_DBCP -DPASSPORT_CREATE_CLUSTER"
    args="-J-server -Xms10000M -Xmx10000M -Xmn4800M -Xss256k -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+UseParNewGC -XX:ParallelGCThreads=8 -XX:SurvivorRatio=2 -XX:TargetS
    urvivorRatio=50 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5 -XX:CMSMaxAbortablePrecleanT
    ime=5000 -XX:CMSInitiatingOccupancyFraction=70 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Djmagick.systemclassloader=false -DXCE_USE_DBCP -DPASSPORT_CREATE_CLUSTER"

### 推荐的JVM相关工具及使用指南 #### 1. **JDK自带命令行工具** - **jps**:用于查看当前运行的Java进程ID,是诊断和管理JVM的第一步。例如,执行`jps -l`可以显示所有Java进程的完整类名或JAR文件路径[^3]。 - **jstat**:用于监控JVM的垃圾回收(GC)情况、类加载状态等统计信息。通过`jstat -gc <pid>`可以实时查看指定进程的GC活动,帮助识别内存瓶颈[^3]。 - **jmap**:用于生成堆转储快照(heap dump),并通过`jmap -dump:format=b,file=heap.bin <pid>`将堆内存导出为二进制文件,以便后续分析内存泄漏问题。 - **jstack**:用于打印线程堆栈信息,适用于排查死锁或线程阻塞问题。例如,执行`jstack <pid>`可获取当前进程中所有线程的状态和调用堆栈。 #### 2. **图形化监控工具** - **VisualVM**:一款多功能可视化工具,集成了多种JDK工具的功能,支持本地和远程JVM的性能监控、线程分析、内存分析等。它可以通过插件扩展功能,提供直观的用户界面来观察JVM运行时的各项指标[^3]。 - **JConsole**:由Sun公司提供的图形化监控工具,能够连接到本地或远程JVM,实时展示内存使用率、线程数量、类加载数等关键指标,并支持MBean管理操作。 - **Java Mission Control (JMC)**:Oracle官方推出的高级性能分析工具,配合Java Flight Recorder (JFR) 使用,可以记录详细的运行时事件,如GC详情、方法执行时间、锁竞争等,非常适合深入分析应用性能。 #### 3. **现代监控方案** - **Prometheus + Grafana**:这是一个广泛使用的开源监控组合。Prometheus负责采集指标数据,而Grafana则用于数据可视化。对于JVM应用,可以通过配置Exporter(如Micrometer或Dropwizard Metrics)将JVM相关的指标暴露给Prometheus,再利用Grafana创建仪表板展示这些数据,实现对JVM健康状况的持续监控[^3]。 #### 4. **诊断与性能分析工具** - **Arthas**:阿里巴巴开源的一款强大的JVM诊断工具,支持在线诊断正在运行的Java程序。它提供了丰富的命令集,比如`thread`查看线程信息、`watch`监视方法调用、`trace`追踪方法执行路径等,极大地简化了线上问题的定位过程[^2]。 - **MAT (Eclipse Memory Analyzer)**:专门用于分析堆转储文件的工具,可以帮助开发者快速找到内存泄漏的原因。通过导入由`jmap`生成的heap dump文件,MAT能展示对象实例的数量、大小以及它们之间的引用关系,从而辅助优化内存使用[^3]。 - **Async Profiler**:一个低开销的CPU/内存采样器,特别适合在生产环境中使用。它可以生成火焰图,清晰地显示各个函数调用所消耗的时间比例,有助于发现性能热点。 #### 5. **GC日志分析工具** - **GCViewer**:一款轻量级的GC日志解析工具,支持多种格式的日志输入,能够计算并展示每次GC的耗时、回收前后堆内存的变化趋势等重要参数,便于评估GC策略的有效性[^3]。 - **GCEasy**:在线版GC日志分析平台,用户只需上传日志文件即可获得详尽的分析报告,包括吞吐量、延迟、GC类型分布等内容,并且提供优化建议[^3]。 #### 示例代码:使用Arthas进行方法调用跟踪 ```bash # 启动Arthas并附加到目标JVM java -jar arthas-boot.jar # 假设已知要跟踪的方法名为com.example.MyService.doSomething # 使用trace命令开始跟踪该方法的执行路径 trace com.example.MyService doSomething ``` 上述代码展示了如何启动Arthas并与目标JVM建立连接后,使用`trace`命令来追踪特定方法的执行流程,这对于理解复杂业务逻辑下的方法调用链非常有帮助[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值