iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java中如何获取JVM dump文件
  • 295
分享到

java中如何获取JVM dump文件

2023-06-15 02:06:58 295人浏览 独家记忆
摘要

这篇文章主要介绍了java中如何获取JVM dump文件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JVM dumpjava内存dump是jvm运行时内存的一份快照,利用它

这篇文章主要介绍了java中如何获取JVM dump文件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

JVM dump

java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因。那么dump文件的内容是什么样的呢?我们一步一步来

获取JVM dump文件

获取dump文件的方式分为主动和被动

主动方式:

利用jmap,也是最常用的方式:jmap -dump:[live],fORMat=b,file=

利用jcmd,jcmd GC.heap_dump

使用VisualVM,可以界面操作进行dump内存

通过JMX的方式

MBeanServer server = ManagementFactory.getPlatformMBeanServer();HotSpotDiagnosticMXBean mxBean = ManagementFactory.newPlatformMXBeanProxy(server, "com.sun.management:type=HotSpotDiagnostic", HotSpotDiagnosticMXBean.class);mxBean.dumpHeap(filePath, live);

被动方式:

被动方式就是我们通常的OOM事件了,通过设置参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=

dump文件分析

结构示意图

java中如何获取JVM dump文件

结构详解

dump文件是堆内存的映射,由文件头和一系列内容块组成

文件头

由musk, 版本,identifierSize, 时间4部分组成

musk:4个byte,内容为'J', 'A', 'V', 'A'即JAVA

version:若干byte,值有以下三种

" PROFILE 1.0\0",

" PROFILE 1.0.1\0",

" PROFILE 1.0.2\0"

identifierSize:4个byte数字,值为4或者8,表示一个引用所占用的byte数

time:8个byte,dump文件生成时间

java一个类的成员变量有两种类型

基本类型(8种基本类型),它们占用byte数固定不变,每生成一个对象它们就需要给它们赋初始值,分配空间

是引用类型,表示一个对象,在类中只有一个引用,引用只是一个数值,所占用的空间大小为identifierSize,被引用对象即将在堆中的另一个地方

例如定义一个类

public class Person { private int age;//4个byte private String name;//identifierSize个byte private double weight;//8个byte}

当我们在new Person()的时候

它就需要申请一个空间,空间大小为 对象头大小+4+identifierSize+8个byte

对象大小的测量:

jdk提供一个测试对象占用内存大小的工具Instrumentation,但是Instrumentation没法直接引用到,需要通过agent来引用到
定义一个Premain类, javac Premain.java

//Premain.javapublic class Premain {    public static java.lang.instrument.Instrumentation inst;    public static void premain(String args, java.lang.instrument.Instrumentation inst) {        Premain.inst = inst;    }}

编写一个Manifest文件

manifest.mfManifest-Version: 1.0Premain-Class: PremainCan-Redefine-Classes: trueCan-Retransform-Classes: true

打包

jar -cmf manifest.mf premain.jar Premain.class

定义一个执行类, javac PersonTest.java

//PersonTest.javapublic class PersonTest {    public static void main(String[] args) throws Exception {        Class clazz = Class.forName("Premain");        if (clazz != null) {            Person p = new Person();            java.lang.instrument.Instrumentation inst = (java.lang.instrument.Instrumentation)clazz.getDeclaredField("inst").get(null);            System.out.println("person size:[" + inst.getObjectSize(p) + "]B");            System.out.println("class size:[" + inst.getObjectSize(p.getClass()) + "]B");        }    }}

带agent执行

java -javaagent:premain.jar PersonTest

结果:

person size:[32]B

class size:[504]B

内容块

每个块都是块头和块体组成

块头

块头由1个byte的块类型,4个byte的时间time,4个byte的长度表示此内容块占用byte数
type类型一般有5种,字符串,类,栈桢,栈,及dump块

字符串,由identifierSize个byte的字符串id,后面是(length-identifierSize)个byte的字符串内容(后续对字符串是直接引用的这里面的id)

类,由4个byte的类序列(在栈桢中使用),identifierSize个byte的类id(解析类的时候用到),4个byte的序列id(暂未使用),identifierSize个byte的类名id

栈桢,由identifierSize个byte的桢id,identifierSize个byte的方法名id,identifierSize个byte的方法标识id,identifierSize个byte的类文件名id,4个byte的类序列,4个byte的行号

栈,由4个byte的栈序号,4个byte的线程序号,4个byte的桢数量,后面就是若干个identifierSize个byte的桢id

dump块就是所有对象的内容了,每个对象由1个byte的子类型,和对象内容结成,子类型有6种,gc root, 线程对象,类,对象,基本类型数组,对象数组

gc root

gc root有4种结构,8种类型

1,identifierSize个byte的对象id,类型有SYSTEM_CLASS,BUSY_MONITOR, 及未UNKNOWN

identifierSize个byte的对象id,4个byte的线程序列号,类型有NATIVE_STACK,THREAD_BLOCK

identifierSize个byte的对象id,4个byte的线程序列号,4个byte的栈桢深度,类型有JAVA_LOCAL,NATIVE_LOCAL

identifierSize个byte的对象id,identifierSize个byte的global refId(暂未使用),类型有NATIVE_STATIC

gc root示意图

gc root为垃圾收集追溯的源头,每个gc root都指向一个初始对象,无法追溯的对象是要被回收掉的

java中如何获取JVM dump文件

系统类,只有classLoader为null的类才是gc root,每个类都是一个gc root
线程栈,线程中方法参数,局部变量都是gc root,每个对象都是一个gc root
系统保留对象,每个对象都是一个gc root

类对象

基本信息

identifierSize个byte的类对象id

4个byte的栈序列号

identifierSize个byte的父类对象id,

identifierSize个byte的classLoader对象id,

identifierSize个byte的Signer对象id,

identifierSize个byte的protection domain对象id,

identifierSize个byte的保留id1和id2,

4个byte的类实例对象大小,

2个byte的常量个数,后面是每个常量的,2个byte的下标,1个byte的常量类型,和若干个byte的内容,内容根据类型来决定(boolean/byte为1个byte, char/short为2个byte,float/int为4个byte, double/long为8个byte,引用类型为identifierSize个byte)

2个byte的静态变量个数,后面是每个静态变量的,identifierSize个byte的变量名id, 1个byte的变量类型,和若干个byte的内容,内容根据类型来决定(见类对象基本信息的第9条)

2个byte的成员变量个数,后面是每个成员变量的,identifierSize个byte的变量名id,1个byte的变量类型

说明

(1)类里面的常量很多地方都没有用上,所以常量个数一般为0

(2)类的静态变量的名称类型及值是放在类对象里面的,成员变量的名称和类型也是放在类对象里面的,但是实例的值是放在实例对象里面的

实例对象

基本信息:

