JVM 基礎知識和JVM性能檢測

1:JVM內存模型

所有線程共享區:方法區(元數據)、堆

線程私有區:java虛擬機棧、本地方法棧、程序計數器。

以下是對這5個進行詳細說明。

程序計數器(線程私有):用來存儲指向下一條指令的地址,內存特別小
本地方法棧(線程私有):登記native方法
java棧(線程私有): Java線程執行方法的內存模型,一個線程對應一個棧,每個方法在執行的同時都會創建一個棧幀
方法區(共享):類的所有字段和方法字節碼,以及一些特殊方法如構造函數,接口代碼也在此定義
堆(共享):虛擬機啓動時創建,用於存放對象實例,幾乎所有的對象(包含常量池)都在堆上分配內存,同時也是垃圾收集器管理的主要區‘’

堆關係到的東西比較多:

1:垃圾收集機制

2:jvm調優

3:堆外內存:也是直接內存,常見的爲 nio中 ByteBuffer.allocateDirect(),垃圾收集機制影響不了這裏,這個內存是操作系統直接管理的。

4:堆的分代

堆:
新生代(1/3) 老年代(2/3)
新生代 分爲 Eden/From/To

新生代存放:比較小,時長比較小
老年代:比較大 存放時長比較大

輕GC
重GC(full GC) -> STW(停止事件),fallGc特別費資源

Eden -> from <-> To    -> old
對象在from和to循環15(默認)次之後,會放到老年代

 

垃圾收集機制:

1:可達性分析:

引用計數:爲所有的對象的引用進行計算,如果引用數爲0,那麼需要者個對象是垃圾收集的目標。(循環引用問題,java沒有采納這種)
可達性分析:從GC ROOTS出發,可以到達的對象就是有引用的,到達不了的對象就是需要垃圾回收的。

GC ROOTS:靜態對象,類的成員常量對象,棧中的對象,jni引用的對象。

2:垃圾收集算法

1)標記清除

2)標記整理

3)複製

 

年輕代主要是以複製算法爲主,老年代主要以標記整理算法爲主。

 

垃圾收集器:

CMS:   併發標記清理(Concurrent Mark Sweep,CMS),適用於老年代

G1:基於標記整理算法,不會產生空間碎片。

  分代收集,收集範圍包括新生代和老年代    

      能獨立管理整個GC堆(新生代和老年代),而不需要與其他收集器搭配;

 

JVM性能檢測工具:

一般出現內存異常,可以使用如下方法進行檢測:

1:通過top命令,查看應用程序的運存大小

2:用jmap查看 java堆內存(如果可以用JConsole,效果會更好)

3:用jstack查看java線程信息

一般使用下面幾個語句就可以了:

jps  查看java進程,java的 ps命令
jinfo 查看jvm參數,查看jvm運行參數
jstat 查看 垃圾回收的次數、時間
jmap 導出 hprof文件,堆內存快照
jstack 生成java虛擬機的線程快照

jmap的使用:
jmap -histo 15260 > map.histo //生產 histo模式,可以用記事本打開,查看對象的大小
jmap -dump:format=b,file=C:/Users/xiaoluo/map.hprof 15261  //生產hprof,可以用Visual VM 打開
也可以用 jhat 進行解析
C:\Users\xiaoluo>jhat C:/Users/xiaoluo/map.hprof
Reading from C:/Users/xiaoluo/map.hprof...
Dump file created Tue Jun 30 22:33:26 SGT 2020
Snapshot read, resolving...
Resolving 19720 objects...
Chasing references, expect 3 dots...
Eliminating duplicate references...
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

瀏覽器打開:http://localhost:7000/ 在瀏覽器上可以看到內存快照信息
jstat的使用:



還有,可以使用java自帶的圖形用戶界面,在 bin下JConsole.exe,如果設置了環境變量,可以在cmd上直接輸入JConsole.exe
jConsole java圖形用戶界面,查看內存等信息

選擇要分析的進行,然後進行分析即可。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章