Java虛擬機內存模型概念
Java虛擬機的內存可以分爲三個區域:棧stack、堆heap、方法區method area
一、棧stack
1. 棧描述的是方法執行的內存模型,每個方法被調用都會創建一個棧幀(存儲局部變量、操作數、方法出口等)
2. JVM爲每個線程創建一個棧,用於存放該線程執行方法的信息(實際參數,局部變量等)
3. 棧屬於線程私有,不能實現線程間的共享
4. 棧的存儲特性是"先進後出,後進先出"
5. 棧是由系統自動分配,速度快。棧是一個連續的內存空間。
二、堆heap
1. 堆用於存儲創建好的對象和數組(數組也是對象)
2. JVM只有一個堆,被所有線程共享
3. 堆是一個不連續的內存空間,分配靈活,速度慢。
4. 堆被所有的線程所共享,在堆上的區域,會被垃圾回收器做進一步劃分,例如新生代,老年代的劃分
三、方法區method area
1. 方法區是JAVA虛擬機規範,可以有不同的實現
- JDK7以前是"永久代"
- JDK7部分去除"永久代",靜態變量、字符串常量池都挪到了堆內存中
- JDK8是"元數據空間"和堆結合起來
2. JVM只有一個方法區,被所有線程共享
3. 方法區實際也是堆,只是用於存儲類、常量相關的信息
4. 用來存放程序中永遠不變或唯一的內容(類信息、靜態變量、字符串常量)
5. 常量池主要存放常量:如文本字符串、final常量值