天天看點

JVM記憶體配置設定,深入了解堆 棧 方法區

基本概念:

每運作一個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變量.