qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請?jiān)L問 http://qaseven.github.io/

          JVM學(xué)習(xí)筆記(四)------內(nèi)存調(diào)優(yōu)

           首先需要注意的是在對JVM內(nèi)存調(diào)優(yōu)的時候不能只看操作系統(tǒng)級別Java進(jìn)程所占用的內(nèi)存,這個數(shù)值不能準(zhǔn)確的反應(yīng)堆內(nèi)存的真實(shí)占用情況,因?yàn)镚C過后這個值是不會變化的,因此內(nèi)存調(diào)優(yōu)的時候要更多地使用JDK提供的內(nèi)存查看工具,比如JConsole和Java VisualVM。

            對JVM內(nèi)存的系統(tǒng)級的調(diào)優(yōu)主要的目的是減少GC的頻率和Full GC的次數(shù),過多的GC和Full GC是會占用很多的系統(tǒng)資源(主要是CPU),影響系統(tǒng)的吞吐量。特別要關(guān)注Full GC,因?yàn)樗鼤φ麄€堆進(jìn)行整理,導(dǎo)致Full GC一般由于以下幾種情況:

            ● 舊生代空間不足
            調(diào)優(yōu)時盡量讓對象在新生代GC時被回收、讓對象在新生代多存活一段時間和不要創(chuàng)建過大的對象及數(shù)組避免直接在舊生代創(chuàng)建對象

            ● Pemanet Generation空間不足
            增大Perm Gen空間,避免太多靜態(tài)對象

            ● 統(tǒng)計得到的GC后晉升到舊生代的平均大小大于舊生代剩余空間
            控制好新生代和舊生代的比例

            ● System.gc()被顯示調(diào)用
            垃圾回收不要手動觸發(fā),盡量依靠JVM自身的機(jī)制

            調(diào)優(yōu)手段主要是通過控制堆內(nèi)存的各個部分的比例和GC策略來實(shí)現(xiàn),下面來看看各部分比例不良設(shè)置會導(dǎo)致什么后果

            1)新生代設(shè)置過小

            一是新生代GC次數(shù)非常頻繁,增大系統(tǒng)消耗;二是導(dǎo)致大對象直接進(jìn)入舊生代,占據(jù)了舊生代剩余空間,誘發(fā)Full GC

            2)新生代設(shè)置過大

            一是新生代設(shè)置過大會導(dǎo)致舊生代過?。ǘ芽偭恳欢ǎ?,從而誘發(fā)Full GC;二是新生代GC耗時大幅度增加

            一般說來新生代占整個堆1/3比較合適

            3)Survivor設(shè)置過小

            導(dǎo)致對象從eden直接到達(dá)舊生代,降低了在新生代的存活時間

            4)Survivor設(shè)置過大

            導(dǎo)致eden過小,增加了GC頻率

            另外,通過-XX:MaxTenuringThreshold=n來控制新生代存活時間,盡量讓對象在新生代被回收

            由上一篇博文JVM學(xué)習(xí)筆記(三)------內(nèi)存管理和垃圾回收可知新生代和舊生代都有多種GC策略和組合搭配,選擇這些策略對于我們這些開發(fā)人員是個難題,JVM提供兩種較為簡單的GC策略的設(shè)置方式

            1)吞吐量優(yōu)先

            JVM以吞吐量為指標(biāo),自行選擇相應(yīng)的GC策略及控制新生代與舊生代的大小比例,來達(dá)到吞吐量指標(biāo)。這個值可由-XX:GCTimeRatio=n來設(shè)置

            2)暫停時間優(yōu)先

            JVM以暫停時間為指標(biāo),自行選擇相應(yīng)的GC策略及控制新生代與舊生代的大小比例,盡量保證每次GC造成的應(yīng)用停止時間都在指定的數(shù)值范圍內(nèi)完成。這個值可由-XX:MaxGCPauseRatio=n來設(shè)置

           最后匯總一下JVM常見配置

            堆設(shè)置

            -Xms:初始堆大小

            -Xmx:最大堆大小

            -XX:NewSize=n:設(shè)置年輕代大小

            -XX:NewRatio=n:設(shè)置年輕代和年老代的比值。如:為3,表示年輕代與年老代比值為1:3,年輕代占整個年輕代年老代和的1/4

            -XX:SurvivorRatio=n:年輕代中Eden區(qū)與兩個Survivor區(qū)的比值。注意Survivor區(qū)有兩個。如:3,表示Eden:Survivor=3:2,一個Survivor區(qū)占整個年輕代的1/5

            -XX:MaxPermSize=n:設(shè)置持久代大小

            收集器設(shè)置

            -XX:+UseSerialGC:設(shè)置串行收集器

            -XX:+UseParallelGC:設(shè)置并行收集器

            -XX:+UseParalledlOldGC:設(shè)置并行年老代收集器

            -XX:+UseConcMarkSweepGC:設(shè)置并發(fā)收集器

            垃圾回收統(tǒng)計信息

            -XX:+PrintGC

            -XX:+PrintGCDetails

            -XX:+PrintGCTimeStamps

            -Xloggc:filename

            并行收集器設(shè)置

            -XX:ParallelGCThreads=n:設(shè)置并行收集器收集時使用的CPU數(shù)。并行收集線程數(shù)。

            -XX:MaxGCPauseMillis=n:設(shè)置并行收集最大暫停時間

            -XX:GCTimeRatio=n:設(shè)置垃圾回收時間占程序運(yùn)行時間的百分比。公式為1/(1+n)

            并發(fā)收集器設(shè)置

            -XX:+CMSIncrementalMode:設(shè)置為增量模式。適用于單CPU情況。

            -XX:ParallelGCThreads=n:設(shè)置并發(fā)收集器年輕代收集方式為并行收集時,使用的CPU數(shù)。并行收集線程數(shù)。

          相關(guān)鏈接:

          posted on 2011-11-15 15:15 順其自然EVO 閱讀(203) 評論(0)  編輯  收藏 所屬分類: 測試學(xué)習(xí)專欄

          <2011年11月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 阿克陶县| 石台县| 饶河县| 博兴县| 加查县| 永靖县| 榆林市| 雷州市| 江山市| 古蔺县| 化州市| 天全县| 志丹县| 瑞安市| 崇左市| 高陵县| 定兴县| 阜平县| 集安市| 当涂县| 翁牛特旗| 武夷山市| 淅川县| 新乡市| 河间市| 伊川县| 敦化市| 行唐县| 留坝县| 灯塔市| 新绛县| 资阳市| 霸州市| 宁海县| 海南省| 格尔木市| 新巴尔虎左旗| 北安市| 阜阳市| 怀宁县| 漳州市|