深入理解Java虛擬機 總結

內存分佈
1 程序計數器 : 記錄JVM 運行指令的位置,線程獨立

2  棧 線程獨立,主要是局部變量、操作數

3 堆  線程共享
4 方法區 : 線程共享:類信息、常量、靜態常量, 就是編譯後的代碼等數據

 


內存回收方法:

標記-清除算法(存活對象、可回收、未使用), 最基本的算法,內存碎片太多

複製算法( 保留 兩份,一份使用,一份冗餘):新生代 基本使用此方法; IBM 研究表明 新生代內存 中98% 的對象都會朝生夕死 ,所以Eden 區 : survivor 區 爲8:1;

標記整理算法: 先標記,然後將存活對象 移動到一端,然後直接清理當前端

垃圾收集器

 

新生代收集器
Serial 收集器:  單線程收集, 收集時 Stop the world ,主要用在 Client 模式的應用中 ()

ParNew 收集器: 多線程收集,其餘與Serial 類似,也是stop the world; Server 端 用的比較多,主要是 只有他能與 CMS 配合工作

Parallel scavenge 收集器(吞吐量優先): 也是並行使用copy 算法進行收集,但是其不stop the world;而是可以保留 部分用戶吞吐量

老年代收集器
    Serial old 收集器:標記 整理, 也是stop the wold ,主要用於client 模式,效率高
Parallel old 收集器: Parallel scavenge 的老年代版本,使用標記-整理算法
CMS 收集器(Concurrent Mark Sweep): 最短回收停頓時間; 標記-清除算法


G1 收集器:標記-整理或者 複製算法; 

 

問題定位:
  jps -l  查看進程以及對應的 啓動jar 包
  jps -v 查看jvm 啓動參數
 

  jstat -gc 27280  2000 10 
  jstat -gcutil 27280 2000 10 
  jstat -options 可以查看所有的選項

  jinfo 查看或者調整虛擬機運行參數
   jinfo -flags 27280   查看所有參數
   jinfo -flag ConcGCThreads 23728    查看具體某個參數

 jmap 主要用於生成堆快照
 jmap -dump:live,format=b,file=/tmp/23728_2.prof  23728  
  (jhat 23728_2.prof 可以解析此dump 文件, 生成一個服務器,使用localhost:7000 查看對應數據, 關注 Show heap histogram )

    jstack -l 23728 查看 線程堆棧