JVM簡筆 堆(Heap)記憶體的基本結構

2021-10-08 12:07:38 字數 1108 閱讀 9331

堆記憶體溢位是非常常見的問題,解決問題之前,了解堆記憶體基本結構是很有必要的

jvm堆記憶體圖

新生代又分為eden區(伊甸園區)和survivor區(倖存者區)!

新生代物件的生命週期是由minorgc決定的,先了解minorgc的原理–複製演算法(minorgc三步:)

將eden存活下來的和survivorfrom中的物件複製到to區,同時將這些物件的年齡加一,如果這些物件中已經存在達到老年代標準的物件或者to區的記憶體不足,就會將這些物件放到老年代

清空eden和from區中的這些物件

from與to相互交換,原來to區成為下一次minorgc的from區,所以在一段時間內survivorfrom區和survivorto區總有乙個為空

設定survivor(倖存者)區的意義?

減少進入老年代的物件,如果不設定倖存者區,那麼每一次minorgc存活的物件都會進入老年代,當老年代記憶體滿了之後會進行majorgc,會大大的影響程式的效能

為什麼要設定兩個survivor(倖存者)區?

防止記憶體碎片化。

上面我們了解了minorgc的原理----將eden和survivorfrom中存活下來的物件複製到survivorto區,from區和to區交換;所以每一次存活的物件都會進入乙個空的to區,然後依次分配,就保證了分配的記憶體是連續的,也就不會出現記憶體碎片化。

如果僅僅設定乙個,那麼每次minorgc過後存活的物件進入survivor區,都會有已經儲存在其中的物件,就出現了記憶體不連續的情況,導致記憶體碎片化

survivorfrom和survivorto區記憶體大小必須嚴格相等

Python 堆(heap)的基本操作

python 堆 heap 的基本操作 import heapq 載入heap庫,heap指的是最小堆使陣列轉化為堆 heapq.heapify list heap 1,3,4,2,6,8,9 heapq.heapify heap heap 1,2,4,3,6,8,9 為heap增加元素 heap ...

jvm堆記憶體的資料共享

以前沒學jvm的時候,老師總是講在堆記憶體中的資料是共享的,多個執行緒可以使用堆中的同乙個資料,於是才會有加鎖的操作。其實,堆裡的資料就是是共享的 那麼tlab是怎麼一回事呢?首先物件分配時,現在當前執行緒中的tlab中檢視空間是否有多餘,如果有,則分配到此執行緒中的tlab中。1.tlab是在堆記...

堆記憶體溢位的測試類 JVM學習筆記

記個筆記,手寫乙個測試類,模擬堆記憶體溢位。堆記憶體溢位測試類 vm agrs xms10m xmx10m xx heapdumponoutofmemoryerror author lixiang date 2019年04月12日 14 44 history 2019年04月12日 14 44 li...