日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java jmap 分析_利用java虚拟机的工具jmap分析java内存情况

發布時間:2023/12/19 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java jmap 分析_利用java虚拟机的工具jmap分析java内存情况 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有時候碰到性能問題,比如一個java application出現out of memory,出現內存泄漏的情況,再去修改bug可能會變得異常復雜,利用工具去分析整個java application 內存占用情況,然后再去走查代碼。

首先先看一下,java內存分配的基本模型,由于JVM內存劃分比較復雜,這里只是簡單的說一下java內存劃分

java 堆(heap):

Java?堆是被所有線程共享的一塊內存區域,在虛擬機啟動時創建。此內存區域的

唯一目的就是存放對象實例,幾乎所有的對象實例都在這里分配內存。

Java?堆是垃圾收集器管理的主要區域,因此很多時候也被稱做“GC?堆”

所以Java?堆中還可以細分為:新生代和老年代;

新生代:所有新生成的對象首先都是放在年輕代的。年輕代的目標就是盡可能快速的收集掉那些生命周期短的對象。

老年代(old Generation):在年輕代中經歷了N次垃圾回收后仍然存活的對象,就會被放到年老代中。因此,可以認為年老代中存放的都是一些生命周期較長的對象

持久代(Prem Generation):用于存放靜態文件,如今Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應用可能動態生成或者調用一些class,例如Hibernate等,在這種時候需要設置一個比較大的持久代空間來存放這些運行過程中新增的類。持久代大小通過-XX:MaxPermSize=進行設置。

再細致一點的有Eden?空間、From Survivor?空間、To Survivor?空間等。如果從內存分配

的角度看,線程共享的Java?堆中可能劃分出多個線程私有的分配緩沖區(Thread Local

Allocation Buffer,TLAB)。不過,無論如何劃分,都與存放內容無關,無論哪個區域,

存儲的都仍然是對象實例,進一步劃分的目的是為了更好地回收內存,或者更快地分配內存。

java 棧區:

JVM中運行的每個線程都擁有自己的線程棧,線程棧包含了當前線程執行的方法調用相關信息,我們也把它稱作調用棧。隨著代碼的不斷執行,調用棧會不斷變化。

一般認為 方法,局部變量,對象的引用 都是存在棧區內的。

java方法區:

方法區(Method Area)與Java?堆一樣,是各個線程共享的內存區域,它用于存

儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。

很多人稱之為永生代(Permanent Generation);

出現out of memory 接著會出現 java heap space,這種情況是堆空間滿了,

可能出現的情況,比如一個方法 進棧了,里面有一段邏輯,最常見的就是打個比方

public void method(){

List list=...;

.... 執行代碼的邏輯

}

這個list 里面有N多對象,但是執行下面的邏輯時內存溢出,這是因為方法在沒有出棧之前,java heap中的對象太多(方法在出棧之后GC 對 沒有引用的 對象進行垃圾回收)。

還有 就是有一些全局的變量或者集合 ,或者存在方法區的 內存 沒有進行及時清理,導致內存沒有釋放,這種稱之為真泄漏。

2.1 利用jmap 進行內存分析,

jmap -heap pid //打印heap空間的概要,這里可以粗略的檢驗heap空間的使用情況。

Heap Configuration:指java應用啟動時設置的JVM參數。像最大使用內存大小,年老代,年青代,持久代大小等。

Heap Usage:當時的heap實際使用情況。包括新生代、老生代和持久代。

其中新生代包括:Eden區的大小、已使用大小、空閑大小及使用率。Survive區的From和To同樣。

有這個可以很簡單的查看本進程的內存使用情況。

可以用于分析堆內存分區大小是否合理,新生代和老生代的大小分配是否合適等。

也許進程占用的總內存比較多,但我們在這里可以看到真正用到的并沒有多少,很多都是"Free"。內存使用的堆積大多在老年代,內存池露始于此,所以要格外關心“Old Generation”。

jmap -histo PID //這里會生成一個類的統計報表,此表非常簡單,如顯示什么類有多少個實例,共占了多少字節等。

2.2 ?利用jmap 生成dump 文件,然后再利用mat工具進行分析。

jmap -dump:live,format=b,file=‘文件名 ’2657 //2657 是進程的PID 號

生成轉儲文件之后,file -open(該轉儲文件)

上面的餅狀圖顯示了內存分配的比例,通過dominator_tree可以看到詳細信息。

總結

以上是生活随笔為你收集整理的java jmap 分析_利用java虚拟机的工具jmap分析java内存情况的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。