开发中优化时常用的JDK命令
工作中优化时常用的一些命令,死记肯定是记不住的,通常记在小本本上,用到的时候,复制粘贴出来查看 作者:沉默的反补 https://www.bilibili.com/read/cv6295754 出处:bilibili
jmap(堆内存分析)
一定要注意,触发Full GC和不触发Full GC的情况,因为我们必须要通过控制变量法,对照地来实验结果。当堆异常时,想要获得快照,如此时使用GC后快照,则必然会破坏当前的堆样本。因此,我们针对堆 heap 的分析,必定是需要2份以上快照,1份是有问题的 heap dump,通常是异常下未GC的情况;另一份是项目启动后输出,或GC后输出的比较正常的 heap dump。(推而广之,其他语言,其他工具也是一个道理。)
-
jmap pid
会打印目标虚拟机中加载的每个共享对象起始地址、映射大小以及共享对象文件路径全称;
-
jmap -heap pid
显示 Java 堆详细信息,包括堆配置、内存使用情况;
-
jmap -histo pid
显示堆中对象的统计信息,不触发GC;
-
jmap -histo:live pid
显示堆中对象的统计信息,触发Full GC;
-
jmap -clstats
打印类加载器的信息,版本需大于JDK8;
-
jmap -dump:format=b,file=/dump.phrof pid
生成转储存快照 dump 文件(最为常用)!
jstack(栈分析)
-
jstack -l pid >/var/thread.txt
获取 Thread dump,并输出到 /var/thread.txt 文件
jps(显进程信息)
-
jps
显示Java进程的ID 和 类的名称(快速查看当前进程,有时可以替代 ps -ef|grep xxx )
-
jps -l
显示Java进程的ID 和 主函数的完全限定名
-
jps -v
显示Java进程ID 和 类的名称, 以及传递给JVM的启动参数等
jstat(查看GC相关信息)
-
jstat -class pid
显示加载 class 的数量,以及空间占用等信息;
-
jstat -gc pid
显示GC相关的堆信息,查看GC的次数,及时间;
-
jstat -gcutil pid
详细显示GC相关的堆信息,查看GC的次数,及时间(非常实用);
jstatd(JVM监控)
- 启动 JVM 监控服务。它是一个基于 rmi 的应用,向远程机器提供本机 JVM 应用程序的信息,默认端口1099(注意查看并修改一下内容)。
ok!
jinfo( 动态 JVM 参数控制)
-
jinfo -flag SurvivorRatio pid
查看指定 pid 对应的 JVM 的 SurvivorRatio 参数;
-
jinfo -flag SurvivorRatio=80 pid
动态修改其 SurvivorRatio 参数的值
jhat(分析 heapdump 文件)
-
jhat -J-Xmx2048M heap.phrof
可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言(当然,能拿到 dump 文件,还是推荐拿到本地使用工具来查看,而不是在服务器上直接查看)。
-J 后可以跟 JVM 的参数;
javah(生成c\c++头文件)
-
直接 cd 到当前程序的 target/class 目录下(maven项目,如果是普通项目则到bin目录下)然后使用:javah com.hongwen.HelloWorld
-
其中 javah 后面的是需要生成头文件类的完全限定名(包名+类名),当然生成的 .h 文件位于当前 class 的目录下;
直接使用如下命令:javah -classpath D:\QulityBg\SpringMVCTest\target\classes com.hongwen.HelloWorld
-classpath 后跟绝对路径,该位置只写到 class 路径或者 bin 路径,后面是需要生成头文件类的完全限定名;
javap(反编译 class 文件)
该命令获取到的是 JVM 指令集,使用编译器反编译看到的 .java文件并不是直接使用 javap 获取到的。
-
javap file
反编译 Class,直接输出指令集。
-
javap -l file
会输出行号和本地变量表信息。
-
javap -v file
不仅会输出行号、本地变量表信息、反编译汇编代码,还会输出当前类用到的常量池等信息。
-
javap -c file
会对当前class字节码进行反编译生成汇编代码。 作者:沉默的反补 https://www.bilibili.com/read/cv6295754 出处:bilibili