浅析软件测试人员如何对JVM进行内存溢出检测
一、什么是JVM,检测JVM的意义
JVM是java virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是闪现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够"一次编译,到处运行"的原因。
JVM支持与操作系统无关,实现跨平台,使得Java成为应用最广泛的语言之一。当网站规模逐渐扩大时,为了保证性能,很有必要进行JVM内存溢出的检测。
二、检测工具jconsole
jconsole是jdk自带的用于监控内存溢出的工具,该工具可以对本地代码进行监控,也可以远程连接服务器对JVM进行程序监控。jconsole监控内容包括内存、cpu、线程、类等,
本次根据实际工作需要,重点阐述jconsole远程连接服务器的步骤及注意项:
在jak的bin目录下打开Jconsole

填写远程服务器的IP地址和端口号,填写用户名、密码

经过一段时间等待成功连上服务器,概况页直观展示内存、线程、类、cpu曲线图

内存使用情况详细图示

线程使用情况详细图示

类使用情况详细图示


此外,还有"VM概要":显示包括连接名称、活动线程、堆大小、操作系统、物理内存等详细信息;"MBean":可对左侧目录的相关属性进行配置。
注:想对JConsole有更详尽的了解请参考该博客:https://blog.csdn.net/lifuxiangcaohui/article/details/36896199
三、jmap的应用
通过jconsole持续监控,如在某一时间点发现性能问题时,可通过jmap命令查看内存使用情况,输出重定向将文件导出来进行分析。输出重定向命令:JMap -dump:format=b;file='文件名(自定义)' pid (程序的进程pid)
四、MAT工具分析
通过jmap命令将程序的内存使用情况文件导出来后,我们可以通过MAT对文件进行分析。
解压mat

点击mat文件夹中的MemoryAnalyzer启动

选择文件,点击打开 


因涉及到实际工作中java类名称等信息了,下面就不截图了。在页面中如果栈、堆的调用次数差别很大,需点击对象详情,分析对象调用情况。如果一个对象出现多次,说明是不正常的对象引用,GC不能回收,需要反馈给开发重点关注并优化。
注:该博客地址详细介绍了利用MAT进行内存泄漏分析https://blog.csdn.net/yxz329130952/article/details/50288145
至此,内存溢出检测告一段落,可以将文件和mat交于开发进行性能调优。另外,mat在加载文件时,在文件目录生成了xx_Leak_Suspects压缩包,解压压缩包可以通过浏览器打开直观查看分析报告。
五、总结
以上,就是JVM内存溢出检测的大体流程。等开发进行了性能调优,可以重复以上步骤,验证JVM性能。操作步骤如有不足,还请大家多多指教,谢谢!
浅析软件测试人员如何对JVM进行内存溢出检测的更多相关文章
- JVM:内存溢出OOM
JVM:内存溢出OOM 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 经典错误 JVM 中常见的两个 OOM 错误 StackoverflowError:栈溢出 ...
- Java JVM:内存溢出(栈溢出,堆溢出,持久代溢出以及 nable to create native thread)
转载自https://github.com/pzxwhc/MineKnowContainer/issues/25 包括:1. 栈溢出(StackOverflowError)2. 堆溢出(OutOfMe ...
- (转)JVM各种内存溢出是否产生dump
对于java的内存溢出,如果配置-XX:+HeapDumpOnOutOfMemoryError,很明确的知道堆内存溢出时会生成dump文件.但永久代内存溢出不明确是否会生成,今天来做一个实验: 永久代 ...
- Java8虚拟机(JVM)内存溢出实战
前言 相信很多JAVA中高级的同学在面试的时候会经常碰到一个面试题 你是如何在工作中对JVM调优和排查定位问题的? 事实上,如果用户量不大的情况下,在你的代码还算正常的情况下,在工作中除非真正碰到与J ...
- [JVM教程与调优] 了解JVM 堆内存溢出以及非堆内存溢出
在上一章中我们介绍了JVM运行时参数以及jstat指令相关内容:[JVM教程与调优] 什么是JVM运行时参数?.下面我们来介绍一下jmap+MAT内存溢出. 首先我们来介绍一下下JVM的内存结构. J ...
- 对jvm虚拟机 内存溢出的思考
java内存溢出:当新产生对象时,新生代空间不够,导致无法申请到足够的空间,报内存溢出 内存泄漏:一些静态集合,静态常量没有被gc清理,越来越多,占用内存,最后导致无法申请到新的空间
- JVM虚拟机内存溢出垃圾收集及类加载机制总结
1.Java内存区域与内存溢出异常 虚拟机栈:为虚拟机执行Java方法服务 本地方法栈:为虚拟机使用到的native方法服务. Java堆:是Java虚拟机所管理的内存中最大的一块,被所有线程共享的一 ...
- JVM 发生内存溢出的 8 种原因、及解决办法
阅读本文大概需要 2.3 分钟. 出处:割肉机 cnblogs.com/williamjie/p/11164572.html Java 堆空间 GC 开销超过限制 请求的数组大小超过虚拟机限制 Per ...
- 性能分析 | JVM发生内存溢出的8种原因及解决办法
推荐阅读:史上最详细JVM与性能优化知识点综合整理 1.Java 堆空间 2.GC 开销超过限制 3.请求的数组大小超过虚拟机限制 4.Perm gen 空间 5.Metaspace 6.无法新建本机 ...
随机推荐
- 使用SpringBoot的方式配置过滤器
springboot 不存在web.xml 那么如何配置过滤器呢 springboot提供了一种方式 通过spring容器配置 @Bean public FilterRegistrationBean ...
- idea开启Run DashBoard
0-前言 IDEA中,run dashboard是一个直观.方便好用的面板,谁用谁知道: 但是它不是默认开启的,开启有两种方式: 方式一: 1.新项目中,有时会弹出面板让我们点击开启,点击一下就能开启 ...
- MySQL手注之联合查询注入
了解联合查询注入之前,先要了解一下什么是union? union是用于合并两个sql查询结果的语句. 要使用union 必须有相同的列数 必须有两条以上的select语句组成 列的数据类型必须兼容 ...
- Redis小记(三)
1.复制 通过slaveof命令或设置slaveof选项,实现一个服务器去复制另一个服务器,被复制的是主服务器,执行复制的是从服务器,复制过程中主从双方数据库保持数据一致 2.8版本以前,可分为初次复 ...
- Go-archive/tar: write after close gopher.txt
where? 在使用Go中tar包循环写入内容的时候 why? 因为已经关闭了tar.writer对象,所以无法写入,但是程序还是有写入操作,所以报错 way? 通过 defer关键字来管理资源的释放 ...
- P3378 堆(模板)
P3378 [模板]堆 题目描述 给定一个数列,初始为空,请支持下面三种操作: 给定一个整数 x,请将 x 加入到数列中. 输出数列中最小的数. 删除数列中最小的数(如果有多个数最小,只删除 1 个) ...
- This is Riv3r1and.
总是要弄个博客来搞的嘛.
- 084 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 03 构造方法-this关键字
084 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 03 构造方法-this关键字 本文知识点:构造方法-this关键字 说明:因为时间紧 ...
- 059 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 06 增强型for循环
059 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 06 增强型for循环 本文知识点:增强型for循环 增强型for循环格式 案例练习增强型for循环 数组名字 ...
- PJzhang:鸟哥的linux私房菜-shell脚本-上
猫宁~~~ 建议全程在centos7中进行,我在kali linux中有些命令无法执行. 1~家目录下创建bin文件,test.sh文件在bin目录 下面的shell代码打印Hello World! ...