1. 程式人生 > >jvm內存配置參數

jvm內存配置參數

per 對象 struct alt stack 進入 ast 永久 str

轉載:http://blog.csdn.net/crazylzxlzx/article/details/52210061
請看下面題目:
對於jvm內存配置參數:
-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
其最小內存值和Survior區總大小分別是:
a. 5120m,1024m
b.5120m,2048m
c.10240m,1024m
d.10240m,2048m

答案是:d.

技術分享

首先必須知道幾個參數的含義:

-Xmx :堆的最大值
-Xms :堆的最小值
-Xmn :堆年輕代大小
-XXSurvivorRatio:Eden區和Survior區的占用比例.


知識補充:
VM內存區域總體分兩類,heap區 和 非heap 區 。
- heap區: 堆區分為Young Gen(新生代),Tenured Gen(老年代-養老區)。其中新生代又分為Eden Space(伊甸園)、Survivor Space(幸存者區)。
- 非heap區: Code Cache(代碼緩存區)、Perm Gen(永久代)、Jvm Stack(Java虛擬機棧)、Local Method Statck(本地方法棧)。


為什麽要區分新生代和老生代?
堆中區分的新生代和老年代是為了垃圾回收,新生代中的對象存活期一般不長,而老年代中的對象存活期較長,所以當垃圾回收器回收內存時,新生代中垃圾回收效果較好,會回收大量的內存,而老年代中回收效果較差,內存回收不會太多。


不同代采用的算法區別?
基於以上特性,新生代中一般采用復制算法,因為存活下來的對象是少數,所需要復制的對象少,而老年代對象存活多,不適合采用復制算法,一般是標記整理和標記清除算法。
因為復制算法需要留出一塊單獨的內存空間來以備垃圾回收時復制對象使用,所以將新生代分為eden區和兩個survivor區,每次使用eden和一個survivor區,另一個survivor作為備用的對象復制內存區。

上面鋪墊了那麽多,現在進入正題:
我們只需要知道Survior區有兩個,就是圖中的S0和S1,而Eden區只用一個, -XXSurvivorRatio參數是Eden區和單個Survior區的比例,所以應該有(3+1+1)*Survior=5012m,圖中問的是Survior總大小(需乘2),顯然是d.

jvm內存配置參數