根據 JVM 規範,JVM 內存共分爲虛擬機棧、堆、方法區、程序計數器、本地方法棧五個部分。
虛擬機的內存模型分爲兩部分:一部分是線程共享的,包括 Java 堆和方法區;另外一部分是線程私有的,包括虛擬機棧和本地方法棧,以及程序計數器這一小部份內存。
1. 虛擬機棧,JVM規範讓每一個Java線程擁有本身的獨立的JVM棧,也就是Java方法的調用棧。每一個方法會建立一個棧幀,棧幀中存放了局部變量表(基本數據類型和對象引用)、操做數棧、方法出口等信息。棧的大小能夠固定也能夠動態擴展。當棧調用深度大於JVM所容許的範圍,會拋出StackOverflowError的錯誤
2. 本地方法棧,JVM規範爲了容許native代碼能夠調用Java代碼,以及容許Java代碼調用native方法,還規定每一個Java線程擁有本身的獨立的native方法棧。
3. 方法區存放了一些常量、靜態變量、類信息等,能夠理解成class文件在內存中的存放位置。方法區也是全部線程共享。主要用於存儲類的信息、常量池、方法數據、方法代碼等。方法區邏輯上屬於堆的一部分,可是爲了與堆進行區分,一般又叫「非堆」。
所謂靜態常量池,即*.class文件中的常量池,class文件中的常量池不單單包含字符串(數字)字面量,還包含類、方法的信息,佔用class文件絕大部分空間。
而運行時常量池,則是jvm虛擬機在完成類裝載操做後,將class文件中的常量池載入到內存中,並保存在方法區中,咱們常說的常量池,就是指方法區中的運行時常量池
PermGen(永久代) 其實,移除永久代的工做從JDK1.7就開始了。JDK1.7中,存儲在永久代的部分數據就已經轉移到了Java Heap或者是 Native Heap。
METHOD AREA,它是一塊線程共享的對象,名爲方法區,在HotSpot虛擬機中,這塊METHOD AREA咱們能夠認爲等同於持久代(PermGen),在Java 6及以前的版本,持久代存放了如下一些內容:
- 虛擬機加載的類信息
- 常量池
- 靜態變量
- 即時編譯後的代碼
到了Java 7以後,常量池已經不在持久代之中進行分配了,而是移到了堆中,即常量池和對象共享堆內存。接着到了Java 8以後的版本(至此篇文章,Java 10剛發佈),持久代已經被永久移除,取而代之的是Metaspace。Metaspace是方法區在HotSpot中的實現,它與持久代最大的區別在於:Metaspace並不在虛擬機內存中而是使用本地內存。所以Metaspace具體大小理論上取決於32位/64位系統可用內存的大小
http://www.importnew.com/28571.html
1 String s1 = "Hello"; 2 String s2 = "Hello"; 3 String s3 = "Hel" + "lo"; 4 String s4 = "Hel" + new String("lo"); 5 String s5 = new String("Hello"); 6 String s6 = s5.intern(); 7 String s7 = "H"; 8 String s8 = "ello"; 9 String s9 = s7 + s8; 10 11 System.out.println(s1 == s2); // true 12 System.out.println(s1 == s3); // true 13 System.out.println(s1 == s4); // false 14 System.out.println(s1 == s9); // false 15 System.out.println(s4 == s5); // false 16 System.out.println(s1 == s6); // true
四、PC 寄存器:
PC 寄存器,也叫程序計數器。JVM支持多個線程同時運行,每一個線程都有本身的程序計數器。假若當前執行的是 JVM 的方法,則該寄存器中保存當前執行指令的地址;假若執行的是native 方法,則PC寄存器中爲空。
5,堆堆內存是 JVM 全部線程共享的部分,在虛擬機啓動的時候就已經建立。全部的對象和數組都在堆上進行分配。這部分空間可經過 GC 進行回收。當申請不到空間時會拋出 OutOfMemoryError
上面能夠看到堆分紅三個區域:
- 新生代(Young Generation):用於存放新建立的對象,採用複製回收方法,若是在s0和s1之間複製必定次數後,轉移到年老代中。這裏的垃圾回收叫作minor GC;
- 年老代(Old Generation):這些對象垃圾回收的頻率較低,採用的標記整理方法,這裏的垃圾回收叫作 major GC。
- 永久代(Permanent Generation):存放Java自己的一些數據,當類再也不使用時,也會被回收。