JVM 效能調教 (一) - JVM基本結構和物件產生流程
- 本章講述 JVM基本結構和物件產生流程
- Flow 參考網址
- 類裝載器加載Class訊息存放於Method Area
- 每一條thread 創建 java Stack 、PC寄存器
- 創建實例(new)存放於Heap
- 局部變量、參照存放於Java Stack
- 垃圾回收系統處理範圍包含直接內存、Method Area、Heap
- Detail
- *1 Method Area
- 共享空間
- 存放class訊息、常量池( <= jdk1.6)
- 指令
- # -XX:PermSize=5M 初始值 (默認64M)
- # -XX:MaxPermSize=5M 上限值
- 在 JDK 1.8已由Metadata area取代(使用直接內存 , 無預設大小)
- *2 PC寄存器
- 私有空間
- thread總是在執行方法 , PC寄存器會指向正在執行的指令或undefined(本地方法)
- *3 Heap
- 共享空間
- 包含常量池( >= jdk1.7)
- 包含新生代 [ eden 、 s0(from)、s1(to) ]
- 包含老年代 [tenured]
- 每一次回收後 , 保留資料年齡+1
- 例外
- java.lang.OutOfMemoryError
- 指令
- 可將處理對象原本存放在Heap的資料 , 改存在 Stack上 , 好處是當函數結束後自動銷毀 , 不須等待回收機制
- 適用在小而多的對象
- 處理對象不可被任何 thread 訪問 , 例入區域變數或者無返回值
- # -server XX:+DoEscapeAnalysis 啟用分析
- # -XX:+EliminateAllocations 打散在Stack上
- *4 Java Stack
- 私有空間
- 先進後出
- Native Method Stack用於調用local端lib的方法
- 每當函數執行時創建一個Stack frame , 存放局部變量表、中間運算結果 , 函數執行完畢移除
- 例外
- StackOverflowError Exception
- 指令
- 局部變量表的存放空間可重用 , 善用 { } 製造區域變數 , 減少存放空間
- *5 垃圾回收機制
- 指令 System.gc();
- 回收能否成功 , 須看是否有參照=
- 當變量參照=null 或 {}包含 , 方可回收
- 指令
沒有留言:
張貼留言