2.5 JVM性能监控
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。在JDK1.7之前JVM存在年轻代(Young Generation)、年老代(Old Generationn)和持久代(Permanent Generation)。
1. 年轻代与年老代中没有被回收的数据块存储
年轻代包括Eden区和Survivor区。Eden区有一个存储单元,Survivor区有两个存储单元:S0U和S1U,为了描述方便,假设Eden区做多可以存储三个数据块,Survivor区做多可以存储四个数据块。年老代也只有一个区,最多可存储四个数据块。下面来看一下年轻代与年老代中没有被回收的数据块存储。
图3-37 年轻代与年老代中没有被回收的数据块存储
(1)新来数据块a1、a2,进入年轻代的Eden区。见图3-37(1)所示。
(2)数据块a3 产生,进入Eden区,Eden区满了,把a1、a2、a3移入S0U。见图3-37(2)所示。
(3)Eden区的指针指向S0U。数据块a2、a3被回收,留下了数据块a1,Eden区进入了数据块b1、b2。见图3-37(3)所示。
(4)数据块b3 产生,进入Eden区,Eden区满了,把b1、b2、b3移入S0U。见图3-37(4)所示。
(5)Survivor区第一个存储单元满了,把a1、b1、b2、b3从S0U单元移入S1U。见图3-37(5)所示。
(6)Eden区的指针指向S1U。数据块c1、c2产生,进入Eden区, S1U中b3被回收,剩下a1、b1、b2。见图3-37(6)所示。
(7)Eden区产生数据块c3,Eden区满了,这时候由于S1U的a1被回收,而b1、b2没有被回收,所以这时候只能把Eden区的c1、c2从Eden区移入S1U。见图3-37(7)所示。
(8)S1U中存在b1、b2、c1、c2,这时候Survivor区的S1U,但是由于b1、b2是从S1U中过来的,而c1、c2是从Eden区过来的,所以只能把数据块b1、b2从S1U移入到年老代。见图3-37(8)所示。
(9)这个时候再把Eden区的数据块c3从Eden区移入S1U。见图3-37(9)所示。
(10)Eden区产生数据块d1、d3、d3,Eden区满了,而S1U仅存在了数据块c3,把Eden区的d1、d3、d3移入Survivor区的第二个存储单元。见图3-37(10)所示。
(11)由于当前S1U中的数据块c3、d1、d3、d3都是从Eden区过来的,这个时候S1U已经满了,所以要把数据块c3、d1、d3、d3从S1U移到S0U。见图3-37(11)所示。
(12)Eden区的指针返回指向S0U。Eden区产生了新的数据块e1、e2。S0U中的d1、d3被回收,剩下c3、d2。见图3-37(12)所示。
(13)Eden区产生数据块e3,Eden区满了,这时候S0U中存在数据块c3、d2,所以只能把Eden区的e1、e2先移入到S0U中。见图3-37(13)所示。
(14)S0U中目前存在数据块c3、d2、e1、e2,由于c3、d2是从S1U中过来的,而e1、e2是从Eden区过来的,所以只能把c3、d2从S0U中移入到老年代。见图3-36(14)所示。
(15)接下来再把Eden区产生数据块e3移入到S0U。见图3-37(15)所示。
(16)按照这种规律进行下去。
(17)这个时候,Eden区有数据块g1、g2,S1U有数据块e1、e2、 f1、f2,年老代中存在数据块b1、b2、c1、d2。见图3-37(17)所示。
(18)S1U与年老代中存在数据块都满,把年老代中得数据块丢弃,把S1U中的e1、e2移入年老代。见图3-37(18)所示。按照这个规律进行下去。
由此看见。
•新产生的数据首先进入Eden区。
•Eden区的数据满后进入Survivor区。
•只有在两个Survivor区都存储过的数据才可以进入老年代。
•Eden区轮询指向Survivor区中的两个区。
•老年代存在数据,但是年轻代数据已满,会清空老年代。
2. 元空间[33]
由于持久代的问题比较多,从JDK8开始废弃了持久代迎来元空间(Metaspace),官方原文是这样写的:This is part of theJRockit and Hotspot convergence effort. JRockit customers do not need toconfigure the permanent generation (since JRockit does not have a permanentgeneration) and are accustomed to not configuring the permanent generation.
下面来看一下元空间。
•元空间的内存大小。
元空间是方法区的在HotSpot jvm 中的实现,方法区主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”。
元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。,理论上取决于32位/64位系统可虚拟的内存大小。可见也不是无限制的,需要配置参数。
•常用配置参数。
ØMetaspaceSize。
初始化的Metaspace大小,控制元空间发生GC的阈值。GC后,动态增加或降低MetaspaceSize。在默认情况下,这个值大小根据不同的平台在12M到20M浮动。使用Java -XX:+PrintFlagsInitial命令可以查看初始化参数。
ØMaxMetaspaceSize
限制Metaspace增长的上限,防止因为某些情况导致Metaspace无限的使用本地内存,影响到其他程序。该参数的默认值为4294967295B(大约4096MB)。
ØMinMetaspaceFreeRatio
当进行过Metaspace GC以后,会计算当前Metaspace的空闲空间的比例,如果这个比例小于这个参数(即实际非空闲占比过大,内存不够用),那么虚拟机将增长Metaspace的大小。参数的默认值为40%。设置该参数可以控制Metaspace的增长的速度,设置得太小会导致Metaspace增长的缓慢,Metaspace的使用逐渐趋于饱和,可能会影响之后类的加载。而设置得太大,会导致Metaspace增长的过快,浪费内存。
ØMaxMetasaceFreeRatio
当进行过Metaspace GC之后,会计算当前Metaspace的空闲空间比,如果空闲比大于这个参数,那么虚拟机就会释放Metaspace的部分空间。参数的默认值为70%。
ØMaxMetaspaceExpansion
Metaspace增长时的最大幅度。该参数的默认值为5452592B(大约为5MB)。
ØMinMetaspaceExpansion
Metaspace增长时的最小幅度。该参数的默认值为340784B(大约330KB为)。
3. jps
jps(Java Virtual Machine Process StatusTool)是Java提供的一个显示当前所有Java进程pid的命令。
jps 命令格式:jps [options ] [ hostid ]
• [options]选项。
Ø-q。
仅输出VM标识符,不包括classname,jar name,argumentsin main method
Ø-m。
输出main method的参数
Ø-l。
输出完全的包名,应用主类名,jar的完全路径名
-Øv。
输出jvm参数
Ø-V。
输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件
Ø-Joption。
传递参数到vm,例如:-J-Xms512m
• [hostid]。
Ø [protocol:][[//]hostname][:port][/servername]
•命令的输出格式。
Ølvmid [ [classname| JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ]
jps。最基本的使用方式。
>jps 20388Bootstrap 14364 Jps jps -l。输出主类或者jar的完全路径名。 >jps -l 18756sun.tools.jps.Jps 20388org.apache.catalina.startup.Bootstrap jps -v。输出jvm参数。 >jps -v 20388Bootstrap -Djava.util.logging.config.file=C:\xampp\tomcat\conf\logging.properties-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager-Djava.endorsed.dirs=C:\xampp\tomcat\endorsed -Dcatalina.base=C:\xampp\tomcat-Dcatalina.home=C:\xampp\tomcat -Djava.io.tmpdir=C:\xampp\tomcat\temp 13948 Jps-Denv.class.path=C:\Program Files\Java\jdk1.8.0_131\\lib\dt.jar;C:\ProgramFiles\Java\jdk1.8.0_131\\lib\tools.jar;C:\apache\apache-tomcat-8.0.30\lib\servlet-api.jar;-Dapplication.home=C:\Program Files\Java\jdk1.8.0_131 -Xms8m jps -q。仅仅显示java进程号。 >jps -q 20388 server.resin.Resin jps -mlv <IP>。远程查看
4. jstat
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。关于jstat的使用查看表3-18所示。
表3-18 jstat命令
参数 |
解释 |
jstat –class<pid> |
显示加载class的数量,及所占空间等信息 |
jstat -compiler <pid> |
显示VM实时编译的数量等信息 |
jstat -gc <pid> |
可以显示gc的信息,查看gc的次数,及时间 |
jstat -gccapacity <pid> |
可以显示,VM内存中(young,old)对象的使用和占用大小 |
jstat -gcutil <pid> |
统计gc信息 |
jstat -gcnew <pid> |
年轻代对象的信息 |
jstat -gcnewcapacity<pid> |
年轻代对象的信息及其占用量 |
jstat -gcold <pid> |
old代对象的信息 |
jstat -gcoldcapacity <pid> |
old代对象的信息及其占用量 |
jstat -printcompilation <pid> |
当前VM执行的信息 |
5. jVisualVM &jmap
通过命令jmap-dump:format=b,file=<path>\<filename>.hprof <pid>,把<pid>的信息导入.hprof格式的文件,然后打开jVisualVM GUI 界面,载入刚生成的.hprof文件,即可查看该进程在JVM的信息了。如图3-38所示。
图3-38 jVisualVM
顾翔老师与云测学院联合推出:软件测试分析与设计,请点击https://v.youku.com/v_show/id_XNDQ3MzkyNjk3Ng==.html?spm=a2hzp.8244740.0.0,收看。有不同观念欢迎与顾翔老师交流!
投票已过期
1.以下你用过哪些集中配置管理系统?(多选)
- puppet
- Chef
- ansible
- saltstack
- Cfengine
- Capistrano
- Resque
- Rundeck
- Rundeck
- 其他
2.以下你用哪些过虚拟机或容器?(多选)
- VMware
- Vagrant
- Amazon EC2
- AMI(亚马逊云机器镜像)
- Vagrant
- Docker
- Rkt
- 裸金属服务器
- 其他
3.以下你用哪些操作系统自动化配置工具?(多选)
- Solaris10 JumpStart
- Kickstart
- Debian-Preseed
- 其他
4.以下你用哪些云平台?(多选)
- Amazon Web Services
- Google App Engine
- Windows Azure
- OpenShift
- Cloud Foundry
- AWS CloudFormation
- Microsoft Azure Stack
- OpenStack Heat
- 百度云
- 阿里云
- 腾讯云
- 其他
5.以下你用哪些CI/CD工具?(多选)
- Jenkins
- ThoughtWorks GoCD
- Atlassian Bamboo
- Microsoft Team Foundation Server
- TeamCity
- GitLab CI
- Travis CI
- SNAP CI
- Pivotal的Concourse
- Etsy的Morgue
- 其他
6.以下你用哪些管理工具?(多选)
- JIRA
- LeanKit
- Mingle
- 禅道
- 其他
7.以下你用哪些安全工具?(多选)
- Vault
- Keywhiz
- credstash
- Red October
- Metasploit
- OSSEC
- Tripwire
- Unhide
- OWASP ZAP Zed Attack Proxy Project
- Lynis
- The Browser Exploitation Framework
- OWASP Xenotix XSS Exploit Framework
- OWASP Offensive Testing Framework
- Brakeman
- WPScan
- nmap
- Burp Suite
- AWVS
- AppScan
- CSRFTester
- SQL Map
- Pangolin
- DirBuster
- 其他
8.以下你用哪些静态扫描工具?(多选)
- Sonar
- Brakeman
- Codeclimate
- CheckStyle
- 其他

