你對JVM調優是否熟悉
這裡向大家描述一下
首先要了解幾個概念
比如說Perm持久代
用於存放靜態文件
如今Java類
方法等
持久代對垃圾回收沒有顯著影響
但是有些應用可能動態生成或者調用一些class
例如Hibernate等
JVM調優總結
Young(年輕代)
年輕代分三個區
一個Eden區
兩個Survivor區
大部分對象在Eden區中生成
當Eden區滿時
還存活的對象將被復制到Survivor區(兩個中的一個)
當這個Survivor區滿時
此區的存活對象將被復制到另外一個Survivor區
當這個Survivor去也滿了的時候
從第一個Survivor區復制過來的並且此時還存活的對象
將被復制
年老區(Tenured)
需要注意
Survivor的兩個區是對稱的
沒先後關系
所以同一個區中可能同時存在從Eden復制過來對象
和從前一個Survivor復制過來的對象
而復制到年老區的只有從第一個Survivor去過來的對象
而且
Survivor區總有一個是空的
Tenured(年老代)
年老代存放從年輕代存活的對象
一般來說年老代存放的都是生命期較長的對象
Perm(持久代)
用於存放靜態文件
如今Java類
方法等
持久代對垃圾回收沒有顯著影響
但是有些應用可能動態生成或者調用一些class
例如Hibernate等
在這種時候需要設置一個比較大的持久代空間來存放這些運行過程中新增的類
持久代大小通過
XX:MaxPermSize=<N>進行設置
JVM調優之年輕代大小選擇
◆響應時間優先的應用
盡可能設大
直到接近系統的最低響應時間限制(根據實際情況選擇)
在此種情況下
年輕代收集發生的頻率也是最小的
同時
減少到達年老代的對象
◆吞吐量優先的應用
盡可能的設置大
可能到達Gbit的程度
因為對響應時間沒有要求
垃圾收集可以並行進行
一般適合
CPU以上的應用
JVM調優之年老代大小選擇
◆響應時間優先的應用
年老代使用並發收集器
所以其大小需要小心設置
一般要考慮並發會話率和會話持續時間等一些參數
如果堆設置小了
可以會造成內存碎片
高回收頻率以及應用暫停而使用傳統的標記清除方式
如果堆大了
則需要較長的收集時間
最優化的方案
一般需要參考以下數據獲得
並發垃圾收集信息
持久代並發收集次數
傳統GC信息
花在年輕代和年老代回收上的時間比例
減少年輕代和年老代花費的時間
一般會提高應用的效率
◆吞吐量優先的應用
一般吞吐量優先的應用都有一個很大的年輕代和一個較小的年老代
原因是
這樣可以盡可能回收掉大部分短期對象
減少中期的對象
而年老代盡存放長期存活對象
JVM調優之較小堆引起的碎片問題
因為年老代的並發收集器使用標記
清除算法
所以不會對堆進行壓縮
當收集器回收時
他會把相鄰的空間進行合並
這樣可以分配給較大的對象
但是
當堆空間較小時
運行一段時間以後
就會出現
碎片
如果並發收集器找不到足夠的空間
那麼並發收集器將會停止
然後使用傳統的標記
清除方式進行回收
如果出現
碎片
可能需要進行如下配置
◆
XX:+UseCMSCompactAtFullCollection:使用並發收集器時
開啟對年老代的壓縮
◆
XX:CMSFullGCsBeforeCompaction=
:上面配置開啟的情況下
這裡設置多少次FullGC後
對年老代進行壓縮
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25855.html