JVM調優基礎

f663x 9年前發布 | 18K 次閱讀 JVM Java開發

一、JVM調優基本流程

1、劃分應用程序的系統需求優先級

2、選擇JVM部署模式:單JVM、多JVM

3、選擇JVM運行模式

4、調優應用程序內存使用

5、調優應用程序延遲
6、調優應用程序吞吐量


二、選擇JVM部署模式:單JVM、多JVM

1、單JVM

優點:不需要管理多個JVM,降低管理成本; 應用程序消耗內存數量較少

缺點:存在單點故障,一個JVM失效時,整個系統失效。

2、多JVM

優點:更好的可用性,避免單點故障;更低延遲,因為垃圾收集所產生的停頓是程序延遲的主要原因,多JVM減少了每次Full GC所需的時間。

缺點:監控、管理困難,且消耗較多的內存數量。


三、選擇JVM運行模式:

1、client與server模式

-client:把應用當成客戶端類程序進行優化。該選項應該在應用啟動時使用,對這類應用程序而言,內存占用是最重要的性能標準,遠比高吞吐量重要。

-server:把應用當成服務器類程序進行優化。適用于高吞吐量比啟動時間和內存占用更重要的應用程序。

目前還有一個較新的選項:

-server -XX:TieredCompilation:結合了二者的優點,可以考慮代替-client。


2、-32與-64

使用32位JVM還是64位JVM由應用程序使用的內存來決定,基本原則如下:

0~2G:32位

2G~32G:使用-d64 -XX:+UserCompressedOops

32G以上:64位

事實上,在Java6 Update18之后,JVM根據堆大小自動啟用-XX:+UserCompressedOops,因此配置時2G以內使用-32,2G以上使用-64即可。
</div>


3、選擇垃圾收集器

一般情況下,使用默認的Throughput收集器即可。


四、確定內存占用

1、垃圾收集基礎

(1)三個性能屬性(內存占用、延遲、吞吐量)中任何一個屬性性能的提高幾乎都是以另一個或者2個屬性的性能損失作為代價的。

(2)在程序運行中開啟垃圾收集器日志可以收集GC的大量信息,從而為調優作好數據準備,以下命令用于開啟GC日志:

java -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:./test.log SignalGenerator

詳細分析請見《JAVA性能優化權威指南》P194.


2、JAVA程序的內存布局

正如其它一切應用,JAVA在內存中的占用主要分為堆和棧2種,其中堆用于保存程序運行中的各種對象,棧用于保存程序的方法調用、線程調用等。

(1)棧:線程越多,方法調用層次越深,棧占用的內存就越大。

(2)堆:JVM中的堆分為三部分:新生代、老生代、永久代。


3、關于新生代、老生代、永久代。

(1)Java應用程序分配Java對象時,首先在新生代空間中分配對象。存活下來的對象,即經過幾次Full GC之后還保持活躍的對象會被提升進入老生代空間。永久代空間中存放VM和Java類的元數據,以及駐留的Strings和類靜態變量。

(2)新生代與老生代共用Java堆空間,永久代單獨使用空間。


4、堆空間配置選項:

(1)-Xms:初始堆大小   -Xmx:最大堆大小

sesese色