一段話系列-JVM運行時內存分佈

1.堆

主要用於存放new出來的對象;對於堆中對象的回收,收集器基本都採用分代收集算法,基於此算法,堆可被劃分爲新生代和老年代。java

2. 虛擬機棧

主要用來描述Java方法執行的內存模型,是線程私有的;每一個方法在執行的同時都會建立一個棧幀用於存儲局部變量表操做數棧動態連接方法返回地址等信息,每個方法從調用到執行完成的過程就對應着一個棧幀在虛擬機棧中從入棧到出棧的過程。算法

PS:每一個方法都會建立一個棧幀,因此,若是方法調用嵌套層數過大,則會出現StackOverflowError異常,java虛擬機棧的默認大小是1024KB。優化

3.本地方法棧

與虛擬機棧功能相似,但主要是爲Native方法的服務(如何服務?spa

4.程序計數器

主要用於記錄程序執行到了哪裏;程序計數器是一塊較小的內存空間,在未優化的編譯器中它用來指向當前線程執行的字節碼的行號,由於是指向當前線程的程序,因此程序計數器是線程私有的,每一個線程都有一份程序計數器。線程

5.方法區

主要用於存儲被虛擬機加載的類的信息、常量、靜態變量、即時編譯器編譯後(JIT)的代碼等數據,基於分代收集算法,也可視做永久代(JDK7之前)。對象

    a.運行時常量池

    主要是用於在運行時存放被JVM加載進來的各類字面量和符號引用,是方法區的一部分。blog

    PS:這裏須要提一下常量池這個概念,在Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用於存放編譯器生成的各類字面量和符號引用(即類在被JVM加載進來以前,各類字面量和符號引用是放在字節碼文件裏面,靜態存儲的)。如今看來,運行時常量池和常量池存儲的內容是同樣的,那麼爲何還要有運行時常量池呢?由於其具備動態性:java語言並不要求常量必定只有編譯器才能產生,也就是並不是預置入Class文件中常量池的內容才能進入方法區運行時常量池,運行期間也可能將新的常量放入池中,好比String類的intern方法就爲此類操做。運行時常量池爲咱們提供了一種可以在運行時動態操做常量池的方法。接口

 

相關文章
相關標籤/搜索