天天看點

JVM 性能調優

作為一個程式開發人員,程式性能除了跟硬體,軟體,網絡環境有關外,對于java虛拟機的參數設定也是有一定影響的,是以對于了解jvm的參數資訊和如何合理到配置他們我給大家總結了一些知識。

首先讓我們看看程式運作效率慢有哪些情況:

1、cpu使用率太高,達到90%以上,遇到這種情況時先使用監控工具快讀定位哪裡有死循環活在很複雜的計算,對于死循環通過阻塞式隊列解決,對于大計算,建議配置設定單獨的機器做背景計算,盡量不要影響使用者互動,如果一定要的話,隻能通過大量分布式來實作

2、程序太多,程序太多将導緻程式運作到等待cpu資源時間變長

最有效的方法就是減少程序,不是程序越多效率越高,一般來說線程數和cpu的核心數相同,這樣既不會造成線程切換,又不會浪費cpu資源

3、記憶體消耗過高

及時對不必要到資源對象進行釋放,列如檔案到輸入輸出流,資料庫連接配接,對象不在需要的時候置空等等

使用對象緩存池緩沖

采用合理的緩存失效算法

4、網絡帶寬不給力,網絡慢是網絡資料互動到最大障礙,網速太慢意味你的資料傳輸通道越窄,資料傳送到效率當然更慢一些,好比在單行道和多車道上行駛汽車一樣。解決辦法增加寬帶流量

5、資源消耗不多但程式運作緩慢

使用并發包,減少鎖競争

對于必須單線程執行的使用隊列處理

大量分布式處理

6、未充分利用硬體資源

 涉及多任務處理和并發時采用多線程處理

對業務進行拆分,減少業務執行時間

接下來給大家講解一下jvm有哪些參數及含義

 -xms     初始堆大小     預設值為實體記憶體的1/64(<1gb)    

解釋:預設(minheapfreeratio參數可以調整)空餘堆記憶體小于40%時,jvm就會增大堆直到-xmx的最大限制.

-xmx      最大堆大小     預設值實體記憶體的1/4(<1gb)

解釋:預設(maxheapfreeratio參數可以調整)空餘堆記憶體大于70%時,jvm會減少堆直到 -xms的最小限制-xmn年輕代大小(1.4or lator)

-xx:newsize設定新生代大小

-xx:maxnewsize新生代最大值

-xx:permsize設定持久代(perm gen)初始值實體記憶體的1/64

 -xx:maxpermsize設定持久代最大值實體記憶體的1/4 

-xss每個線程的堆棧大小 jdk5.0以後每個線程堆棧大小為1m,以前每個線程堆棧大小為256k.更具應用的線程所需記憶體大小進行 調整.在相同實體記憶體下,減小這個值能生成更多的線程.但是作業系統對一個程序内的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右

一般小的應用, 如果棧不是很深, 應該是128k夠用的 大的應用建議使用256k。

-xx:survivorratioeden區與survivor區的大小比值 設定為8,則兩個survivor區與一個eden區的比值為2:8,一個survivor區占整個新生代的1/10

-xx:largepagesizeinbytes記憶體頁的大小不可設定過大, 會影響perm的大小 =128m

-xx:+usefastaccessormethods原始類型的快速優化  

-xx:+disableexplicitgc關閉system.gc() 這個參數需要嚴格的測試

-xx:maxtenuringthreshold垃圾最大年齡 如果設定為0的話,則年輕代對象不經過survivor區,直接進入年老代. 對于年老代比較多的應用,可以提高效率.如果将此值設定為一個較大值,則年輕代對象會在survivor區進行多次複制,這樣可以增加對象再年輕代的存活 時間,增加在年輕代即被回收的機率

該參數隻有在串行gc時才有效.-xx:+aggressiveopts加快編譯  

-xx:+usebiasedlocking鎖機制的性能改善  -xnoclassgc禁用垃圾回收  

-xx:+useparnewgc設定年輕代為并行收集 可與cms收集同時使用

-xx:+useconcmarksweepgc使用cms記憶體收集 測試中配置這個以後,

-xx:newratio=4的配置失效了,原因不明.

-xx:cmsfullgcsbeforecompaction多少次後進行記憶體壓縮 由于并發收集器不對記憶體空間進行壓縮,整理,是以運作一段時間以後會産生"碎片",使得運作效率降低.此值設定運作多少次gc以後對記憶體空間進行壓縮,整理.

-xx:+cmsparallelremarkenabled降低标記停頓 

我一般這樣設定的:

-server -xmx3g -xms3g -xx:maxpermsize=128m 

-xx:newratio=1 

-xx:survivorratio=8 

-xx:+useparallelgc 

-xx:parallelgcthreads=8  

-xx:+useparalleloldgc 

-xx:largepagesizeinbytes=128m

-xx:+usefastaccessormethods

-xx:+disableexplicitgc