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

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

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

1. jps

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

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

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

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

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

2. jstat

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

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

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

各参数的含义,依次如下:
Loaded 表示载入了类的数量
Bytes 表示载入类的合计大小
Unloaded 表示卸载类的数量
Bytes 表示卸载类的大小
Time 表示在加载和卸载类上所花的时间

  

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

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

各参数的含义,依次如下:
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,效果如下。

参数含义解释:
LGCC:上次 GC 的原因。
GCC:当前 GC 的原因。

  

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

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 命令的参数也进行大致的梳理。

4. jmap

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

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

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

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

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

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

5. jhat

jhat 命令,用于分析 Java 程序的堆快照内容,并且在分析完成之后,启动一个 HTTP 服务,让我们可以通过浏览器查看 Java 堆快照信息。

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

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

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

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

6. jstack

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

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

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

7. 其它

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

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

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

Java 程序该怎么优化?(命令篇)的更多相关文章

  1. Java 程序该怎么优化?(工具篇)

    程序员:为什么程序总是那么慢?时间都花到哪里去了? 面试官:若你写的 Java 程序,出现了性能问题,该怎么去排查呢? 工欲善其事必先利其器,为你呈上一箩筐性能优化工具,必有一款满足你,废话不多说,直 ...

  2. Java 程序该怎么优化?(实战篇)

    面试官:出现了性能问题,该怎么去排查呢? 程序猿:接口响应那么慢,时间都花到哪里去了? 运维喵:为什么你的应用跑着跑着,CPU 就接近 100%? 分享一些真实生产问题排查故事,看看能否涨姿势,能否 ...

  3. Java 程序该怎么优化?(技巧篇)

    搬砖者:为什么程序总是那么慢?它现在到底在干什么?时间都花到哪里去了? 面试官:简单谈谈 Java 程序性能优化? 1. 字符串处理优化,乃优化之源. 研发过程中,String 的 API 用的应该是 ...

  4. 如何在java程序中调用linux命令或者shell脚本

    转自:http://blog.sina.com.cn/s/blog_6433391301019bpn.html 在java程序中如何调用linux的命令?如何调用shell脚本呢? 这里不得不提到ja ...

  5. 运行java程序的方法-DOS命令和Eclipse方法

    ● 运行java程序的方法(使用DOS命令) 首先进行一个"文件夹选项"的设置: 在D:\Android\java_code目录下新建了一个Hello_World.java文件(不 ...

  6. java程序员的NodeJS初识篇

    摘要 作为一个一直用java来写后端的程序员用NodeJS来写后台,实在不是很爽.这里记下这两个月的NodeJS学习所遇之坑,与java转NodeJS的同仁共勉.学习时间不长,若有理解错误,望指正. ...

  7. java程序猿常用Linux命令

    1.查找文件 find / -name filename.txt 根据名称查找/目录下的filename.txt文件. find . -name "*.xml" 递归查找所有的xm ...

  8. 写一段java程序来执行linux命令

    摘要 在日常开发中,程序员需要经常查询服务器日志来排查问题和调试程序.如果是本地调试还好,但项目一旦发布到服务器上,每次查日志就很麻烦,而且日志量巨大,有时我们无法找到我们需要的信息.经常需要借助第三 ...

  9. 为何我建议1-3年的Java程序员仔细看看这篇文章

    此文的目的是为了督促自己去不断学习,让自己有更明确的方向去提升自己.以技能树为基础,以面试要点为大纲,我觉得比抓住什么看什么要更有目的,更能坚持下去.世界瞬息万变,我们要时刻准备着.时刻提高着自己,才 ...

随机推荐

  1. form表单提交没有跨域问题,但ajax提交存在跨域问题

    浏览器的策略本质是:一个域名下面的JS,没有经过允许是不能读取另外一个域名的内容,但是浏览器不阻止你向另外一个域名发送请求. 所以form表单提交没有跨域问题,提交form表单到另外一个域名,原来页面 ...

  2. golang 交叉编译 win开发 linux生产

    windows平台之下使用 go env 能看到go本身的配置的环境变量,其中红框框起来的变量是交叉编译需要改动的选项, 由于是win平台开发,但是跑起来的程序都是在linux,所以linux转win ...

  3. Flutter json 2 model with Built Value

    Flutter json 2 model with Built Value Flutter中json转换model, 除了手动转之外, 就是利用第三方库做一些代码生成. 流行的库有: json_ser ...

  4. (转)协议森林09 爱的传声筒 (TCP连接)

    协议森林09 爱的传声筒 (TCP连接) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在TCP协议与"流" ...

  5. (转)windows宿主机,ubuntu虚拟机下的上网设置(有线网络和无线网络)

    转自:http://hi.baidu.com/puppywst/item/d9f73734856e2af32684f4e3 虚拟机下ubuntu共享方式上网: 有线网络 在有线网络的条件下,vmwar ...

  6. Java多线程并发04——合理使用线程池

    在此之前,我们已经了解了关于线程的基本知识,今天将为各位带来,线程池这一技术.关注我的公众号「Java面典」了解更多 Java 相关知识点. 为什么使用线程池?线程池做的工作主要是控制运行的线程的数量 ...

  7. 一段很简单的PHP代码,用于手机拨号

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 最大比率传输(Maximum Ratio Transmission, MRT)原理分析

    转载请注明出处. 最大比率发射(Maximum Ratio Transmission, MRT)是文献中经常看见的一个词,今天就在这里做一下笔记. 参考文献为:T. K. Y. Lo, "M ...

  9. P4147 玉蟾宫 题解

    原题链接 简要题意: 求最大 \(0\) 矩阵.(将字符转化为数字) 本题是模板题,可以用来爆踩.??? 悬线法 来了! 其中绿色是 \(0\),红色是 \(1\). 下面以这个图为例讲一下算法流程. ...

  10. LeetCode45——从搜索算法推导到贪心

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode系列的第25篇文章,今天我们一起来看的是LeetCode的第45题,Jump Game II. 有同学后台留言问我说, ...