一、虛擬內存模型
注:圖中紅色部分爲線程共享,白色部分爲線程私有
二、Java虛擬機棧
作用域:線程私有,生命週期同線程是一樣的
存儲數據:每個方法執行時會首先創建棧幀,存儲局部變量表、操作數棧、動態鏈接和方法出口等信息。
其中局部變量表存儲了基礎數據類型(int、boolean、char、byte、long、short、float、double)和對象引用
異常類型:請求棧深度超過虛擬機允許的棧深度---StackOverflowError;動態擴展棧內存時,無法申請到足
夠內存-----OutOfMemoryError
三、本地方法棧
作用域:執行的是本地Native方法所需要保存的信息,線程私有的區域
異常類型:同虛擬機棧一樣,也會拋出StackOverflowError和OutOfMemoryError異常類型
四、Java堆
作用域:線程共享區域,存放這幾乎所有的創建的對象實例,垃圾回收的主要區域
存儲數據:所有對象創建的實例
異常類型:創建實例沒有內存分配---OutOfMemoryError
五、方法區
作用域:線程共享區域
存儲數據:被虛擬機加載的類信息、常量、靜態變量和編譯後的代碼等數據
異常類型:內存不夠時----OutOfMemoryError
5.1、常量池
作用域:方法區的一部分,所以是線程共享
存儲數據:Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池
(Constant Pool Table),用於存放編譯期生成的各種字面量和符號引用
異常類型:OutOfMemoryError
六、直接內存
作用域:不是虛擬機運行的一部分
存儲數據:可以作爲一個輔助內存來使用,如NIO,可以將直接內存作爲緩衝區來使用,可提高系統的效率。
異常類型:OutOfMemoryError