1. 程式人生 > >不會汪汪的貓咪不是好狗狗

不會汪汪的貓咪不是好狗狗

java記憶體模型

Java的記憶體模型劃分: 綠色的三個記憶體區域都是執行緒私有的,不存在多執行緒的問題,2個黃色區域位執行緒共有,所以可能存在多執行緒下的資料問題。

image8165a52e675919ec.png

new出來的物件在堆上分配。下面是堆記憶體的區域劃分:

image.png

如上圖,堆記憶體又被分為新生代和老年代。新生代裡又分為一個eden區和2個survivor區(from和to區,或者s0,s1)。

物件分配有以下需要注意的點:

1,new出來的物件一般都在eden區,不過有例外,在大物件的情況下,物件會在老年代直接分配記憶體。

2,eden區的物件在第一次minorGC時,去往新生代的From區。

3,在此之後,一直是eden區和from區一直有資料,在minorGC時存活的物件進入To區,eden和from清空,from和To區名字轉變,永遠保持To區為空。

4,3這一步有一個條件,即是老年代的剩餘的記憶體大於eden區和from區的總的已佔有的記憶體大小,作為擔保,防止from和to存活的物件太多時無法全部複製到To區時可以往老年代分配記憶體。

5,在eden區經歷了16次minorGC時仍然存活的物件(每次minorGC後仍然存活物件年齡+1),會被轉移到老年代。 6,在老年代將滿的時候一般進行的GC為FullGC(因為majorGC一般伴隨的有minorGC,所以可以看為FullGC) 7,設定兩塊S區可以有效減少碎片化記憶體