JVM性能监测

JVM关键参数剖析

什么叫守护线程?
守护进程是来保护非守护线程
非守护进程是来干活的,守护进程是监工, 为了避免非守护进程被GC误回收
守护进程大多数是程序自动生成,当然也可能由程序员写,一般很少这种情况
内存回收机制 如果不是守护进程,可能被内存回收机制处理掉.要安排一个守护进程,线程来检查时,拦住线程回收

堆,用户可以控制,栈用户没发控制
回收的都是堆内存, 堆只是存储对象数据等, 而栈是核心,不会被用户改变
堆的内存大小可以调节,栈的内存大小不可以调节

新生代和老年代都会被分配内存

JVM是监控内存回收的,不是监控内存的

JVisual可以监控GC回收机制
什么是GC?


回收不是一次性回收,而是分代回收
老年代 Tenured 去老年代,就不总是被GC监测
新生代 eden +S0+S1 生成区(S0+S1)
老年代的内存回收频率是远远低于新生代的,新生代频繁被回收
Visual GC分为三部分:Spaces、graphs、histogram
Spaces区域:代表虚拟机内存分布情况。从图中可以看出,虚拟机被分为Metaspace、 Old、Eden、S0、S1
1)Metaspace:元空间内存,可叫做方法区或者非堆
2)Old:老年代内存
3)年轻代中Eden(伊甸园)区、和两个Survivor区(S0、S1)内存
Graphs区域:内存使用详细介绍
Compile Time:编译时间,5929 compiles表示编译总数,7.707s表示编译累计时间。一个脉冲表示一次JIT编译,窄脉冲表示持续时间短,宽脉冲表示持续时间长。
Class Loader Time:类加载时间,6305 loaded表示加载类数量,0 unloaded表示卸载的类数量,44.562ms表示类加载花费的时间
GC Time:垃圾回收时间,17 collections表示垃圾收集的总次数,238.447ms表示垃圾收集花费的时间,Last Cause表示最近垃圾收集的原因
Eden Space:Eden区,括号内的84.000M表示最大容量,43.000M表示当前容量,括号后面的13.907M表示当前使用情况,14 collections表示垃圾收集次数,44.562ms表示垃圾收集花费时间
Survivor 0:S0区,括号内的28.000M表示最大容量,18.500M表示当前容量,括号后面的8.877M表示当前使用情况
Survivor 1:S1区,括号内的28.000M表示最大容量,20.000M表示当前容量,括号后面的0表示当前使用情况
Old Gen:老年代,括号内的171.000M表示最大容量,72.000M表示当前容量,括号后面的32.274M表示当前使用情况,3 collections表示垃圾收集次数,193.885ms表示垃圾收集花费时间
Metaspace:元空间,括号内的1.029G表示最大容量,40.539M表示当前容量,括号后面的37.877M表示当前使用情况
Histogram区域:survivor区域参数跟年龄柱状图3.1)Tenuring Threshold:表示新生代年龄大于当前值则进入老年代


newratio=9表示新生代和老年代比例是1:9

年老代的GC回收较慢


小结:
当进程空闲时,会被GC回收机制回收
如果这个进程没有守护进程,会直接被回收掉,如果eden区域满了,会触发MInor GC机制,会将对象全部移动到S1和S0去
如果这个进程由守护进程,会被保护起来,继续干活.当GC
回收机制再去检测这个进程看其是否空闲,如果还是干活,反复几次,当对象经历的GC次数大于某个值后,会被认为是一个有较长生命周期的对象.从而移动到老年代.
JVM性能指标监控
下载地址:

配置:
E:\性能\模块2:电商项目性能测试实战\第6次课(JVMGC监控技术+JVMGC项目实战)\预习\visualvm_205\etc
visualvm.conf 在第72行左右填上jdk的地址
visualvm_jdkhome="C:\Program Files\Java\jdk-11"
jdk1.8之前的版本自带,不需要下载


