精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

干貨分享丨jvm系列:dump文件深度分析

開發 后端
java內存dump是jvm運行時內存的一份快照,利用它可以分析是否存在內存浪費,可以檢查內存管理是否合理,當發生OOM的時候,可以找出問題的原因。

JVM dump

java內存dump是jvm運行時內存的一份快照,利用它可以分析是否存在內存浪費,可以檢查內存管理是否合理,當發生OOM的時候,可以找出問題的原因。那么dump文件的內容是什么樣的呢?我們一步一步來

獲取JVM dump文件

獲取dump文件的方式分為主動和被動

i.主動方式:

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

2.利用jcmd,jcmd GC.heap_dump

3.使用VisualVM,可以界面操作進行dump內存

4.通過JMX的方式 

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

參考(https://www.baeldung.com/java...

ii.被動方式:

被動方式就是我們通常的OOM事件了,通過設置參數-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=

dump文件分析

結構示意圖

結構詳解

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

文件頭

由musk, 版本,identifierSize, 時間4部分組成

1、musk:4個byte,內容為'J', 'A', 'V', 'A'即JAVA

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

  1. " PROFILE 1.0\0",  
  2. " PROFILE 1.0.1\0",  
  3. " PROFILE 1.0.2\0"  

3、identifierSize:4個byte數字,值為4或者8,表示一個引用所占用的byte數

4、time:8個byte,dump文件生成時間

說明:java一個類的成員變量有兩種類型

  1. 基本類型(8種基本類型),它們占用byte數固定不變,每生成一個對象它們就需要給它們賦初始值,分配空間
  2. 是引用類型,表示一個對象,在類中只有一個引用,引用只是一個數值,所占用的空間大小為identifierSize,被引用對象即將在堆中的另一個地方

        例如定義一個類 

  1. public class Person {  
  2.  private int age;//4個byte  
  3.  private String name;//identifierSize個byte  
  4.  private double weight;//8個byte  
  5.  

當我們在new Person()的時候

它就需要申請一個空間,空間大小為 對象頭大小+4+identifierSize+8個byte

對象大小的測量:

jdk提供一個測試對象占用內存大小的工具Instrumentation,但是Instrumentation沒法直接引用到,需要通過agent來引用到

定義一個Premain類, javac Premain.java 

  1. //Premain.java  
  2. public class Premain {  
  3.     public static java.lang.instrument.Instrumentation inst;  
  4.     public static void premain(String args, java.lang.instrument.Instrumentation inst) {  
  5.         Premain.inst = inst;  
  6.     }  
  7.  

編寫一個Manifest文件 

  1. manifest.mf  
  2. Manifest-Version: 1.0  
  3. Premain-Class: Premain  
  4. Can-Redefine-Classes: true  
  5. Can-Retransform-Classes: true  

打包 

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

定義一個執行類, javac PersonTest.java 

  1. //PersonTest.java  
  2. public class PersonTest {  
  3.     public static void main(String[] args) throws Exception {  
  4.         Class clazz = Class.forName("Premain");  
  5.         if (clazz != null) {  
  6.             Person p = new Person();  
  7.             java.lang.instrument.Instrumentation inst = (java.lang.instrument.Instrumentation)clazz.getDeclaredField("inst").get(null);  
  8.             System.out.println("person size:[" + inst.getObjectSize(p) + "]B");  
  9.             System.out.println("class size:[" + inst.getObjectSize(p.getClass()) + "]B"); 
  10.         }  
  11.     }  
  12.  

帶agent執行 

  1. java -javaagent:premain.jar PersonTest 

結果: 

  1. person size:[32]B  
  2. class size:[504]B  

內容塊

每個塊都是塊頭和塊體組成

塊頭

塊頭由1個byte的塊類型,4個byte的時間time,4個byte的長度表示此內容塊占用byte數

type類型一般有5種,字符串,類,棧楨,棧,及dump塊

  1. 字符串,由identifierSize個byte的字符串id,后面是(length-identifierSize)個byte的字符串內容(后續對字符串是直接引用的這里面的id)
  2. 類,由4個byte的類序列(在棧楨中使用),identifierSize個byte的類id(解析類的時候用到),4個byte的序列id(暫未使用),identifierSize個byte的類名id
  3. 棧楨,由identifierSize個byte的楨id,identifierSize個byte的方法名id,identifierSize個byte的方法標識id,identifierSize個byte的類文件名id,4個byte的類序列,4個byte的行號
  4. 棧,由4個byte的棧序號,4個byte的線程序號,4個byte的楨數量,后面就是若干個identifierSize個byte的楨id
  5. dump塊就是所有對象的內容了,每個對象由1個byte的子類型,和對象內容結成,子類型有6種,gc root, 線程對象,類,對象,基本類型數組,對象數組

gc root

gc root有4種結構,8種類型

  1. identifierSize個byte的對象id,類型有SYSTEM_CLASS,BUSY_MONITOR, 及未UNKNOWN
  2. identifierSize個byte的對象id,4個byte的線程序列號,類型有NATIVE_STACK,THREAD_BLOCK
  3. identifierSize個byte的對象id,4個byte的線程序列號,4個byte的棧楨深度,類型有JAVA_LOCAL,NATIVE_LOCAL
  4. identifierSize個byte的對象id,identifierSize個byte的global refId(暫未使用),類型有NATIVE_STATIC

gc root示意圖

gc root為垃圾收集追溯的源頭,每個gc root都指向一個初始對象,無法追溯的對象是要被回收掉的

系統類,只有classLoader為null的類才是gc root,每個類都是一個gc root

線程棧,線程中方法參數,局部變量都是gc root,每個對象都是一個gc root

系統保留對象,每個對象都是一個gc root

類對象

1、基本信息:

  1. identifierSize個byte的類對象id
  2. 4個byte的棧序列號,
  3. identifierSize個byte的父類對象id,
  4. identifierSize個byte的classLoader對象id,
  5. identifierSize個byte的Signer對象id,
  6. identifierSize個byte的protection domain對象id,
  7. identifierSize個byte的保留id1和id2,
  8. 4個byte的類實例對象大小,
  9. 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)

     10. 2個byte的靜態變量個數,后面是每個靜態變量的,identifierSize個byte的變量名id, 1個byte的變量類型,和若干個byte的內容,內容根據類型來決定(見類對象基本信息的第9條)

      11.  2個byte的成員變量個數,后面是每個成員變量的,identifierSize個byte的變量名id,1個byte的變量類型

2、說明:

(1)類里面的常量很多地方都沒有用上,所以常量個數一般為0

(2)類的靜態變量的名稱類型及值是放在類對象里面的,成員變量的名稱和類型也是放在類對象里面的,但是實例的值是放在實例對象里面的

實例對象

1、基本信息:

  1. identifierSize個byte的實例對象id
  2. 4個byte的棧序列號
  3. identifierSize個byte的類id
  4. 4個byte的占用字節數
  5. 實例的變量的值

2、說明:

  1. 實例的值為實例對象的成員變量值,順序為當前類的變量值,順序為類對象基本信息中第11條中的順序,然后是父類的變量值
  2. 變量的值基本類型都有默認值,引用類型默認值為0,占用字節數(見類對象基本信息的第9條)

基本類型數組

1、基本信息:

  1. identifierSize個byte的數組對象id
  2. 4個byte的棧序列號
  3. 4個byte的數組長度
  4. 1個byte的元素類型
  5. 元素的值列表

2、說明:

  1. 元素的值(見類對象基本信息的第9條)

對象數組

1、基本信息:

  1. identifierSize個byte的數組對象id
  2. 4個byte的棧序列號
  3. 4個byte的數組長度
  4. identifierSize個byte的元素類id
  5. 元素的值列表

內存分配

當一個線程啟動的時候,進程會去系統內存生成一個線程棧

每當發生一次方法調用,就會向棧中壓入一個棧楨,當方法調用完之后,棧楨會退出

在運行過程中,如果有對象的new操作的時候,進程會去堆區申請一塊內存

關于運行時內存的詳細情況,可以查找相關的資料

內存回收規則

如果一個對象不能騎過gc root引用可達,那么這個對象就可能要被回收

對象回收規則包括

  1. 實例屬性被實例引用,只有當實例被回收了實例屬性才能被回收(只針對強引用)
  2. 類對象被實例引用,只有當一個類的所有實例都被回收了,類才能被回收
  3. 類對象的父類,classLoader對象,signer對象, protection domain對象被類引用,只有當類被回收了,這些才能被回收
  4. 局部變量(線程棧中)的作用域為一個大括號 
  1. public void test(){  
  2. Object a = new Object();//obj 1  
  3. Object b = new Object();//obj 2  
  4.  
  5. Object c = new Object();//obj 3  
  6. a = null;//obj 1可以被回收了  
  7. }//obj 3可以回收了  
  8. }//obj 2可以被回收了 

 

分析工具簡介

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

  1. jhat xxx.dump 

jhat加載解析xxx.dump文件,并開啟一個簡易的web服務,默認端口為7000,可以通過瀏覽器查看內存中的一些統計信息

一般使用方法

1、瀏覽器打開http:/127.0.0.1:7000

會列出一些功能,包括package下面各個類的概覽,及各個功能導航

2、點擊頁面的堆內存統計

有一個表格,對象類型,實例個數,實例所占用內存大小,哪種類型的對象占用了內存最多一目了然

3、點擊其中認為內存消耗太多的類名查看類詳情

主要展現該類下面各個實例的大小,以及一些鏈接導航

4、點擊references summary by type

如果某種類型的對象太多,那么有可能是引用它的那個類的對象太多

基本上一些簡單頁面的查詢,結合原代碼,就可以初步定位內存泄漏的地方

綜上,dump文件結構還是比較簡單的,這對于分析線程的執行情況非常有用,也是每一個Java程序員必須掌握的高級技能之一,你學會了嗎? 

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2023-11-19 23:29:22

Heap DumpJava

2017-09-26 16:32:03

JavaGC分析

2020-10-19 09:09:46

Class文件加載過程

2020-11-17 09:55:48

Java

2016-12-28 19:50:33

大數據數據采集大數據平臺

2017-09-20 08:48:09

JVM內存結構

2016-11-09 15:23:44

2018-09-03 13:14:41

小程序APP微信

2017-09-22 15:15:23

jvm調優命令

2017-11-01 15:38:54

jvm知識點總覽

2017-10-17 14:02:30

jvm調優工具

2018-02-06 09:25:35

數據分析分析方法分析工具

2021-10-11 19:54:04

JVM面試虛擬機

2017-02-07 16:16:02

2019-10-24 10:28:06

2012-01-11 11:28:00

JavaJVM

2024-06-04 12:32:42

.NET開發內存泄漏

2020-07-21 14:19:18

JVM編程語言

2017-07-06 13:18:37

深度學習應用問題及趨勢

2021-11-21 23:03:38

jvm調優虛擬機
點贊
收藏

51CTO技術棧公眾號

中文字幕日韩第一页| 级毛片内射视频| 华人av在线| 久久久久久一二三区| 欧美在线免费观看| 少妇视频一区二区| 91精品尤物| 一本色道**综合亚洲精品蜜桃冫 | 97超碰资源站| 樱桃成人精品视频在线播放| 一本大道亚洲视频| 熟妇女人妻丰满少妇中文字幕| 国产99在线| 国产精品久久久久影院| 国产在线一区二区三区四区| 手机av免费观看| 极品裸体白嫩激情啪啪国产精品| 国产亚洲xxx| 午夜不卡久久精品无码免费| 丰满少妇一区| 精品女同一区二区三区在线播放| 国产精品h视频| 日本成人一区| 国产成人免费av在线| 国产成人鲁鲁免费视频a| 欧美成人免费观看视频| 日韩中文在线电影| 亚洲国产日韩欧美在线图片| 亚洲欧美天堂在线| 欧美色网在线| 欧美日韩亚洲网| 国产传媒久久久| 黄色精品免费看| 欧美激情一区三区| 久久久久欧美| 韩国av永久免费| 国产一区二区精品久久99| 国产精品美女主播| 超碰在线观看91| 亚洲在线观看| 91av免费观看91av精品在线| 久久久久久久久久久久久久免费看| 99精品在线观看| 色偷偷综合社区| 欧美三级视频网站| 国产一区二区三区站长工具| 日韩成人av网| 在线视频 日韩| av成人男女| 日韩亚洲欧美在线| 中文字幕12页| 麻豆久久一区| 欧美成人猛片aaaaaaa| 能看毛片的网站| 国产在线不卡一区二区三区| 欧美一区二区三区精品| 美女被艹视频网站| 久久久精品区| 精品国产三级电影在线观看| www.17c.com喷水少妇| av综合网页| 亚洲第一中文字幕| 中文字幕乱码在线| 网红女主播少妇精品视频| 亚洲精品ady| 一级国产黄色片| 免费国产自久久久久三四区久久| 精品中文字幕久久久久久| 精品少妇人妻一区二区黑料社区| 九色精品国产蝌蚪| 一区二区三区精品99久久| 国产在线综合视频| 91精品国产91久久综合| 久久久久久国产精品美女| 国产乡下妇女做爰视频| 久久xxxx精品视频| 国产欧美精品久久久| 国产强被迫伦姧在线观看无码| 国产精品一区二区黑丝| 国产精品果冻传媒潘| 天堂中文字幕在线| 日本一区二区三区国色天香 | 国产肉体xxxx裸体784大胆| 牛牛影视久久网| 亚洲欧美日韩爽爽影院| 四虎影视1304t| 欧美精品观看| 人人澡人人澡人人看欧美| 亚洲一级在线播放| 成人av免费在线| 日韩影院一区| 蜜臀av在线| 欧洲中文字幕精品| 黄色片免费网址| 亚洲人挤奶视频| 久久在精品线影院精品国产| 亚洲综合一二三| 蜜臀久久99精品久久久久宅男| 2014国产精品| 欧美视频综合| 一区二区三区中文在线| 国产精品第12页| 精品国产亚洲一区二区三区大结局| 日韩黄色在线免费观看| 国产精品免费在线视频| 日韩亚洲在线| 91免费人成网站在线观看18| 五月婷婷深深爱| 亚洲欧洲精品成人久久奇米网| 免费av观看网址| 中文字幕成人| 亚洲精品资源美女情侣酒店| 国产97免费视频| 日韩av一区二区三区| 国产精品免费一区二区三区在线观看 | 中文日韩电影网站| 日本三级2019| 国产精品一色哟哟哟| **性色生活片久久毛片| 国产精品福利久久久| 精品黑人一区二区三区国语馆| 国产亚洲综合性久久久影院| 可以看毛片的网址| 国产精品久久久久久久久久辛辛 | 欧美日本一区二区在线观看| 18禁裸乳无遮挡啪啪无码免费| 在线国产一区二区| 国产精品极品美女在线观看免费| 亚洲av成人精品日韩在线播放| 亚洲美女偷拍久久| 在线观看国产一级片| 欧美猛男男男激情videos| 午夜精品www| 亚洲第一天堂影院| 亚洲精品视频免费看| 伊人色在线视频| 国产国产精品| 国产精品私拍pans大尺度在线| 男女网站在线观看| 欧美日韩在线第一页| 日本免费福利视频| 一本色道久久| 精品免费二区三区三区高中清不卡| 欧美黄色视屏| 精品国产髙清在线看国产毛片| 九九热只有精品| 国产91精品入口| 国产精品免费看久久久无码| 日韩一区二区三区精品| 美女视频久久黄| 亚洲AV无码精品色毛片浪潮| 一区二区三区四区亚洲| 欧美熟妇另类久久久久久多毛| 欧美99久久| 国产精品久久久久久久久久久久午夜片 | 久久福利小视频| 亚洲经典视频在线观看| 国产伦精品一区二区三区四区视频| 国产高清在线a视频大全| 日韩精品一区二区三区视频播放 | 不卡一二三区| 亚洲视频欧洲视频| 亚洲视屏在线观看| 亚洲天堂av老司机| 99国产精品免费视频| 国内精品福利| 女女同性女同一区二区三区91| 一区二区三区四区日本视频| 中文字幕精品久久| 国产精品视频在线观看免费 | 成人免费毛片男人用品| 欧美国产精品专区| 五月天婷婷影视| 国产在线成人| 精品亚洲欧美日韩| 蜜桃视频成人m3u8| 久久成人精品一区二区三区| 亚洲国产中文字幕在线| 欧美午夜激情视频| 国产一区二区三区视频播放| 国产精品一卡二卡| 国产精品裸体瑜伽视频| 成人免费在线观看av| 亚洲字幕一区二区| 国产资源在线观看入口av| 国产一区二区精品丝袜| 国产精品久久久久久久成人午夜| 亚洲高清免费视频| 九九热免费在线| 成人黄色国产精品网站大全在线免费观看| 欧洲黄色一级视频| 欧美国产一级| 精品国产中文字幕| japansex久久高清精品| 69视频在线播放| 免费在线看黄网站| 日韩精品www| 国产乱叫456在线| 粉嫩av一区二区三区免费野| 日韩在线视频网址| 久久综合av免费| 久久出品必属精品| 老鸭窝91久久精品色噜噜导演| 中文字幕第50页| 波多野结衣一区| 国产精品久久一区二区三区| 色综合视频一区二区三区44| 欧美亚洲视频在线观看| v天堂福利视频在线观看| 亚洲欧美日韩高清| 韩国av免费在线观看| 4438成人网| 无码人妻精品一区二区三区9厂| 一区二区三区小说| 黄色精品视频在线观看| 久久在线观看免费| 大尺度在线观看| 国产一区视频在线看| 在线视频日韩一区| 亚洲专区一区| 日韩中字在线观看| 中文字幕亚洲精品乱码| 艳色歌舞团一区二区三区| 中国av一区| 精品国产乱码久久久久久88av | 欧美sm美女调教| 一级黄色大片免费观看| 一本到不卡免费一区二区| 久久9999久久免费精品国产| 亚洲精品乱码久久久久久黑人 | 88av在线播放| 国产精品影视网| 欧美体内she精高潮| 激情深爱一区二区| 午夜免费看毛片| 日本午夜精品视频在线观看| 欧美亚洲另类色图| 亚洲深夜av| 无码aⅴ精品一区二区三区浪潮| 亚洲激情自拍| 欧美大片在线播放| 亚洲美女视频在线免费观看| 男女啪啪免费视频网站| 黑人一区二区| www.avtt| 在线视频观看日韩| 男的插女的下面视频| 亚洲香蕉网站| 日本福利视频一区| 在线成人h网| 日韩小视频在线播放| 亚洲美女少妇无套啪啪呻吟| 久草热视频在线观看| 亚久久调教视频| 成人性生生活性生交12| 免费欧美日韩国产三级电影| 午夜久久福利视频| 国产乱码精品1区2区3区| 中文字幕第六页| 成人免费视频视频在线观看免费| 中文字幕三级电影| www国产成人| 人妻少妇无码精品视频区| 国产精品妹子av| 顶臀精品视频www| 亚洲高清免费在线| 区一区二在线观看| 欧美另类一区二区三区| 精品人妻无码一区二区| 亚洲国内精品在线| 国产视频福利在线| 精品国产一区二区三区久久| 四虎影院观看视频在线观看 | 天天爱天天做天天爽| 欧美日韩免费高清一区色橹橹| 国产精品伦一区二区三区| 精品电影一区二区| 免费在线性爱视频| 久久精品中文字幕一区| 91九色在线播放| 国产精品久久电影观看| 欧美成人精品一级| 九九九九久久久久| 欧美电影一区| 成年人网站免费视频| 美女视频黄免费的久久| 高清中文字幕mv的电影| 欧美国产一区在线| 男女免费视频网站| 91成人在线精品| 精品人妻一区二区三区麻豆91 | 国产欧美黑人| 2019中文字幕在线| 91丨精品丨国产| 久久亚洲国产精品日日av夜夜| 婷婷精品进入| 成年人免费在线播放| 国产精品亚洲专一区二区三区 | 四虎精品一区二区| 久久久久久**毛片大全| 欧美日韩精品在线观看视频| 色狠狠一区二区三区香蕉| а√中文在线资源库| 这里只有精品丝袜| 女人让男人操自己视频在线观看| 国产日韩欧美视频| 偷拍亚洲精品| 久久香蕉视频网站| 精品一区二区三区免费毛片爱| 一起草在线视频| 亚洲卡通动漫在线| 亚洲无码精品国产| 亚洲人成网站777色婷婷| 电影k8一区二区三区久久| 国产精品一区二区久久久| 全国精品免费看| 日韩精品综合在线| 国产在线精品一区二区不卡了| 谁有免费的黄色网址| 亚洲aⅴ怡春院| 精品人妻无码一区二区色欲产成人| 日韩在线欧美在线| gogo亚洲高清大胆美女人体| 国内精品久久国产| 欧美激情一级片一区二区| 亚洲成人福利在线| 欧美韩日一区二区三区四区| 亚洲欧美自拍视频| 亚洲精品国产美女| 96av在线| 国产一区免费视频| 亚洲国产午夜| 中文字幕第3页| 午夜精品影院在线观看| 刘亦菲毛片一区二区三区| 欧美大片免费观看在线观看网站推荐 | 一本到不卡免费一区二区| 桃花色综合影院| 欧美一级大片视频| 亚洲国产合集| 久久精品香蕉视频| 久久综合色天天久久综合图片| 日韩av黄色片| 亚洲精品久久久久国产| 极品视频在线| 欧美婷婷久久| 天堂久久久久va久久久久| 欧美人与性囗牲恔配| 91福利国产成人精品照片| 超碰免费97在线观看| 国产精品免费电影| 久久国产电影| 91国内在线播放| 亚洲同性同志一二三专区| 国产黄色av片| 久久久亚洲影院| 午夜先锋成人动漫在线| 久热免费在线观看| 国产精品网站一区| 国产精品久久777777换脸| 欧美另类交人妖| 国产精品调教视频| 777久久久精品一区二区三区| 久久久久久黄色| 一二区在线观看| 欧美激情xxxx| 欧美禁忌电影网| 亚洲第一成肉网| 亚洲国产一区二区三区青草影视| 无码精品一区二区三区在线| 国产999视频| 一区二区影视| 亚洲观看黄色网| 在线看国产一区| 国产激情在线观看| 国产九区一区在线| 日韩高清不卡一区二区三区| 欧美视频www| 亚洲精品久久久久中文字幕二区| 在线成人视屏 | 91在线三级| 欧美日韩国产精品一卡| 久久99久久久久久久久久久| 国产无遮挡又黄又爽| 亚洲性xxxx| 凹凸成人在线| 亚洲福利精品视频| 亚洲最新视频在线播放| 国产女主播在线写真| 999国产在线| 久久综合亚州| a级片在线观看免费| 一本色道久久综合狠狠躁篇怎么玩| 亚洲欧美一级| 免费av网址在线| 一级特黄大欧美久久久| av在线电影网| 国产九色91| 国内精品视频666| 中文字幕黄色片|