日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

深度分析java dump文件

瀏覽:66日期:2022-08-12 14:59:13
目錄JVM dump獲取JVM dump文件dump文件分析結(jié)構(gòu)詳解文件頭java一個(gè)類(lèi)的成員變量有兩種類(lèi)型內(nèi)容塊塊頭gc root類(lèi)對(duì)象基本信息說(shuō)明實(shí)例對(duì)象基本類(lèi)型數(shù)組基本信息說(shuō)明對(duì)象數(shù)組內(nèi)存分配內(nèi)存回收規(guī)則分析工具簡(jiǎn)介瀏覽器打開(kāi)http:/127.0.0.1:7000點(diǎn)擊頁(yè)面的堆內(nèi)存統(tǒng)計(jì)點(diǎn)擊其中認(rèn)為內(nèi)存消耗太多的類(lèi)名查看類(lèi)詳情點(diǎn)擊references summary by typeJVM dump

java內(nèi)存dump是jvm運(yùn)行時(shí)內(nèi)存的一份快照,利用它可以分析是否存在內(nèi)存浪費(fèi),可以檢查內(nèi)存管理是否合理,當(dāng)發(fā)生OOM的時(shí)候,可以找出問(wèn)題的原因。那么dump文件的內(nèi)容是什么樣的呢?我們一步一步來(lái)

獲取JVM dump文件

獲取dump文件的方式分為主動(dòng)和被動(dòng)

主動(dòng)方式:

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

2.利用jcmd,jcmd GC.heap_dump

3.使用VisualVM,可以界面操作進(jìn)行dump內(nèi)存

4.通過(guò)JMX的方式

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

參考(https://www.baeldung.com/java-heap-dump-capture)

被動(dòng)方式:

被動(dòng)方式就是我們通常的OOM事件了,通過(guò)設(shè)置參數(shù)-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=

dump文件分析

結(jié)構(gòu)示意圖

深度分析java dump文件

結(jié)構(gòu)詳解

dump文件是堆內(nèi)存的映射,由文件頭和一系列內(nèi)容塊組成

文件頭

由musk, 版本,identifierSize, 時(shí)間4部分組成

1、musk:4個(gè)byte,內(nèi)容為’J’, ’A’, ’V’, ’A’即JAVA

2、version:若干byte,值有以下三種

' PROFILE 1.00',

' PROFILE 1.0.10',

' PROFILE 1.0.20'

3、identifierSize:4個(gè)byte數(shù)字,值為4或者8,表示一個(gè)引用所占用的byte數(shù)

4、time:8個(gè)byte,dump文件生成時(shí)間

java一個(gè)類(lèi)的成員變量有兩種類(lèi)型

1.基本類(lèi)型(8種基本類(lèi)型),它們占用byte數(shù)固定不變,每生成一個(gè)對(duì)象它們就需要給它們賦初始值,分配空間

2.是引用類(lèi)型,表示一個(gè)對(duì)象,在類(lèi)中只有一個(gè)引用,引用只是一個(gè)數(shù)值,所占用的空間大小為identifierSize,被引用對(duì)象即將在堆中的另一個(gè)地方

例如定義一個(gè)類(lèi)

public class Person { private int age;//4個(gè)byte private String name;//identifierSize個(gè)byte private double weight;//8個(gè)byte}

當(dāng)我們?cè)趎ew Person()的時(shí)候

它就需要申請(qǐng)一個(gè)空間,空間大小為 對(duì)象頭大小+4+identifierSize+8個(gè)byte

對(duì)象大小的測(cè)量:

jdk提供一個(gè)測(cè)試對(duì)象占用內(nèi)存大小的工具Instrumentation,但是Instrumentation沒(méi)法直接引用到,需要通過(guò)agent來(lái)引用到定義一個(gè)Premain類(lèi), 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; }}

編寫(xiě)一個(gè)Manifest文件

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

打包

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

定義一個(gè)執(zhí)行類(lèi), 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執(zhí)行

java -javaagent:premain.jar PersonTest

結(jié)果:

person size:[32]B

class size:[504]B

內(nèi)容塊

每個(gè)塊都是塊頭和塊體組成

塊頭

