java內存區域與內存溢出異常(2)
3.本地方法棧
本地方法棧與虛擬機棧作用相同,不同的是虛擬機棧為java方法服務,本地方法棧為native方法服務,本地方法棧會拋出StackOverFlowError和OutOfMemoryError異常
4.Java堆(Java Heap)
Java堆是Java虛擬機所管理的內存中最大的一塊。Java堆是被所有線程共享的一塊內存區域,在虛擬機啟動時創建。此內存區域的唯一作用是存放對象實例,幾乎所有的對象實例都在這裏分配內存。
Java堆是垃圾收集器管理的主要區域,也被成為GC堆。
根據Java虛擬機規範的規定,Java堆可以處於物理上不連續的內存空間中,只要邏輯上是連續的即可。在實現時,既可以實現成固定大小的,也可以是可擴展的,當前主流虛擬機按照可擴展來實現(通過-Xmx和-Xms控制)。如果在堆中沒有內存完成實例分配,並且堆也無法再擴展時,將會拋出OutOfMemoryError異常。
5.方法區
方法區與Java堆一樣,是各個線程共享的內存區域,它用於存儲已被虛擬機加載的類信息、常量、靜態常量、即時編譯器編譯後的代碼等數據。Java虛擬機對這個區域的限制非常寬松,除了和Java堆一樣不需要連續的內存和可以選擇固定的大小或者可擴展外,還可以選擇不實現垃圾收集。相對而言,垃圾收集行為在這個區域是比較少出現。這個區域的內存回收目標主要是針對常量池的回收和對類型的卸載,一般來說此區域的回收比較差。
根據Java虛擬機規範的規定,當方法區無法滿足內存分配的需求時,將拋出OutOfMemoryError異常。
6.運行時常量池
運行時常量池是方法區的一部分。Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用於存放編譯期生成的各種字面量和符號引用,這部分內容將在類加載後存放到方法區的運行時常量池中。
運行時常量池相對於Class文件常量池的另外一個重要的特征是具備動態性,Java語言並不要求常量一定只能在編譯期產生,運行期間也可能將新的常量放入池中,例如String類的intern()方法
java內存區域與內存溢出異常(2)