內存分佈
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 查看 線程堆棧