塊頭由1個(gè)byte的塊類(lèi)型,4個(gè)byte的時(shí)間time,4個(gè)byte的長(zhǎng)度表示此內(nèi)容塊占用byte數(shù)type類(lèi)型一般有5種,字符串,類(lèi),棧楨,棧,及dump塊

1.字符串,由identifierSize個(gè)byte的字符串id,后面是(length-identifierSize)個(gè)byte的字符串內(nèi)容(后續(xù)對(duì)字符串是直接引用的這里面的id)

2.類(lèi),由4個(gè)byte的類(lèi)序列(在棧楨中使用),identifierSize個(gè)byte的類(lèi)id(解析類(lèi)的時(shí)候用到),4個(gè)byte的序列id(暫未使用),identifierSize個(gè)byte的類(lèi)名id

3.棧楨,由identifierSize個(gè)byte的楨id,identifierSize個(gè)byte的方法名id,identifierSize個(gè)byte的方法標(biāo)識(shí)id,identifierSize個(gè)byte的類(lèi)文件名id,4個(gè)byte的類(lèi)序列,4個(gè)byte的行號(hào)

4.棧,由4個(gè)byte的棧序號(hào),4個(gè)byte的線程序號(hào),4個(gè)byte的楨數(shù)量,后面就是若干個(gè)identifierSize個(gè)byte的楨id

5.dump塊就是所有對(duì)象的內(nèi)容了,每個(gè)對(duì)象由1個(gè)byte的子類(lèi)型,和對(duì)象內(nèi)容結(jié)成,子類(lèi)型有6種,gc root, 線程對(duì)象,類(lèi),對(duì)象,基本類(lèi)型數(shù)組,對(duì)象數(shù)組

gc root

gc root有4種結(jié)構(gòu),8種類(lèi)型

1,identifierSize個(gè)byte的對(duì)象id,類(lèi)型有SYSTEM_CLASS,BUSY_MONITOR, 及未UNKNOWN

2.identifierSize個(gè)byte的對(duì)象id,4個(gè)byte的線程序列號(hào),類(lèi)型有NATIVE_STACK,THREAD_BLOCK

3.identifierSize個(gè)byte的對(duì)象id,4個(gè)byte的線程序列號(hào),4個(gè)byte的棧楨深度,類(lèi)型有JAVA_LOCAL,NATIVE_LOCAL

4.identifierSize個(gè)byte的對(duì)象id,identifierSize個(gè)byte的global refId(暫未使用),類(lèi)型有NATIVE_STATIC

gc root示意圖

gc root為垃圾收集追溯的源頭,每個(gè)gc root都指向一個(gè)初始對(duì)象,無(wú)法追溯的對(duì)象是要被回收掉的

深度分析java dump文件

系統(tǒng)類(lèi),只有classLoader為null的類(lèi)才是gc root,每個(gè)類(lèi)都是一個(gè)gc root線程棧,線程中方法參數(shù),局部變量都是gc root,每個(gè)對(duì)象都是一個(gè)gc root系統(tǒng)保留對(duì)象,每個(gè)對(duì)象都是一個(gè)gc root

類(lèi)對(duì)象基本信息

1.identifierSize個(gè)byte的類(lèi)對(duì)象id

2.4個(gè)byte的棧序列號(hào)

3.identifierSize個(gè)byte的父類(lèi)對(duì)象id,

4.identifierSize個(gè)byte的classLoader對(duì)象id,

5.identifierSize個(gè)byte的Signer對(duì)象id,

6.identifierSize個(gè)byte的protection domain對(duì)象id,

7.identifierSize個(gè)byte的保留id1和id2,

8.4個(gè)byte的類(lèi)實(shí)例對(duì)象大小,

9.2個(gè)byte的常量個(gè)數(shù),后面是每個(gè)常量的,2個(gè)byte的下標(biāo),1個(gè)byte的常量類(lèi)型,和若干個(gè)byte的內(nèi)容,內(nèi)容根據(jù)類(lèi)型來(lái)決定(boolean/byte為1個(gè)byte, char/short為2個(gè)byte,float/int為4個(gè)byte, double/long為8個(gè)byte,引用類(lèi)型為identifierSize個(gè)byte)

