Java 程序该怎么优化?JDK命令篇

灵魂拷问,JDK 提供的命令,除了 java、javac,你还用过哪些命令呢?

灵魂再拷问,若你写的 Java 程序,出现了性能问题,该怎么去排查呢?

Java 作为编程语言中的战斗机,JDK 默认已经为我们提供了很多排查问题的工具,接下来就逐一认识认识。



1.



jps

jps 命令,可以列出系统中所有运行 Java 进程,并可以查看 Java 进程的启动类、传入参数以及 JVM 参数等信息。

例如,在控制台输入 jps -lmv 命令,效果如下(截取部分内容)。

很显然,jps 背后是一个 Java 程序,列出了完整的类路径、传给 main 方法的参数,以及 JVM 的参数。

为了方便了解、查阅,对 jps 命令的参数进行大致的梳理。

Java 程序该怎么优化?JDK命令篇

另外,不要大惊小怪,jps 以及下面要提到的 JDK 的排查工具,本质都是 Java 程序。



2.



 jstat

jstat 命令,用于查看 Java 进程的堆使用情况以及 GC 情况。

例如,输出 Java 进程 90961 的类加载相关信息,每秒钟统计一次信息,一共输出 3 次。

控制台输入命令:jstat -class 90961 1000 3,效果如下。

Java 程序该怎么优化?JDK命令篇

各参数的含义,依次如下:

Loaded 表示载入了类的数量

Bytes 表示载入类的合计大小

Unloaded 表示卸载类的数量

Bytes 表示卸载类的大小

Time 表示在加载和卸载类上所花的时间

例如,显示 GC 相关的堆信息。

控制台输入命令:jstat -gc 90961,效果如下。

Java 程序该怎么优化?JDK命令篇

各参数的含义,依次如下:

S0C:s0(from)的大小,单位 KB。

S1C:s1(from)的大小,单位 KB。

S0U:s0(from)已使用的空间,单位 KB。

S1U:s1(from)已使用的空间,单位 KB。

EC:eden 区的大小,单位 KB。

EU:eden 区的使用空间,单位 KB。

OC:老年代大小,单位 KB。

OU:老年代已经使用的空间,单位 KB。

PC:永久区大小,单位 KB。

PU:永久区使用空间,单位 KB。

YGC:新生代 GC 次数。

YGCT:新生代 GC 耗时。

FGC:Full GC 次数。

FGCT:Full GC 耗时。

GCT:GC 总耗时。

例如,显示最近一次 GC 的原因及当前 GC 的原因。

控制台输入命令:jstat -gccause 90961,效果如下。

Java 程序该怎么优化?JDK命令篇

参数含义解释:

LGCC:上次 GC 的原因。

GCC:当前 GC 的原因。

另外,为了方便了解、查阅,对 jstat 命令的参数进行大致的梳理。

Java 程序该怎么优化?JDK命令篇



3.



 jinfo

jinfo 命令,可以帮我们查看正在运行的 Java 进程的扩展参数,并支持在运行时修改部分参数;可以很方便地帮我们找到 JVM 参数的当前值。

例如,查看 Java 进
程 90961
是否开启打印 GC 详细信息。

命令:jinfo -flag PrintGCDetails  90961

例如,打开 Java 进程 90961 的 PrintGCDetails 开关。

命令:jinfo -flag
+
PrintGCDetails 90961

例如,关闭 Java 进程 90961 的 PrintGCDetails 开关。

命令:
jinfo -flag
-
PrintGCDetails 90961

使用比较简单,就不贴效果啦。

另外,为了方便了解、查阅,对 jinfo 命令的参数也进行大致的梳理。

Java 程序该怎么优化?JDK命令篇



4. 



jmap

jmap 命令,可以帮我们生成 Java 进程的堆快照和对象的统计信息。

例如,生成 PID 为 90961 的 Java 进程的对象统计信息,并输出到 yyxj.txt 文件中。

控制台输入命令:jmap -histo 90961 > yyxj.txt,打开文件效果如下。

Java 程序该怎么优化?JDK命令篇

例如,生成 PID 为 90961 的 Java 进程的当前堆快照,输出到 heap.hprof 文件中。

命令:jmap -dump:format=b,file=heap.hprof 90961

对于输出的 heap.hprof 快照文件,可以使用 jhat、VisualVM 等工具打开查看。采用 VisualVM 工具查看,效果如下。

Java 程序该怎么优化?JDK命令篇



5. 



jhat

jhat 命令,

用于分析 Java 程序的堆快照内容,并且
分析完成之后,

启动一个 HTTP 服务,让我们可以通过浏览器查看 Java 堆快照信息。

例如,采用 jhat 分析上一步中 jmap 输出的堆快照文件。

输入命令:
jhat  heap.hprof,效果如下。

Java 程序该怎么优化?JDK命令篇

浏览器访问 http://127.0.0.1:7000,一探究竟。

Java 程序该怎么优化?JDK命令篇

另外,唯恐堆快照会比较大,jhat 还支持 OQL 语句查询堆快照信息,闲暇之余可参考帮助手册 http://127.0.0.1:7000/oqlhelp/ 进行深入了解。



6.



 jstack

jstack 命令,可以帮助我们导出 Java 程序的线程堆栈,并自动帮我们进行死检查,并输出找到的死锁信息。

例如,把 PID 为 92760 的 Java 进程的线程堆栈信息,输出保存到文件中。


命令

:jstack -l 92760 > deadlock.txt
,打开 
deadlock.txt,进程的内部细节,一览无余,那么我们
很容易,就能找到死锁。

Java 程序该怎么优化?JDK命令篇

Java 程序该怎么优化?JDK命令篇



7.



 其它

本次提到的这些命令,建议有时间实操一遍,因为 纸上得来终觉浅,绝知此事要躬行

JDK 提供的排查问题的
命令还有很多,时间关系,本次就不再一一列举。

后续会
进行实战
分析,看看如何把这些命令组合起来,去打一套好的组合拳出来,

请期待。

Java 程序该怎么优化?JDK命令篇

推荐阅读:

Java 程序该怎么优化?技巧篇

程序员写出这样的代码,能不挨骂吗?

原文 

http://mp.weixin.qq.com/s?__biz=MzU2MDg5NzYzNA==&mid=2247485097&idx=1&sn=21e27d9aa091653e1927a5768d736e40

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Java 程序该怎么优化?JDK命令篇

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址