JAVA的JVM的內存可分爲3個區:堆(heap)、棧(stack)和方法區(method)java
堆區: 1.存儲的所有是對象,每一個對象都包含一個與之對應的class的信息。(class的目的是獲得操做指令) 2.jvm只有一個堆區(heap)被全部線程共享,堆中不存放基本類型和對象引用,只存放對象自己.程序員
3.通常由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。網絡
棧區: 1.每一個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中 2.每一個棧中的數據(原始類型和對象引用)都是私有的,其餘棧不能訪問。 3.棧分爲3個部分:基本類型變量區、執行環境上下文、操做指令區(存放操做指令)。app
4.由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等.jvm
靜態區/方法區: 1.方法區又叫靜態區,跟堆同樣,被全部的線程共享。方法區包含全部的class和static變量。 2.方法區中包含的都是在整個程序中永遠惟一的元素,如class,static變量。函數
3.—,全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域。測試
代碼實例(轉自網絡)this
AppMain.java public class AppMain //運行時, jvm 把appmain的信息都放入方法區 { public static void main(String[] args) //main 方法自己放入方法區。 { Sample test1 = new Sample( " 測試1 " ); //test1是引用,因此放到棧區裏, Sample是自定義對象應該放到堆裏面 Sample test2 = new Sample( " 測試2 " );線程
test1.printName(); test2.printName(); }
}code
Sample.java
public class Sample //運行時, jvm 把appmain的信息都放入方法區 { /** 範例名稱 */ private name; //new Sample實例後, name 引用放入棧區裏, name 對象放入堆裏
/** 構造方法 */ public Sample(String name) { this .name = name; } /** 輸出 */ public void printName() //print方法自己放入 方法區裏。 { System.out.println(name); }
}