10.2個(gè)byte的靜態(tài)變量個(gè)數(shù),后面是每個(gè)靜態(tài)變量的,identifierSize個(gè)byte的變量名id, 1個(gè)byte的變量類(lèi)型,和若干個(gè)byte的內(nèi)容,內(nèi)容根據(jù)類(lèi)型來(lái)決定(見(jiàn)類(lèi)對(duì)象基本信息的第9條)

11.2個(gè)byte的成員變量個(gè)數(shù),后面是每個(gè)成員變量的,identifierSize個(gè)byte的變量名id,1個(gè)byte的變量類(lèi)型

說(shuō)明

(1)類(lèi)里面的常量很多地方都沒(méi)有用上,所以常量個(gè)數(shù)一般為0

(2)類(lèi)的靜態(tài)變量的名稱(chēng)類(lèi)型及值是放在類(lèi)對(duì)象里面的,成員變量的名稱(chēng)和類(lèi)型也是放在類(lèi)對(duì)象里面的,但是實(shí)例的值是放在實(shí)例對(duì)象里面的

實(shí)例對(duì)象

1、基本信息:

identifierSize個(gè)byte的實(shí)例對(duì)象id 4個(gè)byte的棧序列號(hào) identifierSize個(gè)byte的類(lèi)id 4個(gè)byte的占用字節(jié)數(shù) 實(shí)例的變量的值

2、說(shuō)明:

實(shí)例的值為實(shí)例對(duì)象的成員變量值,順序?yàn)楫?dāng)前類(lèi)的變量值,順序?yàn)轭?lèi)對(duì)象基本信息中第11條中的順序, 然后是父類(lèi)的變量值變量的值基本類(lèi)型都有默認(rèn)值,引用類(lèi)型默認(rèn)值為0,占用字節(jié)數(shù)(見(jiàn)類(lèi)對(duì)象基本信息的第9條)基本類(lèi)型數(shù)組基本信息 identifierSize個(gè)byte的數(shù)組對(duì)象id 4個(gè)byte的棧序列號(hào) 4個(gè)byte的數(shù)組長(zhǎng)度 1個(gè)byte的元素類(lèi)型 元素的值列表說(shuō)明

元素的值(見(jiàn)類(lèi)對(duì)象基本信息的第9條)

對(duì)象數(shù)組

基本信息:

identifierSize個(gè)byte的數(shù)組對(duì)象id 4個(gè)byte的棧序列號(hào) 4個(gè)byte的數(shù)組長(zhǎng)度 identifierSize個(gè)byte的元素類(lèi)id 元素的值列表內(nèi)存分配

深度分析java dump文件

當(dāng)一個(gè)線程啟動(dòng)的時(shí)候,進(jìn)程會(huì)去系統(tǒng)內(nèi)存生成一個(gè)線程棧每當(dāng)發(fā)生一次方法調(diào)用,就會(huì)向棧中壓入一個(gè)棧楨,當(dāng)方法調(diào)用完之后,棧楨會(huì)退出在運(yùn)行過(guò)程中,如果有對(duì)象的new操作的時(shí)候,進(jìn)程會(huì)去堆區(qū)申請(qǐng)一塊內(nèi)存關(guān)于運(yùn)行時(shí)內(nèi)存的詳細(xì)情況,可以查找相關(guān)的資料

內(nèi)存回收規(guī)則

如果一個(gè)對(duì)象不能騎過(guò)gc root引用可達(dá),那么這個(gè)對(duì)象就可能要被回收

對(duì)象回收規(guī)則包括

實(shí)例屬性被實(shí)例引用,只有當(dāng)實(shí)例被回收了實(shí)例屬性才能被回收(只針對(duì)強(qiáng)引用)

類(lèi)對(duì)象被實(shí)例引用,只有當(dāng)一個(gè)類(lèi)的所有實(shí)例都被回收了,類(lèi)才能被回收類(lèi)

對(duì)象的父類(lèi),classLoader對(duì)象,signer對(duì)象, protection domain對(duì)象被類(lèi)引用,只有當(dāng)類(lèi)被回收了,這些才能被回收

