前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java性能调优-JDK命令行

Java性能调优-JDK命令行

作者头像
JavaEdge
发布2020-05-27 09:43:02
6420
发布2020-05-27 09:43:02
举报
文章被收录于专栏:JavaEdgeJavaEdge

1.1 jps

类似Linux的ps,但是jps只用于列出Java的进程 可以方便查看Java进程的启动类,传入参数和JVM参数等 直接运行,不加参数,列出Java程序的进程ID以及Main函数等名称

jps命令本质也是Java程序
jps命令本质也是Java程序
-m 输出传递给Java进程的参数
-m 输出传递给Java进程的参数
-l 输出主函数的完整路径
-l 输出主函数的完整路径
-q 只输出进程ID
-q 只输出进程ID
-v 显示传递给jvm的参数
-v 显示传递给jvm的参数

1.2 jstat

用于观察Java应用程序运行时信息的工具,详细查看堆使用情况以及GC情况

jstat -options
jstat -options

1.2.1 jstat -class pid

显示加载class的数量及所占空间等信息

-compiler -t:显示JIT编译的信息
-compiler -t:显示JIT编译的信息

1.2.2 -gc pid

可以显示gc的信息,查看gc的次数及时间

1.2.3 -gccapacity

比-gc多了各个代的最大值和最小值

jstat -gccapacity 3661
jstat -gccapacity 3661

-gccause

最近一次GC统计和原因

  • LGCC:上次GC原因
  • GCC:当前GC原因
 -gcnew pid:new对象的信息。
-gcnew pid:new对象的信息。

jstat -gcnewcapacity pid:new对象的信息及其占用量

-gcold 显示老年代和永久代信息
-gcold 显示老年代和永久代信息
-gcoldcapacity展现老年代的容量信息
-gcoldcapacity展现老年代的容量信息

-gcutil

显示GC回收相关信息

-printcompilation

当前VM执行的信息

jstat -printcompilation 3661
jstat -printcompilation 3661

还可以同时加两个数

输出进程4798的ClassLoader信息,每1秒统计一次,共输出2次
输出进程4798的ClassLoader信息,每1秒统计一次,共输出2次

1.3 jinfo

jinfo <option> <pid> 查看正在运行的Java程序的扩展参数,甚至在运行时修改部分参数

查看运行时参数

jinfo -flag MaxTenuringThreshold 31518
-XX:MaxTenuringThreshold=15

在运行时修改参数值

> jinfo -flag PrintGCDetails 31518
-XX:-PrintGCDetails

> jinfo -flag +PrintGCDetails 31518

> jinfo -flag PrintGCDetails 31518

-XX:+PrintGCDetails

1.4 jmap

生成堆快照和对象的统计信息

-histo 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
-histo 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
-dump:[live,]format=b,file= 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.
-dump:[live,]format=b,file= 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.

获得堆快照文件之后,我们可以使用多种工具对文件进行分析,例如jhat,visual vm等。

1.5 jhat

分析Java应用程序的堆快照文件,以前面生成的为例

jhat heap.hprof
jhat heap.hprof

jhat在分析完成之后,使用HTTP服务器展示其分析结果,在浏览器中访问http://127.0.0.1:7000/即可得到分析结果。

1.6b jstack

导出Java应用程序的线程堆栈 jstack -l <pid>

jstack可以检测死锁,下例通过一个简单例子演示jstack检测死锁的功能。java代码如下:

使用jps命令查看进程号为11468,然后使用jstack -l 11468 > a.txt命令把堆栈信息打印到文件中
使用jps命令查看进程号为11468,然后使用jstack -l 11468 > a.txt命令把堆栈信息打印到文件中

从这个输出可以知道: 1、在输出的最后一段,有明确的"Found one Java-level deadlock"输出,所以通过jstack命令我们可以检测死锁 2、输出中包含了所有线程,除了我们的north,sorth线程外,还有"Attach Listener", “C2 CompilerThread0”, "C2 CompilerThread1"等等; 3、每个线程下面都会输出当前状态,以及这个线程当前持有锁以及等待锁,当持有与等待造成循环等待时,将导致死锁

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.1 jps
  • 1.2 jstat
    • 1.2.1 jstat -class pid
      • 1.2.2 -gc pid
        • 1.2.3 -gccapacity
          • -gccause
            • jstat -gcnewcapacity pid:new对象的信息及其占用量
              • -gcutil
                • -printcompilation
                  • 还可以同时加两个数
                  • 1.3 jinfo
                  • 查看运行时参数
                  • 在运行时修改参数值
                  • 1.4 jmap
                  • 1.5 jhat
                  • 1.6b jstack
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档