1. 程式人生 > >Java內存管理和GC學習【GC】

Java內存管理和GC學習【GC】

copy map mar users lan rms 線程 jstat https

內存劃分

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】