一、 基本概念
每運行一個Java程序會產生一個java進程,每個java進程可能包含一個或者多個線程,每一個Java進程對應唯一一個JVM實例,每一個JVM實例唯一對應一個堆,每一個線程有一個自己私有的棧。進程所創建的所有類的實例(也就是對象)或數組(指的是數組的本身,不是引用)都放在堆中,并由該進程所有的線程共享。Java中分配堆內存是自動初始化的,即為一個對象分配內存的時候,會初始化這個對象中變量。雖然Java中所有對象的存儲空間都是在堆中分配的,但是這個對象的引用卻是在棧中分配,也就是說在建立一個對象時在堆和棧中都分配內存,在堆中分配的內存實際存放這個被創建的對象的本身,而在棧中分配的內存只是存放指向這個堆對象的引用而已。局部變量 new 出來時,在棧空間和堆空間中分配空間,當局部變量生命周期結束后,棧空間立刻被回收,堆空間區域等待GC回收。
具體的概念:JVM的內存可分為3個區:堆(heap)、棧(stack)和方法區(method,也叫靜態區):
堆區:
1.存儲的全部是對象,每個對象都包含一個與之對應的class的信息(class的目的是得到操作指令) ;
2.jvm只有一個堆區(heap),且被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身和數組本身;
棧區:
1.每個線程包含一個棧區,棧中只保存基礎數據類型本身和自定義對象的引用;
2.每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問;
3.棧分為3個部分:基本類型變量區、執行環境上下文、操作指令區(存放操作指令);
方法區(靜態區):
1.被所有的線程共享,方法區包含所有的class(class是指類的原始代碼,要創建一個類的對象,首先要把該類的代碼加載到方法區中,并且初始化)和static變量。
2.方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變量。
3 常量池:JVM為每個已加載的類型維護一個常量池,常量池就是這個類型用到的常量的一個有序集合。包括直接常量(基本類型,String)和對其他類型、方法、字段的符號引用(1)。池中的數據和數組一樣通過索引訪問。由于常量池包含了一個類型所有的對其他類型、方法、字段的符號引用,所以常量池在Java的動態鏈接中起了核心作用。常量池存在于堆中。
http://blog.csdn.net/davidwma/article/details/71438000