原文地址:xeblog.cn/articles/25線程
它是一塊較小的內存空間,能夠看做是當前線程所執行的字節碼的行號指示器。在虛擬機的概念模型裏,字節碼解釋器工做時就是經過改變這個計數器的值來選取下一條須要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都須要依賴這個計數器來完成。它是惟一一個在 JVM
規範中沒有規定任何 OOM
狀況的區域。code
它描述的是 Java
方法執行的內存模型:每一個方法在執行的同時都會建立一個棧幀用於存儲局部變量表、操做數棧、動態連接、方法出口等信息。每個方法從調用到執行完成的過程,就對應着一個棧幀在虛擬機中入棧到出棧的過程。在 JVM
規範中對這個區域規定了兩種異常狀況:cdn
StackOverflowError
異常。OutOfMemoryError
異常。它和虛擬機棧所發揮的做用是很是類似的,它們之間的區別不過是虛擬機棧爲虛擬機執行 Java
方法(也就是字節碼)服務,而本地方法棧則爲虛擬機使用到的 Native
方法服務。對象
對於大多數應用來講,Java堆
是 JVM
所管理的內存中最大的一塊,它是被線程共享的一塊內存區域。在虛擬機啓動時建立此內存區域的惟一目的就是存放對象的實例,幾乎全部的對象實例都在這裏分配內存。Java堆
是垃圾收集器管理的主要區域(GC堆)。若是在堆中沒有內存完成內存分配,且堆也沒法再擴展時,將會拋出 OOM
異常。blog
它和 Java堆
同樣,也是各個線程共享的內存區域。它用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯後的代碼等數據。當方法區沒法知足內存分配需求時,將會拋出 OOM
異常。接口
它屬於方法區的一部分。Class
文件中除了有類的版本字段、方法、接口等描述信息外,還有一項信息是常量池,用於存放編譯期生成的各類字面量和符號引用,這部份內容將在類加載後進入方法區的運行時常量池中存放。內存