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)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 富宁县| 寻乌县| 加查县| 东山县| 台南市| 茶陵县| 左贡县| 武胜县| 普定县| 璧山县| 香格里拉县| 南部县| 上蔡县| 垣曲县| 古丈县| 峨山| 巴南区| 溆浦县| 哈巴河县| 新兴县| 应用必备| 怀宁县| 丹江口市| 神木县| 天津市| 锡林浩特市| 九江市| 龙门县| 曲靖市| 郁南县| 商城县| 扎囊县| 南溪县| 那坡县| 卫辉市| 武邑县| 永平县| 淄博市| 杂多县| 汶川县| 左权县|