JVM的內存、GC、參數

JAVA的JVM的內存

棧區: 每個線程包含一個棧區,棧中只保存方法中(不包括對象的成員變量)的基礎數據類型和自定義對象的引用(不是對象),
對象都存放在堆區中每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問(servlet線程和入庫線程不能共享數據)。棧分爲3個部分:基本類型變量區、執行
環境上下文、操作指令區(存放操作指令)。
java中棧可以分爲參數棧 、函數調用棧。
每個線程的棧互相獨立,棧是thread safe
堆區: 存儲的全部是對象實例,每個對象都包含一個與之對應的class的信息(class信息存放在方法區)。jvm只有一個堆區(heap)
被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身,幾乎所有的對象實例和數組都在堆中分配。
方法區: 又叫靜態區,跟堆一樣,被所有的線程共享。它用於存儲已經被虛擬機加載的類信息、常量、靜態變量、即時編譯器編
譯後的代碼等數據

垃圾回收器

方法論-回收算法
標記-清除算法、複製算法、標記-整理算法、分代收集算法
落地實現-垃圾回收器
串行垃圾回收器(Serial Garbage Collector)
並行垃圾回收器(Parallel Garbage Collector)
併發標記掃描垃圾回收器(CMS Garbage Collector)
G1垃圾回收器(G1 Garbage Collector)
jdk垃圾回收和區別
jdk1.7和1.8 默認垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.9 默認垃圾收集器G1

並行 Parallel
指多條垃圾收集線程並行工作,但此時用戶線程仍然處於等待狀態。

G1和CMS都爲分代收集
G1同時回收老年代和年輕代,邏輯上的概念,內存分多region,Eden/ Survivor/Old邏輯集合
CMS只能回收老年代,需要配合一個年輕代收集器
GC分代式原因:實現分代的最大好處是,GC能夠應付的應用內存分配速率(allocation rate)可以得到巨大的提升。縮短GC一
次工作的時間長度,和表分區一個意思。
設計思路:weak generational hypothesis——大部分對象的生命期很短(die young),而沒有die young的對象則很可能會存活很長時間(live long)。
young gen:大小配置通常只佔整個GC堆的較小部分,而且較高的對象死亡率。讓它非常適合使用copying算法來收集。
young GC:當young gen中的eden區分配滿的時候觸發。注意young GC中有部分存活對象會晉升到old gen,所以young GC後old gen的佔用量通常會有所升高。
full GC:當準備要觸發一次young GC時,如果發現統計數據說之前young GC的平均晉升大小比目前old gen剩餘的空間大,則不會觸發young GC而是轉爲觸發
full GC(因爲HotSpot VM的GC裏,除了CMS的concurrent collection之外,其它能收集old gen的GC都會同時收集整個GC堆,包括young gen,所以不需要事先觸發一次單獨的young GC);或者,如果有perm gen的話,要在perm gen分配空間但已經沒有足夠空間時,也要觸發一次full GC;或者System.gc()、heap dump帶GC,默認也是觸發full GC。
Minor GC和Major GC是俗稱,在Hotspot JVM實現的Serial GC, Parallel GC, CMS, G1 GC中大致可以對應到某個Young GC和
Old GC算法組合

參數

啓動腳本中-Xms2048m -Xmx2048m -Xss256k
-Xmn 新生代大小
-Xms 設置初始堆的大小,也是最小堆的大小,它等價於:-XX:InitialHeapSize
-Xmx 設置最大堆的大小,它等價於-XX:MaxHeapSize。
堆的初始值和最大值不一樣的話,JVM會根據程序的運行情況,自動調整堆的大小,這可能會影響到一些效率。針對服務端程序,
一般是把堆的最小值和最大值設置爲一樣來避免堆擴展和收縮對性能的影響。
-Xss 設置線程棧的大小,線程棧的大小會影響到遞歸調用的深度,同時也會影響到能同時開啓的線程數量。
-XX:PermSize 用來設置永久區的初始大小
-XX:MaxPermSize 用來設置永久區的最大值
-XX:+UseG1GC G1垃圾回收器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章