监控GC回收:
visualvm可以监控到所有的java程序,无论是本地还是远程的
jmx方式连接服务器,这种方式连接时,没有GC
复制catalina-jmx-remote.jar,到都市商城服务器的/usr/local/tomcat7-8083/lib
vi catalina.sh.加入以下代码
-Djava.rmi.server.hostname=192.168.80.160
-Dcom.sun.management.jmxremote.port=10001
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
第一句表示填写你的ip地址
第二句表示jmx方式的端口号
第三句表示不适用ssl连接
第四句表示不进行用户验证
之后重启tomcat,就可以连上了
如果不能连接,大多数情况是防火墙拒访问,此时可以关闭防火墙,或者将10001端口添加到白名单
关闭防火墙:
systemctl stop firewall
service firewalld status
添加10001到防火墙的白名单:
firewall -cmd --add-port =10001/tcp --permanent

可用内存
jstatd的连接方式
复制java.policy文件到/usr/local/jdk1.7.0_80/jre/lib/security
找到java.policy,添加或者替换这个文件
vi j-start-jstatd.sh
./jstatd -J-Djava.security.policy=jstatd.all.policy -p 10003 -J-Djava.rmi.server.hostname=192.168.150.137 -J-Djava.rmi.server.logCalls=true
hostname填写自己的虚拟机ip
之后./j-start-jstatd.sh
如果以上配置完成之后,visualvm无法连接jstatd,那么需要修改hosts文件
vi /etc/hosts,将第一行的127.0.0.1替换成虚拟机ip
一般性能正常服务器,GC回收新生代次数10几分钟一次,老年代1天一次左右 元空间(perm或者metadata)放一些函数和静态数据
还可以发现线程死锁的位置
模拟线程死锁
什么是线程死锁
线程死锁描述的是这样一种情况:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
/usr/local/web/WebRoot/WEB-INF/classes
vi config.properties
重启tomcat

一、java jvisualvm介绍
1、jvisualvm用途
VisualVM,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的).
监控内存泄露,跟踪垃圾回收,执行时内存、cpu分析,线程分析...
内存信息
线程信息
Dump堆(本地进程)
Dump线程(本地进程)
打开堆Dump。堆Dump可以用jmap来生成。
打开线程Dump
生成应用快照(包含内存信息、线程信息等等)
性能分析。 :idea: CPU分析(各个方法调用时间,检查哪些方法耗时多),内存分析(各类对象占用的内存,检查哪些类占用内存多)
2、jvisualvm安装
jvisualvm已经被集成在jdk1.6以上的版本中,正常安装完jdk后,至jdk的bin目录下,运行jvisualvm.exe即可

二、Visual GC插件下载与安装
第一种方式:

第二种方式:
1、Visual GC插件下载
1)访问visualvm插件中心
https://visualvm.github.io/pluginscenters.html
2)选择对应的JDK版本和插件进行下载
例:本次使用的JDK版本是1.8.0_101,下载的插件是Visual GC
步骤1:进入对应的JDK版本插件地址

步骤2:在对应的JDK版本链接下找到对应的插件Visual GC

下载的文件如下:

2、Visual GC插件安装
1)启动VisualVM
启动路径 D:\Program Files\Java\jdk1.8.0_101\bin\jvisualvm.exe
2)安装Visual GC
VisualVM界面,工具》插件》已下载》添加插件,选择已下载的插件,然后点击安装,直到安装完成。

3)重启VisualVM
重启后在监控页面中就可以看到Visual GC界面

三、远程监控中间件tomcat
1、本机安装JDK
2、服务器tomcat修改参数重启
监控服务器上的tomcat
tomcat的配置文件catalina.sh中增加(与jconsole配置一样):
JAVA_OPTS="-Djava.rmi.server.hostname=192.168.58.164
-Dcom.sun.management.jmxremote.port=9998
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"
参数说明:
指定了JMX启动的代理端口,这个端口就是visualvm要连接的端口(9998端口不能被别的程序使用netstat -an|gerp 9998)
Dcom.sun.management.jmxremote.port=9998
指定了JMX是否启用ssl
Dcom.sun.management.jmxremote.authenticate=false
指定了JMX是否启用鉴权(需要用户名,密码鉴权)
Dcom.sun.management.jmxremote.authenticate=false
指定了服务器主机名
Djava.rmi.server.hostname=192.168.58.164
浙公网安备 33010602011771号