一、運行時數據區域
程序計數器、Java虛擬機棧、本地方法棧、Java堆、方法區、運行時常量池、直接內存
二、HotSpot虛擬機對象
- 對象創建:
- 引用檢查
- 類加載檢查
- 分配內存空間:指針碰撞、空閑列表
- 分配空間初始化
- 對象信息設置(對象頭內)
- 對象內存布局:
- 對象頭
- 實例數據
- 對象填充
- 對象訪問定位:
- 句柄訪問
- 直接指針訪問
- OutOfMemoryError(OOM)
- 程序計數器不存在此問題
- Java堆溢出:
- 內存泄漏
- 內存溢出
- 虛擬機棧本地方法棧(HotSpot不區分)溢出
- StackOverFlowError:線程請求棧深度 > 虛擬機允許最大深度
- OutOfMemoryError:虛擬機棧內存允許動態拓展
- 可以通過減小最大堆和減小棧容量換取更多的線程
- 方法區和運行時常量區溢出
- 本機直接內存溢出:HeapDump無明顯異常,可能原因:NIO間接使用DirectMemory
- 垃圾收集器與內存分配策略:對象回收
- 引用計數算法
- 可達性分析算法
- 引用:
- 強引用:Object object = new Object()存在引用賦值,永遠不會回收被引用對象
- 軟引用:還有引用但是非必須的對象,發生內存溢出異常前被二次回收,回收還不夠才會報內存溢出異常
- 弱引用:非必須對象,生存到下一次垃圾回收為止
- 虛引用