中括号“[]”代表可选 尖括号“<>”代表需要输入的内容 pid的获取可以参考:top命令

查看内存使用情况 jstat -gcutil <毫秒> <次数>


导出堆中的内存文件

添加live后,表示查看存活的文件
jmap -dump:[live,]format=b,file=<导出路径和文件名:/opt/dump.bin>
示例: jmap -dump:live,format=b,file=./123.hprof 123

https://www.cnblogs.com/therunningfish/p/5524238.html


查看Java线程

jps


查看当前JVM的配置

jps -lvm


查看栈的瞬时信息

jstack >> ${fileName}.log

示例:
根据Java进程堆栈信息找到对应线程ID

  • 对应线程ID转换成16进制

27460 = 0x6b44 [27460是java进程下的线程id]

  • jstack 15460 >> 15460.log [15460是java进程id]

  • 在15460.log文件中查找0x6b44对应的线程,如下图:

常用命令 - 图1

备注:
1、jstack 输出的堆栈信息,线程id对应的16进制为小写,查找时要统一按照小写方式查找
2、jstack输出为当前瞬间的堆栈信息,如果遇到间断性出现CPU高的问题时,需要多输出几次
从上面方式定位到代码Test.main(Test.java:4)处导致了CPU偏高的问题,那我们查看下代码具体如何实现的?
代码实现:

  1. public class Test {
  2. public static void main(String[] args) {
  3. while(true) {
  4. }
  5. }
  6. }

从代码层面看该处实现了一个死循环,所以导致了线程占用CPU偏高的问题。


查看当前JVM中的代理类

使用Java自带的HSDB工具,通过如下命令:

  1. sudo java -classpath "$JAVA_HOME/lib/sa-jdi.jar" sun.jvm.hotspot.HSDB

然后点击:file-Attach to HostSpot process,输入进程id
最后点击:Tools-Class Browser


强制执行GC

  1. jcmd <pid> GC.run