JVM优化一共有两个方面
1. 了解JVM的小工具
我讲的JVM工具都不是第三方的,是JAVA Development Kit自带的工具,是bin目录下的好多东西,bin目录
大部分都是可执行文件,其实对于这些可执行文件,比如javac.exe编译器我们用过,还有java.exe,java.exe是
我们的虚拟机,javadoc.exe根据你的注释生成API位文档,native2ascii.exe做unicode编码转换的.
我们今天先来讲一下jps.exe,这是JDK自带的一个对JVM性能检测,JVM辅助的小工具,JPS是最简单可用的小工具,
有点类似于linux中的ps命令,还记得ps命令吗,ps就是process show,jsp就是干这种事的.
比如在命令行敲 jps -l,记得这个命令要在bin目录敲,也就是先切换到bin目录
也可以输入:jps -v
看到的信息都不太一样,jps -l 是虚拟机的线程和线程ID,jps -v是显示虚拟机的ID以外还显示它的一些配置信
息,JPS是仅对虚拟机的线程,比如现在我要启动一个虚拟机,比如TOMCAT,我们先启动一个TOMCAT
我们这个时候再看一下 jps -l命令会看到多了一个8012的线程,就是我们tomcat的线程,所以jps就是查
虚拟机里面的线程的,拿到这些线程的ID我们能干嘛呢, jstat 是用来查看HotSpot VM运行信息,包含了类加载,
内存,GC[可分代查看],JIT编译命令格式:jstat -gc 10340 250 20,这个命令到底要做什么事,取决于命令所
给定的参数,它的参数有好多,感兴趣的可以自己上网查一下,我并没有把所有的参数都罗列出来,我只罗列了一个
-gc,查看GC的信息,我要用jstat去查看HotSpot的GC的信息,它的命令格式是怎么样的呢,命令jstat+gc+
pid10340+250(多少毫秒里)+20(输出多少次),这个小工具要依赖jps,现在我们看一下我们已经启动的tomcat的
pid是8012,那么我们就可以执行命令: jstat -gc 8012 250 20
S0C 就是Survivor中的s0的空间,20736字节,不是KB,1KB是1024个字节,其实对于s0和s1来讲空间不会太大.
S1C是s1的空间,这里的S1C是23552,所以其实s0和s1其实并不是相等的,其实20736也并不一定是百分百准确的
一个数,这里只是一个大概数据的一个输出,这里S0C的C是Create创建的意思,S0C是S0创建的大小.
S0U是指S0被use了多了就是被用了多少,也就是在20736里面用了15641个字节,然后S1U0就是就是s1用了0,就是
没有可回收了,也可能是放在老年代里去了,EC就是Eden Create,Eden明显比s0和s1要大,这里的Eden大小是
136192快1M了,EU是Eden已经用了的,OC是 old create 老年代的大小, OU old used 老年代用了多少,
PC是 Permanent Create 是持久代创建的, PU 是 Permanent Use 持久代所用掉空间的大小.
YGC 是 young garbage collection 是次收集器的大小, YGCT 是 young garbage collection time
是次收集器的次数,年轻代就是次收集器, YGCT是所花费的时间,这里是用了多少秒, FGC 是 Full Garbage
Collection 回收了1次, FGCT是 Full Garbage Collection Time, GCT是 Garbage Time 是次收集器和全
收集器所耗费的总时间,这里是通过JSTAT这个小工具来看当前虚拟机对于GC信息的输出.
我们接下来要介绍JVisualVM,这是一个非常强大的工具,他把上面这些个工具,我们上面用了一个JSTAT,jstat的
信息全部是在控制台输出的,jvisionvm他是做了一个图形化界面,基于图形化界面来展示JVM的信息
主机运行在localhost,主类org.apache.catalina.startup.Bootstrap启动类,然后参数start,TOMCAT的启动
有几种方式,一种start双击启动,还有一种是catalina start,其实我们双击start最终也会走catalina
也就是说你的TOMCAT要启动必须给一个参数叫start, start才能启动,Bootstrap就是完成TOMCAT启动的主类
并且给主类传了一个参数叫start,它会把这个信息给你展示出来,然后介绍JVM什么版本的,然后供应商是谁,
然后JRE的目录,然后JVM运行时的哪些参数,JVM在运行的时候我们可以给定一些参数,设置堆区大小,指定垃圾
回收器,对于启动有两种情况,第一种方式我们自己去run虚拟机,还有一种依赖于其他程序来启动虚拟机,TOMCAT
就是这样的,在TOMCAT的配置文件当中,就会去找虚拟机把它启动起来,同时给操作系统配置一些启动项,他这里
所显示的JVM参数,如果自己启动run的是显示具体的值,给不是给一些目录去读取,而TOMCAT是去读TOMCAT的一些
参数配置
这里我们还可以监视CPU和堆内存的使用
代码不严谨导致内存溢出,程序运行一段时间死掉了,看堆里的曲线图,正常的曲线是上下上下有占用就有释放,
我们现在启动了TOMCAT,我们启动了但是什么都没有做,所以现在图片里的堆曲线是比较平稳的,我们现在访问一下
堆里面就会有变,加入我们现在请求了一个JSP,做了编译动作,堆曲线图就会有变化,往上走说明是开空间了,往下
走就是放空间了,所以最终这个图是曲线结构的,所以我们可以通过这个监测虚拟机堆的开辟和释放的情况,
然后我们可以看到线程
在多线程项目下,我们可以看到哪些线程占用空间比较大,哪些线程有什么问题,也是可以监控到的,我们现在
先不考虑他了,因为这也是一个很复杂的事,因为你要去分析线程,然后还有一个抽样器
抽样器可以看CPU运行的情况,看内存运行的情况,比如什么内存占用的比较多,每个类对内存的占用是多少,
就是一个更详细的展示了
这些都不是最重要的,但是这里要介绍一个插件,Visual VM是这样的,觉得你默认的工具不能满足你的时候,
允许你去扩展你的插件,所以今天要教你一个插件,这个插件叫Visual GC,专门监控垃圾回收的一个插件
在菜单栏里有一个工具,在插件里面有可用插件,已下载,已安装插件,
现在我们从来没有安装过插件,所以我们要装新的插件,可以在可用插件里检查新版本,但是这里又个问题,
看设置这里,设置这里有个URL,它就会从这个URL里查找插件,接着我们点击检查更新版本
他会弹一个框,也就是连不上,这是什么原因引起的呢,现在这个URL为net的域名的网站已经被关闭了,也就是说
现在这个URL已经不可用的了,原来的插件已经移植到哪里去了呢,已经移植到了Github上了,所以你可以去修改
GitHub的地址,那地址是什么呢
把这个地址放在这里,有的时候你也连不上,但是你用浏览器你是可以打开的,你可以访问GitHub的首页去下载
这里所有的工具其实也是非常小,10几KB,大一点的100多KB,那这么小的文件就能做出这么大的应用吗,答案不是
的,这里所有的.exe,其实这里只是存放了一些运行工具的起始命令,比如我们所有的测试工具,性能检测工具,比如
jps.exe只是存放了启动jps代码的一个启动项,但是真正的代码在tools.jar文件下,我们有一个jar包,有一个
tools.jar,哪些工具的执行代码全都在这里呢,最后其实还是执行我们写好的JDK里的代码,如果在线安装不上
就利用我们下载好的文件
在已下载下添加插件,去找已下好的文件,要选中nbm的文件
导进来之后点击安装
装完以后必须要重启这个工具,重启之后才能用这个插件,TOMCAT没关,但是TOMCAT控制台会提示连接我的
工具已经断开了,Ctrl+c关闭进程,如果直接关闭命令窗口只是把窗口关了,然后载入进来右边就多了一个东西
然后打开Visual GC
除了图形以外,还有编译时间compile time, tomcat每次工作所耗的时间,下面还有class loader time
每次载入所用时间,通过它你可以看到这样的一个过程,我们可以通过它的一些监控,可以进行一些小的优化,
比如你想要提升TOMCAT的编译环境,你可以加一些参数,你想扩大空间,你也可以加一些参数,在启动JVM的时候,
加一些参数来完成,一会我们会利用这个小工具来做一些案例,去尝试的优化一下我们的Eclipse,这个工具还挺有
用的,除此之外它还有哪些能力呢,可以看线程的Dump文件,可以看堆的线程文件
显示线程的信息,这里=是线程栈的信息,其实我们出异常也是栈的信息,只是所输出描述的信息是不一样的,
然后他还可以拍快照保持某一节点的配置信息,首先得生成快照