jvm創建對象的內存分配過程
1、逃逸對象在棧上分配
通過在棧上為對象分配內存,使對象占用的內存空間隨著方法結束棧幀彈出而銷毀,避免了GC垃圾收集器回收對象,減小GC的壓力;
棧上分配內存依賴逃逸分析和標量替換。
逃逸分析:
- 分析對象的動態作用域
- 逃逸:當一個對象在方法中被定義后,可能被外部對象所引用,比如方法返回了該對象,則該對象的作用域范圍不確定,可能存在被其他對象訪問
- 沒有逃逸:當對象在方法內使用,作用域僅在方法內部,比如實體對象入庫完就結束了
標量替換:
- 通過逃逸分析確定對象不會被外部訪問之后,會將對象在棧上創建,通過標量替換將對象進一步分解,將該對象的成員變量分解為方法的成員變量,在棧幀或者寄存器為這些代替的成員變量分配空間。
- 啟標量替換參數:-XX:+EliminateAllocations,JDK7之后默認開啟
- 標量與聚合量:標量不可被進一步分解的量,java的基本數據類型int、long以及reference類型是標量;聚合量是可分解的量,java的對象就是可被進一步分解的聚合量。