Java內存管理和GC學習【GC】
內存劃分
1。JAVA內存主要劃分為方法棧、方法區、堆。
2。方法棧上內存會自動釋放;
3。方法區上主要加載了類的元信息、靜態變量、常量。改區域又稱為持久代(Perm Gen),默認是最小16M,最大64M。配置參數 -XX:PermSize=16m -XX:MaxPermSize=64m;
4。堆是按分代進行管理,主要分為新生代(New Gen)和舊生代(Old Gen或Tenuring Gen)。
1)新生代又分為Eden Space,S0,S1三塊區域。
2)Eden是new出來對象的出生地(原來對象是亞當和夏娃生的啊?)。
3)S0和S1是2塊大小相同的區域,合起來又稱為Survivor Space,這2塊區域是進行垃圾回收時生存對象的集散地,每次回收是總是從一個區域移動到另一個區域,下次又從另一個區域移動到這個區域。
4)堆大小默認值:最小1/64物理內存,最大1/4物理內存,32位機器最大為2G
5)配置參數:-Xms64M(最小) -Xmx64M(最大) -Xmn16M(新生代大小)
GC
1。GC分為新生代GC和舊生代GC,新生代GC又稱Minor GC。當舊生代GC觸發時,也會觸發新生代GC,此過程稱為Full GC;
1。GC算法主要有復制(Copying)、標記-清除(Mark-Sweep)、標記-壓縮(Mark-Compact);
2。Minor GC采用的算法是復制(Copying),其主要的三種方式為:
1)串行GC(Serial GC) 暫停應用,單線程方式進行,配置參數-XX:+UserSerialGC
2)並行回收GC(Parallel Scavenge) 暫停應用,多線程方式進行,配置方式-XX:UseParallelGC
3)並行GC(ParNew) 配合舊生代CMS GC使用,CMS GC是與應用並發,多線程進行的,配置方式-XX:UseParNewGC
3。舊生代GC的算法主要采用標誌-清除(Mark-Sweep)、標誌-壓縮(Mark-Compact),其主要的三種方式為:
1)串行GC 暫停應用,單線程方式進行,算法為Mark-Sweep-Compact,配置參數-XX:+UserSerialGC;
2)並行GC 暫停應用,多線程方式進行,算法為Mark-Compact,配置方式-XX:UseParallelGC;
3)並發CMS(Concurrent Mark-Sweep GC) 與應用並發多線程進行,算法為Mark-Sweep,配置參數-XX:+UseConcMarkSweepGC;
查看工具
0. jps 查看Java進程信息
1.JMap 命令jmap -heap [PID] ,統計java內存使用情況,Jdk自帶;
2.JStat 命令jstat -gcutil [PID] 5s,沒5秒鐘輸出java內存使用率以及GC的次數和時間,Jdk自帶
3.jstack 命令jstack -l pid ,輸出進程的堆棧信息,jdk自帶
參考:https://my.oschina.net/feichexia/blog/196575
http://blog.csdn.net/imxiangzi/article/details/47123849
Java內存管理和GC學習【GC】