局部變量(線程棧中)的作用域?yàn)橐粋€(gè)大括號(hào)

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可以被回收了分析工具簡(jiǎn)介

分析dump文件,我們可以用jdk里面提供的jhat工具,執(zhí)行

jhat xxx.dump

jhat加載解析xxx.dump文件,并開(kāi)啟一個(gè)簡(jiǎn)易的web服務(wù),默認(rèn)端口為7000,可以通過(guò)瀏覽器查看內(nèi)存中的一些統(tǒng)計(jì)信息

一般使用方法

瀏覽器打開(kāi)http:/127.0.0.1:7000

深度分析java dump文件

會(huì)列出一些功能,包括package下面各個(gè)類(lèi)的概覽,及各個(gè)功能導(dǎo)航

點(diǎn)擊頁(yè)面的堆內(nèi)存統(tǒng)計(jì)

深度分析java dump文件

有一個(gè)表格,對(duì)象類(lèi)型,實(shí)例個(gè)數(shù),實(shí)例所占用內(nèi)存大小,哪種類(lèi)型的對(duì)象占用了內(nèi)存最多一目了然

點(diǎn)擊其中認(rèn)為內(nèi)存消耗太多的類(lèi)名查看類(lèi)詳情

深度分析java dump文件

主要展現(xiàn)該類(lèi)下面各個(gè)實(shí)例的大小,以及一些鏈接導(dǎo)航

點(diǎn)擊references summary by type

深度分析java dump文件

如果某種類(lèi)型的對(duì)象太多,那么有可能是引用它的那個(gè)類(lèi)的對(duì)象太多

基本上一些簡(jiǎn)單頁(yè)面的查詢(xún),結(jié)合原代碼,就可以初步定位內(nèi)存泄漏的地方

綜上,dump文件結(jié)構(gòu)還是比較簡(jiǎn)單的,這對(duì)于分析線程的執(zhí)行情況非常有用,也是每一個(gè)Java程序員必須掌握的高級(jí)技能之一,你學(xué)會(huì)了嗎?

