1. JVM堆設(shè)置參數(shù)
針對(duì)JVM堆的設(shè)置,一般可以通過-Xms -Xmx限定其最小、最大值,為了防止垃圾收集器在最小、最大之間收縮堆而產(chǎn)生額外的時(shí)間,通常把最大、最小設(shè)置為相同的值;
2. 年輕代和年老代將根據(jù)默認(rèn)的比例(1:2)分配堆內(nèi)存
可以通過調(diào)整二者之間的比率NewRadio來調(diào)整二者之間的大小,也可以針對(duì)回收代。比如年輕代,通過 -XX:newSize -XX:MaxNewSize來設(shè)置其絕對(duì)大小。同樣,為了防止年輕代的堆收縮,我們通常會(huì)把-XX:newSize -XX:MaxNewSize設(shè)置為同樣大小。
3. 年輕代和年老代值大小
3.1 更大的年輕代必然導(dǎo)致更小的年老代,大的年輕代會(huì)延長普通GC的周期,但會(huì)增加每次GC的時(shí)間;小的年老代會(huì)導(dǎo)致更頻繁的Full GC。
3.2 更小的年輕代必然導(dǎo)致更大年老代,小的年輕代會(huì)導(dǎo)致普通GC很頻繁,但每次的GC時(shí)間會(huì)更短;大的年老代會(huì)減少Full GC的頻率。
如何選擇應(yīng)該依賴應(yīng)用程序?qū)ο笊芷诘姆植记闆r: 如果應(yīng)用存在大量的臨時(shí)對(duì)象,應(yīng)該選擇更大的年輕代;如果存在相對(duì)較多的持久對(duì)象,年老代應(yīng)該適當(dāng)增大。但很多應(yīng)用都沒有這樣明顯的特性。
3.3 在抉擇時(shí)應(yīng)該根 據(jù)以下兩點(diǎn):
(1). 本著Full GC盡量少的原則,讓年老代盡量緩存常用對(duì)象,JVM的默認(rèn)比例1:2也是這個(gè)道理 。
(2). 通過觀察應(yīng)用一段時(shí)間,看其他在峰值時(shí)年老代會(huì)占多少內(nèi)存,在不影響Full GC的前提下,根據(jù)實(shí)際情況加大年輕代,比如可以把比例控制在1:1。但應(yīng)該給年老代至少預(yù)留1/3的增長空間。
4. 在配置較好的機(jī)器上(比如多核、大內(nèi)存),可以為年老代選擇并行收集算法: -XX:+UseParallelOldGC。
5. 線程堆棧的設(shè)置
每個(gè)線程默認(rèn)會(huì)開啟1M的堆棧,用于存放棧幀、調(diào)用參數(shù)、局部變量等,對(duì)大多數(shù)應(yīng)用而言這個(gè)默認(rèn)值太了,一般256K就足用。
理論上,在內(nèi)存不變的情況下,減少每個(gè)線程的堆棧,可以產(chǎn)生更多的線程,但這實(shí)際上還受限于操作系統(tǒng)。