软件性能测试(连载18)

简介: 软件性能测试(连载18)

2.5 JVM性能监控


      JVMJava Virtual MachineJava虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。


引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。在JDK1.7之前JVM存在年轻代(Young Generation)、年老代(Old Generationn)和持久代(Permanent Generation)。


1. 年轻代与年老代中没有被回收的数据块存储


      年轻代包括Eden区和Survivor区。Eden区有一个存储单元,Survivor区有两个存储单元:S0US1U,为了描述方便,假设Eden区做多可以存储三个数据块,Survivor区做多可以存储四个数据块。年老代也只有一个区,最多可存储四个数据块。下面来看一下年轻代与年老代中没有被回收的数据块存储。


image.png

3-37  年轻代与年老代中没有被回收的数据块存储

1)新来数据块a1a2,进入年轻代的Eden区。见图3-371)所示。

2)数据块a3 产生,进入Eden区,Eden区满了,把a1a2a3移入S0U。见图3-372)所示。

3Eden区的指针指向S0U。数据块a2a3被回收,留下了数据块a1Eden区进入了数据块b1b2。见图3-373)所示。

4)数据块b3 产生,进入Eden区,Eden区满了,把b1b2b3移入S0U。见图3-374)所示。

5Survivor区第一个存储单元满了,把a1b1b2b3S0U单元移入S1U。见图3-375)所示。

6Eden区的指针指向S1U。数据块c1c2产生,进入Eden区, S1Ub3被回收,剩下a1b1b2。见图3-376)所示。

7Eden区产生数据块c3Eden区满了,这时候由于S1Ua1被回收,而b1b2没有被回收,所以这时候只能把Eden区的c1c2Eden区移入S1U。见图3-377)所示。

8S1U中存在b1b2c1c2,这时候Survivor区的S1U,但是由于b1b2是从S1U中过来的,而c1c2是从Eden区过来的,所以只能把数据块b1b2S1U移入到年老代。见图3-378)所示。

9)这个时候再把Eden区的数据块c3Eden区移入S1U。见图3-379)所示。

10Eden区产生数据块d1d3d3Eden区满了,而S1U仅存在了数据块c3,把Eden区的d1d3d3移入Survivor区的第二个存储单元。见图3-3710)所示。

11)由于当前S1U中的数据块c3d1d3d3都是从Eden区过来的,这个时候S1U已经满了,所以要把数据块c3d1d3d3S1U移到S0U。见图3-3711)所示。

12Eden区的指针返回指向S0UEden区产生了新的数据块e1e2S0U中的d1d3被回收,剩下c3d2。见图3-3712)所示。

13Eden区产生数据块e3Eden区满了,这时候S0U中存在数据块c3d2,所以只能把Eden区的e1e2先移入到S0U中。见图3-3713)所示。

14S0U中目前存在数据块c3d2e1e2,由于c3d2是从S1U中过来的,而e1e2是从Eden区过来的,所以只能把c3d2S0U中移入到老年代。见图3-3614)所示。

15)接下来再把Eden区产生数据块e3移入到S0U。见图3-3715)所示。

16)按照这种规律进行下去。

17)这个时候,Eden区有数据块g1g2S1U有数据块e1e2 f1f2,年老代中存在数据块b1b2c1d2。见图3-3717)所示。

18S1U与年老代中存在数据块都满,把年老代中得数据块丢弃,把S1U中的e1e2移入年老代。见图3-3718)所示。按照这个规律进行下去。


由此看见。

新产生的数据首先进入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。在默认情况下,这个值大小根据不同的平台在12M20M浮动。使用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

jpsJava 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所示。


image.png

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
  • 其他
目录
相关文章
|
10月前
|
人工智能 安全 网络安全
Burp Suite Professional 2025.5 for macOS x64 & ARM64 - 领先的 Web 渗透测试软件
Burp Suite Professional 2025.5 for macOS x64 & ARM64 - 领先的 Web 渗透测试软件
460 3
|
5月前
|
Java 测试技术 网络安全
Burp Suite Professional 2025.10 for Windows x64 - 领先的 Web 渗透测试软件
Burp Suite Professional 2025.10 for Windows x64 - 领先的 Web 渗透测试软件
264 0
Burp Suite Professional 2025.10 for Windows x64 - 领先的 Web 渗透测试软件
|
测试技术 开发者 Python
自动化测试之美:从零构建你的软件质量防线
【10月更文挑战第34天】在数字化时代的浪潮中,软件成为我们生活和工作不可或缺的一部分。然而,随着软件复杂性的增加,如何保证其质量和稳定性成为开发者面临的一大挑战。自动化测试,作为现代软件开发过程中的关键实践,不仅提高了测试效率,还确保了软件产品的质量。本文将深入浅出地介绍自动化测试的概念、重要性以及实施步骤,带领读者从零基础开始,一步步构建起属于自己的软件质量防线。通过具体实例,我们将探索如何有效地设计和执行自动化测试脚本,最终实现软件开发流程的优化和产品质量的提升。无论你是软件开发新手,还是希望提高项目质量的资深开发者,这篇文章都将为你提供宝贵的指导和启示。
|
10月前
|
安全 测试技术 Linux
Flawnter 5.9.1 (macOS, Linux, Windows) - 应用程序安全测试软件
Flawnter 5.9.1 (macOS, Linux, Windows) - 应用程序安全测试软件
332 2
Flawnter 5.9.1 (macOS, Linux, Windows) - 应用程序安全测试软件
|
10月前
|
人工智能 安全 网络安全
Burp Suite Professional 2025.5 for Windows x64 - 领先的 Web 渗透测试软件
Burp Suite Professional 2025.5 for Windows x64 - 领先的 Web 渗透测试软件
506 4
Burp Suite Professional 2025.5 for Windows x64 - 领先的 Web 渗透测试软件
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
9月前
|
测试技术
软考软件测评师大题——案例分析之白盒测试
历年下午案例试题一固定考察白盒测试,主要包含三大核心问题:推导逻辑条件、绘制控制流图及计算环路复杂度、确定线性无关路径集合。内容涵盖覆盖层级标准(语句、分支、判定、条件覆盖等)、控制流图构建规范(顺序、分支、循环结构转换原则)、环路复杂度计算公式以及线性无关路径生成方法。通过典型题型示例解析,如代码路径分析与验证指标,帮助考生掌握解题思路和技巧。
|
9月前
|
测试技术
软考软件评测师——可靠性测试测试方法
软件可靠性是指软件在规定条件和时间内完成预定功能的能力,受运行环境、软件规模、内部结构、开发方法及可靠性投入等因素影响。失效概率指软件运行中出现失效的可能性,可靠度为不发生失效的概率,平均无失效时间(MTTF)体现软件可靠程度。案例分析显示,嵌入式软件需满足高可靠性要求,如机载软件的可靠度需达99.99%以上,通过定量指标评估其是否达标。
|
9月前
|
安全 测试技术 持续交付
软考软件评测师——基于风险的测试技术
本文详细阐述了测试计划的核心要素与制定流程,涵盖测试范围界定、实施策略规划、资源配置及风险管理机制。通过风险识别方法论和评估模型,构建了完整的质量保障体系。同时,针对不同测试级别与类型提供具体配置建议,并提出技术选型原则与实施规范,确保测试活动高效有序开展,为项目成功奠定基础。内容结合实际经验,具有较强指导意义。