因此,此命令帮助大家定位是 Java 进程本身占用内存较大,还是哪个动态链接库占用内存较多,在定位直接内导致的内存泄露的场景有很大的作用。
示例输出:
使用示例3:
java 堆的内存结构很复杂,包括新生代、老年代、持久代、直接内存等,jmap 命令可以查看堆的概要信息。
示例输出:
使用示例4:
有些 Java 内存问题不是显而易见的,从类、动态链接库、堆的概要信息的角度上,无法定位具体产生的原因,我们需要对 Java 堆的内部结构进行剖析才能进一步分析问题的根源原因,这通常通过 jmap 命令导出 Java 堆的快照,然后通过其他工具或者甚至可视化内存分析工具(例如:JHAT、JMAT、JProfiler、Jconsole、JVisualVM)等进行详细分析。
示例输出:
3.4 jstat
jstat 利用了 JVM 内建的指令对 Java 应用程序的资源和性能进行实时的命令行的监控,包括了对堆大小和垃圾回收状况的监控等等,与 jmap 对比,jstat 更倾向于输出积累的信息与打印 GC 等的统计信息等。
jstat 是 JDK 自带的监控工具,在 JDK 的根目录里可以找到。
使用示例:
示例输出:
3.5 jstack
jstack 命令用于打印出给定的 java 进程 ID 的线程堆栈快照信息,从而可以看到 Java 进程内线程的执行状态、这个你在执行的任务等等,可以据此分析线程等待、死锁等问题。
jstack 也是 JDK 自带的命令,在 JDK 的根目录里可以找到。本文第二章“神奇的”脚本中的 show-busiest-java-threads 脚本也是基于此命令实现的。
使用示例:
示例输出:
3.6 jinfo
jinfo 可以输出并修改运行时的 java 进程的环境变量和虚拟机参数。
使用示例:
示例输出:
3.7 其他命令
除了上面介绍的常用 Java 虚拟机相关命令以外,我们还有两类工具。
基本命令:
Java 虚拟机图形界面分析工具:
一次OOM定位与修复过程中与监控同事现场编写的脚本
本节提供一个笔者在实践过程中解决 OOM 问题的一个简单脚本,这个脚本是为了解决 OOM(unable to create native thread)的问题而在问题机器上临时编写,并临时使用的,脚本并没有写的很专业,只是为了抓取需要的信息并解决问题,但是在线上问题十分火急的情况下,这个脚本会有大用处。
这里给读者介绍这个看似简陋而又信息满满的Java服务的监控脚本,如果读者在线上已经遇到了 OOM 的问题,可以顺着这个脚本的思路,利用本文提供的各种脚本和命令来深挖问题的根本原因。
场景与命令汇总表
最后,我把所有的命令和脚本收集在一个表格中,称为“场景与命令汇总表”,便于大家随时参考和使用。
作者简介:
李艳鹏,知名支付平台架构师,专注线上和线下支付平台的应用架构和技术架构的规划与落地,负责交易、支付、渠道、账务、计费、风控、对账等系统的设计与实现,在移动支付、聚合支付、合规账户、扫码支付、标记化支付等业务场景上有产品应用架构规划的经验。
来源:【九爱网址导航www.fuzhukm.com】 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!