  • identifierSize个byte的实例对象id

  • 4个byte的栈序列号

  • identifierSize个byte的类id

  • 4个byte的占用字节数

  • 实例的变量的值

说明:

  • 实例的值为实例对象的成员变量值,顺序为当前类的变量值,顺序为类对象基本信息中第11条中的顺序,

  • 然后是父类的变量值变量的值基本类型都有默认值,引用类型默认值为0,占用字节数(见类对象基本信息的第9条)

基本类型数组

基本信息

  • identifierSize个byte的数组对象id

  • 4个byte的栈序列号

  • 4个byte的数组长度

  • 1个byte的元素类型

  • 元素的值列表

说明

元素的值(见类对象基本信息的第9条)

对象数组

基本信息:

  • identifierSize个byte的数组对象id

  • 4个byte的栈序列号

  • 4个byte的数组长度

  • identifierSize个byte的元素类id

  • 元素的值列表

内存分配

java中如何获取JVM dump文件

当一个线程启动的时候,进程会去系统内存生成一个线程栈
每当发生一次方法调用,就会向栈中压入一个栈桢,当方法调用完之后,栈桢会退出
在运行过程中,如果有对象的new操作的时候,进程会去堆区申请一块内存
关于运行时内存的详细情况,可以查找相关的资料

内存回收规则

如果一个对象不能骑过gc root引用可达,那么这个对象就可能要被回收

对象回收规则包括

实例属性被实例引用,只有当实例被回收了实例属性才能被回收(只针对强引用)

类对象被实例引用,只有当一个类的所有实例都被回收了,类才能被回收类

对象的父类,classLoader对象,signer对象, protection domain对象被类引用,只有当类被回收了,这些才能被回收

局部变量(线程栈中)的作用域为一个大括号

public void test(){Object a = new Object();//obj 1Object b = new Object();//obj 2{Object c = new Object();//obj 3a = null;//obj 1可以被回收了}//obj 3可以回收了}//obj 2可以被回收了

分析工具简介

分析dump文件,我们可以用jdk里面提供的jhat工具,执行

jhat xxx.dump

jhat加载解析xxx.dump文件,并开启一个简易的WEB服务,默认端口为7000,可以通过浏览器查看内存中的一些统计信息

一般使用方法

1、浏览器打开Http:/127.0.0.1:7000

java中如何获取JVM dump文件

会列出一些功能,包括package下面各个类的概览,及各个功能导航

2、点击页面的堆内存统计

java中如何获取JVM dump文件

有一个表格,对象类型,实例个数,实例所占用内存大小,哪种类型的对象占用了内存最多一目了然

3、点击其中认为内存消耗太多的类名查看类详情

java中如何获取JVM dump文件

主要展现该类下面各个实例的大小,以及一些链接导航

4、点击references summary by type

java中如何获取JVM dump文件

如果某种类型的对象太多,那么有可能是引用它的那个类的对象太多

基本上一些简单页面的查询,结合原代码,就可以初步定位内存泄漏的地方

常用的java框架有哪些

1.springMVCspring Web mvc是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架。2.shiro,Apache Shiro是Java的一个安全框架。3.mybatis,MyBatis 是支持普通 sql查询,存储过程和高级映射的优秀持久层框架。4.dubbo,Dubbo是一个分布式服务框架。5.Maven,Maven是个项目管理和构建自动化工具。6.RabbitMQ,RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。7.Ehcache,EhCache 是一个纯Java的进程内缓存框架。

感谢你能够认真阅读完这篇文章,希望小编分享的“java中如何获取JVM dump文件”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: java中如何获取JVM dump文件

本文链接: https://www.lsjlt.com/news/277108.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java中如何获取JVM dump文件
    这篇文章主要介绍了java中如何获取JVM dump文件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JVM dumpjava内存dump是jvm运行时内存的一份快照,利用它...
    99+
    2023-06-15
  • 如何深度分析jvm中dump文件
    这篇文章将为大家详细讲解有关如何深度分析jvm中dump文件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。JVM dumpjava内存dump是jvm运行时内存的一份快照,利用它可以分析是否...
    99+
    2023-06-16
  • JAVA文件中如何获取路径
    这篇文章主要介绍了JAVA文件中如何获取路径,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 基本概念的理解`绝对路径`:你应用上的文件或目录在硬盘上真正的路径,如:URL...
    99+
    2023-05-30
    java
  • gitee中如何获取文件
    Gitee是中国最大的基于Git的开源社区,它为开发者提供了一个完备、稳定、易用的文档管理与协作平台。在Gitee上,我们可以很方便地托管我们的所有代码和文件,并且我们还可以方便地分享我们的代码和文件。在Gitee上,我们有时候需要获取某些...
    99+
    2023-10-22
  • java如何获取resources下的文件
    在Java中,可以使用`ClassLoader`类来获取`resources`下的文件。具体步骤如下:1. 创建`ClassLoad...
    99+
    2023-09-28
    java
  • java如何获取properties文件内容
    在Java中,可以使用Properties类来获取properties文件的内容。具体方法如下:1. 创建Properties对象并...
    99+
    2023-09-13
    java
  • 如何从dump文件中提取出C#源代码
    目录一:背景二:从 dump 文件中提取源代码1. 案例演示2. 使用 lm + savemodule 命令提取3. 使用 dumpdomain/module + savemodul...
    99+
    2024-04-02
  • python中如何获取文件名
    python中获取文件名的方法:1、在win操作系统中找到python程序目录;2、打开idle工具;3、在idle中新建一个shell脚本;4、输入“import os”指令导入os模块;5、通过“os.path.basename(文件路...
    99+
    2024-04-02
  • java如何获取指定文件路径
    在Java中,要获取指定文件的路径,可以使用java.nio.file.Path类来完成。可以使用以下几种方法来获取文件路径:1. ...
    99+
    2023-10-21
    java
  • Java如何获取url地址文件流
    目录获取url地址文件流根据url获取文件的二进制上代码获取url地址文件流 public static InputStream getInputStreamFromUrl(Str...
    99+
    2024-04-02
  • java如何获取上传文件大小
    在Java中,可以通过使用`File`类或`MultipartFile`类来获取上传文件的大小。1. 使用`File`类获取文件大小...
    99+
    2023-08-23
    java
  • java如何获取文件最后一行
    可以使用 `java.io.RandomAccessFile` 类来实现获取文件的最后一行。具体步骤如下:1. 创建一个 `Rand...
    99+
    2023-08-17
    java
  • jvm内存快照如何获取
    要获取JVM内存快照,可以使用以下两种方法: 使用JDK提供的`jmap`命令。在命令行中执行以下命令: jmap -dump:...
    99+
    2023-10-27
    jvm
  • php中如何只获取文件名
    php中如何只获取文件名?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。php只获取文件名的方法:首先创建一个PHP示例文件;然后通过“basename($file_path...
    99+
    2023-06-15
  • java如何获取文件夹下的所有文件名
    可以使用Java的File类来获取文件夹下的所有文件名。以下是一个示例代码: import java.io.File; publi...
    99+
    2024-04-02
  • JVM中如何获取OOM时的堆信息
    这篇文章给大家分享的是有关JVM中如何获取OOM时的堆信息的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JVM的框架知识了解之后,实际的项目里发生了OOM异常的话,怎么获取以及分析异常信息后怎么分析呢。这里稍微做...
    99+
    2023-05-31
    jvm oom
  • Linux中如何获取文件大小
    Linux中如何获取文件大小,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。代码实现:unsigned long get_file_size(const&nb...
    99+
    2023-06-17
  • python中如何获取文件属性
    python中获取文件属性的方法:1、在win操作系统中找到python程序目录;2、打开idle工具;3、在idle中新建一个shell脚本;4、输入“import os”指令导入os模块;5、通过“os.stat(文件路径)”指令获取指...
    99+
    2024-04-02
  • Java获取文件的MD5
    Java获取文件的MD5 主要是通过读取文件的字符流,然后赋值给MessageDigest对象,最后将文件流转换成16进制的字符串。 import java.io.File;import java.i...
    99+
    2023-09-11
    java jvm 开发语言
  • jquery如何获取file文件
    在HTML中,``被用于选择文件上传。您可以使用jQuery来获取选定的文件。首先,给文件输入字段添加一个id属性,以便能够通过jQ...
    99+
    2023-08-11
    jquery
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作