点击上方好好学java,选择星标公众号
重磅资讯、干货,第一时间送达今日推荐:打卡活动第二期来啦,100% 能获得奖品个人原创+1博客:点击前往,查看更多
虚拟机系列文章
深入理解 Java 虚拟机(第一弹) - Java 内存区域透彻分析
深入理解 Java 虚拟机(第二弹) - 常用 vm 参数分析
深入理解 Java 虚拟机-如何利用 VisualVM 对高并发项目进行性能分析
在前面的几篇文章已经讲解了利用一些可视化的工具进行 JVM 性能的监控,但是,在服务器上,我们很多时候是没有办法使用可视化的界面进行这种工作的,这种情景就相当于你需要远程的 linux 系统一样,我们没有其他的办法,只有一种办法就是利用命令行进行操控,而当我们将我们的项目部署到远程的服务器上的时候,我们是没有办法利用可视化的工具对 JVM 进行有效的监控的,这个时候 JDK 的自带的工具就是发挥发的作用的时候了。
以下的这些命令如果放在可视化的工具都是可以被替代的,如果在开发或者测试的过程中,遇到需要监控 JVM 的情况,可以查看这篇文章进行阅读如何利用可视化工具进行 JVM 调优:深入理解Java虚拟机-如何利用VisualVM对高并发项目进行性能分析。
接下来就对每一个常用的命令行工具做一番讲解。
首先,先列出有哪些JDK命令行工具。
1 jps:虚拟机进程状况工具
这个工具使用的频率还是非常高的,因为你需要查看你的程序的运行情况的时候,首先需要知道的就是程序所运行的进程本地虚拟机唯一ID(LVMID),知道这个ID之后,才可以进行其他监控的操作。
命令格式:
1jps[选项][主机id]
jps主要选项:
实例
1jps-l2jps-v
2 jinfo:Java配置信息工具
jinfo的功能很简单,主要就是显示和查看调整虚拟机的各种参数。
jinfo命令格式:
1jinfo[选项]pid
相关选项
实例
我们在启动程序的时候设置一些JVM参数:-Xms512m -Xmx512m -Xmn128m -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15
。
我们先使用jps -l
查看虚拟机进程ID;
再使用pid为1584进行查询参数;
3 jmap:Java内存映射工具
jmap的主要功能就是生成堆转存储快照,之后,我们再利用这个快照文件进行分析。
jmap命令格式:
1jmap[选项]vmid
相关选项
实例
首先还是查看虚拟机ID;
然后再运行下面命令行;
打开这个dump文件如下;
ok,现在已经有了生成的dump文件,所以,我们就需要对这个文件进行解析,看看jhat命令。
4 jhat:虚拟机堆转存储快照分析工具
虽然好像这个命令挺牛逼,但是,其实,由于这个工具的功能不太够,分析也得不到太多的结果,所以我们一般可以会将得到的dump文件用其他的工具进行分析,比如,可视化工具VisualVM等等。
所以,这里简单的做一个例子。
实例
1jhatD:\dump.bin
如果有兴趣查看如何利用VisualVM进行查看,可以查看这篇文章:深入理解Java虚拟机-如何利用VisualVM对高并发项目进行性能分析。
5 jstack:Java堆栈跟踪工具
jstack
命令主要用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的:定位线程出现长时间停顿的原因、请求外部资源导致的长时间等待等这些原因。
jstack命令格式:
1jstack[选项]vmid
相关选项
实例
1jstack-l6708
6 jstat:虚拟机统计信息监视工具
jstat这个工具还是很有作用的,他可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在服务器上,他是运行期定位虚拟机性能问题的首选工具。
jstat命令格式:
1jstat[选项vmid[interval[s|ms][count]]]
相关选项
实例
我们这里还关注一下虚拟机GC的状况。
1jstat-gcutil9676
上面参数的含义:
S0:第一个Survivor区的空间使用(%)大小
S1:第二个Survivor区的空间使用(%)大小
E:Eden区的空间使用(%)大小
O:老年代空间使用(%)大小
M:方法区空间使用(%)大小
CCS:压缩类空间使用(%)大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
了解了这些参数的意义之后,我们就可以对虚拟机GC状况进行分析。我们发现年轻代回收次数12
次,使用时间1.672
s,老年代回收0
次,使用时间0
s,所有GC总耗时1.672
s。
通过以上参数分析,发现老年代Full GC没有,说明没有大对象进入到老年代,整个老年代的GC情况还是不错的。另外,年轻代回收次数12
次,使用时间1.672
s,每次用时100ms左右,这个时间稍微长了一点,可以将新生代的空间调低一点,以降低每一次的GC时间。
7 总结
这篇文章主要就讲解了虚拟机命令行工具的使用方法,学会这些命令行工具的使用,可以帮助我们更好的分析虚拟机的运行情况,也可以帮助我们分析问题。
更多Java技术文章,尽在【好好学java】网站。网址:搜索好好学java或阅读原文可达!