qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Java虛擬機jvm關于內存的設置與調優

          JVM內存的設置的原理
            默認的java虛擬機的大小比較小,在對大數據進行處理時java就會報錯:java.lang.OutOfMemoryError。
            設置jvm內存的方法,對于單獨的.class,可以用下面的方法對Test運行時的jvm內存進行設置。
            java -Xms64m -Xmx256m Test
            -Xms是設置內存初始化的大小
            -Xmx是設置最大能夠使用內存的大小(最好不要超過物理內存大小)
            在weblogic中,可以在startweblogic.cmd中對每個domain虛擬內存的大小進行設置,默認的設置是在commEnv.cmd里面。
            JVM內存的調優
            1. Heap設定與垃圾回收Java Heap分為3個區,Young,Old和Permanent。Young保存剛實例化的對象。當該區被填滿時,GC會將對象移到Old區。Permanent區則負責保存反射對象,本文不討論該區。JVM的Heap分配可以使用-X參數設定,
          -Xms
          初始Heap大小
          -Xmx
          java heap最大值
          -Xmn
          young generation的heap大小
            JVM有2個GC線程。第一個線程負責回收Heap的Young區。第二個線程在Heap不足時,遍歷Heap,將Young 區升級為Older區。Older區的大小等于-Xmx減去-Xmn,不能將-Xms的值設的過大,因為第二個線程被迫運行會降低JVM的性能。
            為什么一些程序頻繁發生GC?有如下原因:
          程序內調用了System.gc()或Runtime.gc()。
          一些中間件軟件調用自己的GC方法,此時需要設置參數禁止這些GC。
          Java的Heap太小,一般默認的Heap值都很小。
          頻繁實例化對象,Release對象。此時盡量保存并重用對象,例如使用StringBuffer()和String()。
            如果你發現每次GC后,Heap的剩余空間會是總空間的50%,這表示你的Heap處于健康狀態。許多Server端的Java程序每次GC后最好能有 65%的剩余空間。經驗之談:
            1.Server端JVM最好將-Xms和-Xmx設為相同值。為了優化GC,最好讓-Xmn值約等于-Xmx的1/3[2]。
            2.一個GUI程序最好是每10到20秒間運行一次GC,每次在半秒之內完成[2]。
            注意:
            1.增加Heap的大小雖然會降低GC的頻率,但也增加了每次GC的時間。并且GC運行時,所有的用戶線程將暫停,也就是GC期間,Java應用程序不做任何工作
            2.Heap大小并不決定進程的內存使用量。進程的內存使用量要大于-Xmx定義的值,因為Java為其他任務分配內存,例如每個線程的Stack等。
            2.Stack的設定
            每個線程都有他自己的Stack。
            -Xss
            每個線程的Stack大小
            Stack的大小限制著線程的數量。如果Stack過大就好導致內存溢漏。-Xss參數決定Stack大小,例如-Xss1024K。如果Stack太小,也會導致Stack溢漏。
            3.硬件環境
            硬件環境也影響GC的效率,例如機器的種類,內存,swap空間,和CPU的數量。
            如果你的程序需要頻繁創建很多transient對象,會導致JVM頻繁GC。這種情況你可以增加機器的內存,來減少Swap空間的使用[2]。
            4.4種GC
            第一種為單線程GC,也是默認的GC。,該GC適用于單CPU機器。
            第二種為Throughput GC,是多線程的GC,適用于多CPU,使用大量線程的程序。第二種GC與第一種GC相似,不同在于GC在收集Young區是多線程的,但在Old區和第一種一樣,仍然采用單線程。-XX:+UseParallelGC參數啟動該GC。
            第三種為Concurrent Low Pause GC,類似于第一種,適用于多CPU,并要求縮短因GC造成程序停滯的時間。這種GC可以在Old區的回收同時,運行應用程序。-XX:+UseConcMarkSweepGC參數啟動該GC。
            第四種為Incremental Low Pause GC,適用于要求縮短因GC造成程序停滯的時間。這種GC可以在Young區回收的同時,回收一部分Old區對象。-Xincgc參數啟動該GC。
            4種GC的具體描述參見[3]。

          posted on 2014-01-30 12:04 順其自然EVO 閱讀(524) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2014年1月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 淮北市| 五河县| 雅江县| 北辰区| 镇安县| 乌审旗| 江西省| 银川市| 离岛区| 霍邱县| 焦作市| 德格县| 佛冈县| 河源市| 玛多县| 天全县| 沁阳市| 铁岭县| 杭锦后旗| 利辛县| 河南省| 胶南市| 昔阳县| 融水| 昌邑市| 乌什县| 宿松县| 措美县| 潞城市| 岑溪市| 乐亭县| 静安区| 西平县| 阿克陶县| 锦屏县| 班玛县| 甘洛县| 武定县| 新津县| 蓬安县| 卫辉市|