熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

JVM優化配置

2013-11-23 18:49:57  來源: Java核心技術 
    Java Hotspot Mode:
   
    server 和 client兩種模式如果不配置JVM會根據應用服務器硬件配置自動選擇模式server模式啟動比較慢但是運行期速度得到了優化client啟動比較快但是運行期響應沒有server模式的優化適合於個人PC的服務開發和測試
   
    Garbage Collector Policy:
   
    在Jdk 的時候已經提供了三種GC除了原來提供的串行GC(SerialGC)以外還提供了兩種新的GC:ParallelGC和ConcMarkSweepGCParallelGC采用了多線程並行管理和回收垃圾對象提高了回收效率提高了服務器的吞吐量適合於多處理器的服務器ConcMarkSweepGC采用的是並發方式來管理和回收垃圾對象降低垃圾回收產生的響應暫停時間這裡說一下並發和並行的區別並發指的是多個進程並行執行垃圾回收那麼可以很好的利用多處理器而並行指的是應用程序不需要暫停可以和垃圾回收線程並發工作串行GC適合小型應用和單處理器系統(無需多線程交互效率比較高)後兩者適合大型系統
   
    使用方式就是在參數配置中增加XX:+UseParallelGC等方式來設置
   
    對於這部分的配置在網上有很多的實例可以參考不過最終采用哪一種GC還是要根據具體的情況來分析和選擇
   
    Heap:
   
    OOM的各種經歷已經讓每一個架構師開發人員看到了了解Heap的重要性OOM已經是Heap的臨界點不得不引起注意然而Heap對於性能的潛在影響並未被引起重視不過和GC配置一樣在沒有對使用情況作仔細分析和研究的情況下貿然的去修改Heap配置可能適得其反這裡就來看一下Heap的一些概念和對於性能的影響
   
    我們的應用所能夠得到的最大的Heap受三部分因素的制約數據處理模型(位或者位操作系統)系統地虛擬內存總數和系統的物理內存總數首先Heap的大小不能超過不同操作系統的進程尋址范圍當前大部分系統最高限度是GWindows通常是GLinux通常是G系統的虛擬內存也是分配的依據首先是不能超過然後由於操作系統支持硬盤來做部分的虛擬內存如果設置過大那麼對於應用響應來說勢必有影響再則就是要考慮同一台服務器上運行多個Java虛擬機所消耗的資源總合也不能超過可用資源就和前面OOM分析中的一樣其實由於OS的數據處理模型的限制機器本身的硬件內存資源和虛擬內存資源並不一定會匹配那麼在有限的資源下如何調整好資源分配對於應用來說尤為重要
   
    關於Heap的幾個參數設置
   
    說了Heap的有限資源問題以後就來看看如何通過配置去改變JVM對於Heap的分配下面所說的主要是對於Java Heap的分配那麼在申請了Java Heap以後剩下的可用資源就會被使用到Native Heap
   
    Xms: java heap初始化時的大小默認情況是機器物理內存的/這個主要是根據應用啟動時消耗的資源決定分配少了申請起來會降低啟動速度分配多了也浪費
   
    Xmx:java heap的最大值默認是機器物理內存的/最大也就到G這個值決定了最多可用的Java Heap Memory分配過少就會在應用需要大量內存作緩存或者零時對象時出現OOM的問題如果分配過大那麼就會產生上文提到的第二類OOM所以如何配置還是根據運行過程中的分析和計算來確定如果不能確定還是采用默認的配置
   
    Xmn:java heap新生代的空間大小在GC模型中根據對象的生命周期的長短產生了內存分代的設計青年代(內部也分成三部分類似於整體劃分的作用可以通過配置來設置比例)老年代持久代每一代的管理和回收策略都不相同最為活躍的就是青年代同時這部分的內存分配和管理效率也是最高通常情況下對於內存的申請優先在新生代中申請當內存不夠時會整理新生代當整理以後還是不能滿足申請的內存就會向老年代移動一些生命周期較長的對象這種整理和移動會消耗資源同時降低系統運行響應能力因此如果青年代設置的過小就會頻繁的整理和移動對性能造成影響那是否把年青代設置的越大越好其實不然年青代采用的是復制搜集算法這種算法必須停止所有應用程序線程服務器線程切換時間就會成為應用響應的瓶頸(當然永遠不用收集那麼就不存在這個問題)老年代采用的是串行標記收集的方式並發收集可以減少對於應用的影響
   
    Xss:線程堆棧最大值允許更多的虛擬內存空間地址被Java Heap使用
   
    以下是sun公司的性能優化白皮書中提到的幾個例子
   
    對於吞吐量的調優機器配置G的內存個線程並發能力
   
    java
   
    Xmxm Xmsm Xmng Xssk XX:+UseParallelGC XX:ParallelGCThreads=
   
    Xmxm Xmsm
   
    配置了最大Java Heap來充分利用系統內存
   
    Xmng
   
    創建足夠大的青年代(可以並行被回收)充分利用系統內存防止將短期對象復制到老年代
   
    Xss
   
    減少默認最大的線程棧大小提供更多的處理虛擬內存地址空間被進程使用
   
    XX:+UseParallelGC
   
    采用並行垃圾收集器對年青代的內存進行收集提高效率
   
    XX:ParallelGCThreads=
   
    減少垃圾收集線程默認是和服務器可支持的線程最大並發數相同往往不需要配置到最大值
   
   
   
    嘗試采用對老年代並行收集
   
    java
   
    Xmxm Xmsm Xmng Xssk XX:+UseParallelGC XX:ParallelGCThreads= XX:+UseParallelOldGC
   
    Xmxm Xmsm
   
    內存分配被減小因為ParallelOldGC會增加對於Native Heap的需求因此需要減小Java Heap來滿足需求
   
    XX:+UseParallelOldGC
   
    采用對於老年代並發收集的策略可以提高收集效率
   
   
   
    提高吞吐量減少應用停頓時間
   
    java
   
    Xmxm Xmsm Xmng Xssk XX:ParallelGCThreads= XX:+UseConcMarkSweepGC XX:+UseParNewGC XX:SurvivorRatio= XX:TargetSurvivorRatio= XX:MaxTenuringThreshold=
   
    XX:+UseConcMarkSweepGC XX:+UseParNewGC
   
    選擇了並發標記交換收集器它可以並發執行收集操作降低應用停止時間同時它也是並行處理模式可以有效地利用多處理器的系統的多進程處理
   
    XX:SurvivorRatio= XX:MaxTenuringThreshold=
   
    表示在青年代中Eden和Survivor比例設置增加了Survivor的大小越大的survivor空間可以允許短期對象盡量在年青代消亡
   
    XX:TargetSurvivorRatio=
   
    允許%的空間被占用超過默認的%提高對於survivor的使用率
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25818.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.