以上就是深度分析java dump文件的詳細(xì)內(nèi)容,更多關(guān)于java dump文件的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品久av福利在线观看| 国产亚洲第一伦理第一区| 91精品国产乱码久久久久久久| 午夜欧美精品久久久久久久| 麻豆久久久久久| 欧美日韩精品一区二区三区视频 | 欧美日韩国产高清| 国产精选久久| 久久av在线| 一区二区精彩视频| 亚洲二区精品| 亚洲一区二区三区无吗| 亚洲精品成人一区| 亚洲91精品| 国产专区一区| 亚洲午夜国产成人| 久久久免费人体| 成人三级高清视频在线看| 亚洲精品永久免费视频| 亚洲激情欧美| 日本成人在线视频网站| 免费在线亚洲| 欧美日韩国产在线一区| 久久久精品网| 激情91久久| 亚洲理论在线| 中文不卡在线| 麻豆久久一区| 性色av一区二区怡红| 香蕉精品999视频一区二区| 日本免费一区二区视频| 麻豆国产精品777777在线| 久久久亚洲一区| 一区二区亚洲视频| 国产成人免费av一区二区午夜| 免费不卡在线视频| 国内一区二区三区| 亚洲一区二区日韩| 亚洲永久av| 日韩国产在线一| 色爱av综合网| 国产乱码精品一区二区三区亚洲人 | 日本色综合中文字幕| 欧美日韩国产免费观看视频| 日本欧美一区二区在线观看| 国产亚洲一区二区手机在线观看| 亚洲在线观看| 欧美激情精品| 亚洲精品大片| 亚洲欧洲午夜| 亚洲激情不卡| 国产精品v日韩精品v欧美精品网站| 精品中文一区| 欧美羞羞视频| 欧美片网站免费| 亚洲精品影院在线观看| 美女毛片一区二区三区四区| 国产精品18| 国产精品亚洲欧美| 欧美亚洲色图校园春色| 香蕉久久国产| 亚洲欧美日韩国产一区| re久久精品视频| 久久婷婷久久| 日韩精品91| 欧美丝袜一区| 欧美日韩一区二区综合| 伊人久久高清| 国户精品久久久久久久久久久不卡| 成人在线网站| 亚洲午夜免费| 日韩av中文字幕一区| 国产精品一区二区精品 | 国产精品久久久久久妇女| 欧美精品观看| 午夜久久中文| 四虎国产精品免费久久| 欧美一级全黄| 麻豆国产91在线播放| 国产一区二区三区四区五区传媒| 合欧美一区二区三区| 亚洲精品极品| 国产一区二区三区四区五区| 精品中文字幕一区二区三区av| 在线 亚洲欧美在线综合一区| 中文一区一区三区免费在线观 | 欧美特黄一区| 亚洲精品一级二级三级| 国产精品亚洲欧美日韩一区在线 | 中文字幕日韩亚洲| 国产精品激情电影| 午夜欧美巨大性欧美巨大| 精品入口麻豆88视频| 国精品一区二区| 久久久亚洲欧洲日产| 91精品国产调教在线观看 | 亚洲精选91| 成人台湾亚洲精品一区二区| 一区在线观看| 久久国产影院| 欧美一级二级视频| 91成人精品视频| 国产在线视频欧美一区| 国产欧美一区二区三区国产幕精品 | 久久精品99国产精品日本| 色婷婷久久久| 欧美黑人做爰爽爽爽| 91九色综合| 国产亚洲福利| 免费高潮视频95在线观看网站| 日本特黄久久久高潮| 日本不卡高清| 亚洲一区二区三区久久久| 黄在线观看免费网站ktv| 欧美成人一二区| 久久在线电影| 日韩欧美网址| 黑人精品一区| 人人香蕉久久| av中文资源在线资源免费观看| 日韩av不卡一区二区| 久久亚洲国产精品一区二区| 国产精品99视频| 国产一区福利| 精品九九久久| 丝袜美腿诱惑一区二区三区| 国产三级精品三级在线观看国产| 亚洲久草在线| 欧美一区成人| 国产精品.xx视频.xxtv| 日本不卡视频在线观看| 亚洲丝袜啪啪| 亚洲91网站| 亚洲欧美日韩国产综合精品二区 | 亚洲精品乱码日韩| 中文字幕日韩亚洲| 亚洲精品第一| 国产精品探花在线观看| 老司机精品视频在线播放| 国产精品一线天粉嫩av| 欧美黄色一区| 亚洲h色精品| 免费视频久久| 石原莉奈一区二区三区在线观看| 在线精品一区| 国产欧美日韩综合一区在线播放| 国产毛片久久久| 欧美日韩亚洲三区| 91亚洲国产| 亚洲伊人影院| 国产粉嫩在线观看| japanese国产精品| 69堂精品视频在线播放| 日韩啪啪电影网| 亚洲国产日韩欧美在线| 国产亚洲精品v| 国产精品成人国产| 欧美日韩第一| 久久精品国产99| 国产精品美女| 精品在线网站观看| 亚洲欧美日韩一区在线观看| 欧美黄页在线免费观看| 日本国产精品| 国产亚洲高清一区| 日韩视频中文| 国产夫妻在线| 91亚洲无吗| 日韩精品一二三四| 国内自拍视频一区二区三区| 视频国产精品| 中文精品视频| 亚洲天堂免费电影| 麻豆视频一区二区| 日韩精品亚洲一区二区三区免费| 中文字幕在线官网| 国产亚洲精品精品国产亚洲综合| 午夜国产精品视频| 久久精品影视| 色婷婷亚洲mv天堂mv在影片| 日韩va欧美va亚洲va久久| 狠狠干综合网| 国产高清久久| 久久久噜噜噜| 国产成人精品免费视| 国产美女亚洲精品7777| 亚洲免费观看高清完整版在线观| 麻豆91在线播放| 国产伦理久久久久久妇女| 五月亚洲婷婷 | 亚洲日本免费电影| 成人一区而且| 国产一二在线播放| 国产欧美一区二区三区精品酒店| 麻豆国产精品| 色爱综合网欧美| 秋霞国产精品| 在线精品视频在线观看高清| 婷婷亚洲综合| 日韩在线观看一区二区三区|