--->選擇對應版本鏈結--->tools--->visual gc
首先我們啟動本地工程,不停地往記憶體中新增物件,**如下:
@restcontroller使用的是springboot的工程,啟動後訪問:localhost:8080/heappublic
class
heapcontroller }}
這樣是程式不停地往記憶體中新增物件
我們在jvisualvm工具中找到當前程序,如圖:
雙擊進入如下介面:
由**可以看出,survivor區分為兩塊s0和s1,也可以叫做from和to。在同乙個時間點上,s0和s1只能有乙個區有資料,另外乙個是空的。
接著上面的gc來說,比如一開始只有eden區和from中有物件,to中是空的。此時進行一次gc操作,from區中物件的年齡就會+1,我們知道eden區中所有存活的物件會被複製到to區,from區中還能存活的物件會有兩個去處。若物件年齡達到之前設定好的年齡閾值,此時物件會被移動到old區,如果eden區和from區沒有達到閾值的
物件會被複製到to區。 此時eden區和from區已經被清空(被gc的物件肯定沒了,沒有被gc的物件都有了各自的去處)。這時候from和to交換角色,之前的from變成了to,之前的to變成了from。也就是說無論如何都要保證名為to的survivor區域是空的。minor gc會一直重複這樣的過程,知道to區被填滿,然後會將所有物件複製到老年代中。
我們可以適當調節記憶體的大小,來展示jvm記憶體溢位的現象,如圖,可以在idea中設定jvm堆記憶體的最大和最小引數:
執行後訪問localhost:9090/heap,等待記憶體溢位的現象:
在該工具中可以很明顯看出jvm的堆記憶體已經滿了,果然在idea也報了oom:
和虛擬機器棧記憶體的變化會在下個文章中分析
jvm學習(筆記)
1 jvm規範 img 2 oracle jdk 編譯機制 img 1 詞法分析 將 轉token序列 例如token.eq name 語法分析 生成語法抽象樹。2 註解處理 處理註解生成 3 檢查語法抽象樹 3 類載入順序 classloader self parent system findcl...
JVM學習筆記1
1.執行時資料結構 2.堆分代 3.垃圾收集器 4.gc日誌 package jvm public class gctest 控制台 垃圾 前.gc system.gc psyounggen 1996k 816k 38400k 1996k 824k 125952k 0.0010917 secs ti...
JVM學習(三) 垃圾收集
1 垃圾收集 garbage collection,gc 需要考慮以下3件事 1 哪些記憶體需要 what 2 什麼時候 when 3 如何 how 2 判斷堆記憶體是否需要 主要是判斷物件的引用是否還存在,主要有以下策略 1 引用計數演算法 每個物件含有乙個引用計數器,有引用 1,引用失效則 1,...