一、什么是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进行内存溢出检测的更多相关文章

  1. JVM:内存溢出OOM

    JVM:内存溢出OOM 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 经典错误 JVM 中常见的两个 OOM 错误 StackoverflowError:栈溢出 ...

  2. Java JVM:内存溢出(栈溢出,堆溢出,持久代溢出以及 nable to create native thread)

    转载自https://github.com/pzxwhc/MineKnowContainer/issues/25 包括:1. 栈溢出(StackOverflowError)2. 堆溢出(OutOfMe ...

  3. (转)JVM各种内存溢出是否产生dump

    对于java的内存溢出,如果配置-XX:+HeapDumpOnOutOfMemoryError,很明确的知道堆内存溢出时会生成dump文件.但永久代内存溢出不明确是否会生成,今天来做一个实验: 永久代 ...

  4. Java8虚拟机(JVM)内存溢出实战

    前言 相信很多JAVA中高级的同学在面试的时候会经常碰到一个面试题 你是如何在工作中对JVM调优和排查定位问题的? 事实上,如果用户量不大的情况下,在你的代码还算正常的情况下,在工作中除非真正碰到与J ...

  5. [JVM教程与调优] 了解JVM 堆内存溢出以及非堆内存溢出

    在上一章中我们介绍了JVM运行时参数以及jstat指令相关内容:[JVM教程与调优] 什么是JVM运行时参数?.下面我们来介绍一下jmap+MAT内存溢出. 首先我们来介绍一下下JVM的内存结构. J ...

  6. 对jvm虚拟机 内存溢出的思考

    java内存溢出:当新产生对象时,新生代空间不够,导致无法申请到足够的空间,报内存溢出 内存泄漏:一些静态集合,静态常量没有被gc清理,越来越多,占用内存,最后导致无法申请到新的空间

  7. JVM虚拟机内存溢出垃圾收集及类加载机制总结

    1.Java内存区域与内存溢出异常 虚拟机栈:为虚拟机执行Java方法服务 本地方法栈:为虚拟机使用到的native方法服务. Java堆:是Java虚拟机所管理的内存中最大的一块,被所有线程共享的一 ...

  8. JVM 发生内存溢出的 8 种原因、及解决办法

    阅读本文大概需要 2.3 分钟. 出处:割肉机 cnblogs.com/williamjie/p/11164572.html Java 堆空间 GC 开销超过限制 请求的数组大小超过虚拟机限制 Per ...

  9. 性能分析 | JVM发生内存溢出的8种原因及解决办法

    推荐阅读:史上最详细JVM与性能优化知识点综合整理 1.Java 堆空间 2.GC 开销超过限制 3.请求的数组大小超过虚拟机限制 4.Perm gen 空间 5.Metaspace 6.无法新建本机 ...

随机推荐

  1. Java源码赏析(二)Java常见接口

    一.Comparable接口 package java.lang; import java.util.*; public interface Comparable<T> { /** * i ...

  2. RabbitMQ与Kafka选型对比

    背景 本公司是.Net项目,在.Net可选的MQ比较少,主要Kafka和RabbitMQ,RabbitMQ我也是使用多年了,最近的Kafka广告与流行度打得使我也是无法无视,因此也是花了点时间收集了资 ...

  3. Harbor介绍与企业级私有Docker镜像仓库搭建

    Harbor介绍与安装部署,并实现通过http和https协议[自签发SSL证书]访问,客户端如何通过Harbor镜像仓库实现镜像的上传[推送]与下载[拉取]. Harbor介绍 Harbor,是一个 ...

  4. RocketMQ 笔记

    Queue Topic和Queue是1对多的关系,一个Topic下可以包含多个Queue,主要用于负载均衡.发送消息时,用户只指定Topic,Producer会根据Topic的路由信息选择具体发到哪个 ...

  5. _1_html_框架

    创:18_3_2017修:20_3_2017 什么是html? --超文本标记语言 --告诉浏览器内容的语义 html页面的框架是什么? <!DOCTYPE html> <!--DT ...

  6. 关于Python中以字母r,或字母u 开头的字符串

      (1)以r或R开头的Python中的字符串表示(非转义的)原始字符串 python里面的字符,如果开头处有个r,比如: (r'^time/plus/\d{1,2}/$', hours_ahead) ...

  7. Harmony OS 开发避坑指南——DevEco Device Tool 安装配置

    Harmony OS 开发指南--DevEco Device Tool 安装配置 本文介绍如何在Windows主机上安装DevEco Device Tool工具. 坑点总结: 国内部分网络环境下,安装 ...

  8. Book of Shaders 03 - 学习随机与噪声生成算法

    0x00 随机 我们不能预测天空中乌云的样子,因为它的纹理总是具有不可预测性.这种不可预测性叫做随机 (random). 在计算机图形学中,我们通常使用随机来模拟自然界中的噪声.如何获得一个随机值呢, ...

  9. Python 为什么不支持 switch 语句?

    本文出自"Python为什么"系列,请查看全部文章 在这篇文章里,我们会聊一聊为什么 Python 决定不支持 switch 语句. 为什么想要聊这个话题呢? 主要是因为 swit ...

  10. K8S-ETCD数据库备份与恢复

    kubernetes使用etcd数据库实时存储集群中的数据,安全起见,一定要备份 需要指定使用etcdctl的版本 etcd数据库备份是使用数控快照的方式进行备份的,备份后的新数据不会保留,后面创建的 ...