【深入理解Java虚拟机】第二期分享——性能监控与故障处理
本文的内容主要有:
- JPS:虚拟机进程状况工具
- Jstat:虚拟机统计信息监视工具
- Jstack:Java堆栈跟踪工具
- Jmap:Java内存映像工具
- Jhat:虚拟机堆转储快照分析工具
- jconsole:Java监视与管理控制台
- visualvm:多和一故障处理工具
1 基础知识
如何设置环境变量path
Jps是JVM process status缩写,JDK小工具都参考uninx的命名方式,与PS命令相似可以列出虚拟机进程,并且显示虚拟机主类名称,唯一ID;其他小工具使用前要先得到虚拟机ID,才能监控是哪个虚拟机进程;对于本地虚拟机来说,当然通过启动了多个虚拟机进程,无法根据名称定位时,只能用JPS显示主类才能区分进程。
该代码启动一个线程每3秒打印一次hello,然后下面一直循环;目的是让这个进程一直都在,使用JPS,可以看到14680
这个线程的ID
加-l参数,输出主类的全名,如果进程执行的是Jar包,输出Jar路径
Jstack用于生成当前虚拟机的线程快照,目的是找出线程长时间停顿原因,比如线程死锁,死循环,请求web资源导致长时间等待;JStack能查看该线程的调用堆栈,没有响应线程,在后台到底做什么。还是上面代码,用jstack 14680
查看该线程堆栈。
该线程已经一直等待最后停掉
jstat是虚拟机统计信息监视工具
参数interval count分别代表间隔多少次,多少秒,如果省略这两个参数说明只查询一次。我们假设250ms,查询一次进程的垃圾收集情况,一共查了20次,就是如下命令:
jstat -gc pid 250ms 20
我们来看下代码,每次执行生成一个对象,共20次,间隔是50ms,最后执行一次GC意思是用下命令
结果如下
现在我们每隔20ms打印3次,如下所示
Jmap我们来看下内存映像工具,用于生成堆与转储快照,Jmap不仅仅是得到dump文件,还能查询堆以及永久代也就是方法区的详细信息,比如空间使用率,用的是那种收集器,除了demp文件能在windows下生成,其他命令需要在linux内使用
生成demp文件在项目依赖下已经生成,结果如下所示
Jhat是虚拟机堆转储快照分析工具,与Jmap搭配使用分析堆转储的快照,Jhat内置微型的HTTP服务器,生成DEMP文件可以在浏览器下查看,在实际工作如果实在没有其他工具才用Jhat工具分析demp文件,因为Jhat工具分析就比较简陋,
测试下,在服务器启动7000端口,如下所示
jconsole是Java监视与管理控制台,它是基于JMX的可视化管理平台
还有内存监控相当于Jstat命令,用于监视收集器管理虚拟机内存以及呈现变化趋势,程序运行后可以看到Edend内存区域变化趋势,如下;
我们再换一个例子,这个代码启动了两个线程,一个是死循环线程,一个是加锁线程,先启动后连接 结果如下:
可以在下方看到很多线程,比如main线程,我们在终端输入1启动一个死循环线程,这个时候在下方可以看到线程列表,有一个testBustThread是Runable也就是在执行,我们再输入1启动死锁线程,这个时候testlock已经启动,但是它一直在等待锁的数据。
我们再来看死锁例子,线程A,B进行加锁,但是顺序不一致导致死锁
看到线程这边线程199,83,46互相死锁,199是在等待83的锁,46也是等待83的锁,但是84在等待46所以83与46相互形成死循环造成死锁
visualvm是多合一故障处理工具,直接点击jvisualvm.exe启动,这个只能在windows使用,这个可以安装很多插件,有些功能甚至比商业软件要好,而且它对程序性能影响很小,使得直接用在生产环境,我们还是看个例子
系统属性,JVM参数,还有监视,CPU使用,这边是堆的使用,还有些线程信息,还有就是类的信息
- 点赞
- 收藏
- 关注作者
评论(0)