JVM调优基础
一、JVM調(diào)優(yōu)基本流程
1、劃分應(yīng)用程序的系統(tǒng)需求優(yōu)先級(jí)
2、選擇JVM部署模式:單JVM、多JVM
3、選擇JVM運(yùn)行模式
4、調(diào)優(yōu)應(yīng)用程序內(nèi)存使用
5、調(diào)優(yōu)應(yīng)用程序延遲
6、調(diào)優(yōu)應(yīng)用程序吞吐量
二、選擇JVM部署模式:單JVM、多JVM 1、單JVM 優(yōu)點(diǎn):不需要管理多個(gè)JVM,降低管理成本; 應(yīng)用程序消耗內(nèi)存數(shù)量較少 缺點(diǎn):存在單點(diǎn)故障,一個(gè)JVM失效時(shí),整個(gè)系統(tǒng)失效。 2、多JVM 優(yōu)點(diǎn):更好的可用性,避免單點(diǎn)故障;更低延遲,因?yàn)槔占a(chǎn)生的停頓是程序延遲的主要原因,多JVM減少了每次Full GC所需的時(shí)間。 缺點(diǎn):監(jiān)控、管理困難,且消耗較多的內(nèi)存數(shù)量。
三、選擇JVM運(yùn)行模式: 1、client與server模式 -client:把應(yīng)用當(dāng)成客戶端類程序進(jìn)行優(yōu)化。該選項(xiàng)應(yīng)該在應(yīng)用啟動(dòng)時(shí)使用,對(duì)這類應(yīng)用程序而言,內(nèi)存占用是最重要的性能標(biāo)準(zhǔn),遠(yuǎn)比高吞吐量重要。 -server:把應(yīng)用當(dāng)成服務(wù)器類程序進(jìn)行優(yōu)化。適用于高吞吐量比啟動(dòng)時(shí)間和內(nèi)存占用更重要的應(yīng)用程序。 目前還有一個(gè)較新的選項(xiàng): -server -XX:TieredCompilation:結(jié)合了二者的優(yōu)點(diǎn),可以考慮代替-client。
2、-32與-64 使用32位JVM還是64位JVM由應(yīng)用程序使用的內(nèi)存來決定,基本原則如下: 0~2G:32位 2G~32G:使用-d64 -XX:+UserCompressedOops 32G以上:64位 事實(shí)上,在Java6 Update18之后,JVM根據(jù)堆大小自動(dòng)啟用-XX:+UserCompressedOops,因此配置時(shí)2G以內(nèi)使用-32,2G以上使用-64即可。
3、選擇垃圾收集器 一般情況下,使用默認(rèn)的Throughput收集器即可。
四、確定內(nèi)存占用 1、垃圾收集基礎(chǔ) (1)三個(gè)性能屬性(內(nèi)存占用、延遲、吞吐量)中任何一個(gè)屬性性能的提高幾乎都是以另一個(gè)或者2個(gè)屬性的性能損失作為代價(jià)的。 (2)在程序運(yùn)行中開啟垃圾收集器日志可以收集GC的大量信息,從而為調(diào)優(yōu)作好數(shù)據(jù)準(zhǔn)備,以下命令用于開啟GC日志: java -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:./test.log SignalGenerator
詳細(xì)分析請(qǐng)見《JAVA性能優(yōu)化權(quán)威指南》P194.
2、JAVA程序的內(nèi)存布局 正如其它一切應(yīng)用,JAVA在內(nèi)存中的占用主要分為堆和棧2種,其中堆用于保存程序運(yùn)行中的各種對(duì)象,棧用于保存程序的方法調(diào)用、線程調(diào)用等。 (1)棧:線程越多,方法調(diào)用層次越深,棧占用的內(nèi)存就越大。 (2)堆:JVM中的堆分為三部分:新生代、老生代、永久代。
3、關(guān)于新生代、老生代、永久代。 (1)Java應(yīng)用程序分配Java對(duì)象時(shí),首先在新生代空間中分配對(duì)象。存活下來的對(duì)象,即經(jīng)過幾次Full GC之后還保持活躍的對(duì)象會(huì)被提升進(jìn)入老生代空間。永久代空間中存放VM和Java類的元數(shù)據(jù),以及駐留的Strings和類靜態(tài)變量。 (2)新生代與老生代共用Java堆空間,永久代單獨(dú)使用空間。
4、堆空間配置選項(xiàng): (1)-Xms:初始堆大小 ? -Xmx:最大堆大小
(3)-XX:PermSize=<n>[g|m|k] ?-XX:MaxPermSize=<n>[g|m|k] 用于設(shè)置永久代的空間大小。
5、計(jì)算活躍數(shù)據(jù)大小 活躍數(shù)據(jù)是指應(yīng)用程序處于穩(wěn)定態(tài)(多次執(zhí)行Full GC以后),Full GC之后Java堆中老年代和永久代所占用的空間大小。
6、Java堆大小計(jì)算法則
二、選擇JVM部署模式:單JVM、多JVM 1、單JVM 優(yōu)點(diǎn):不需要管理多個(gè)JVM,降低管理成本; 應(yīng)用程序消耗內(nèi)存數(shù)量較少 缺點(diǎn):存在單點(diǎn)故障,一個(gè)JVM失效時(shí),整個(gè)系統(tǒng)失效。 2、多JVM 優(yōu)點(diǎn):更好的可用性,避免單點(diǎn)故障;更低延遲,因?yàn)槔占a(chǎn)生的停頓是程序延遲的主要原因,多JVM減少了每次Full GC所需的時(shí)間。 缺點(diǎn):監(jiān)控、管理困難,且消耗較多的內(nèi)存數(shù)量。
三、選擇JVM運(yùn)行模式: 1、client與server模式 -client:把應(yīng)用當(dāng)成客戶端類程序進(jìn)行優(yōu)化。該選項(xiàng)應(yīng)該在應(yīng)用啟動(dòng)時(shí)使用,對(duì)這類應(yīng)用程序而言,內(nèi)存占用是最重要的性能標(biāo)準(zhǔn),遠(yuǎn)比高吞吐量重要。 -server:把應(yīng)用當(dāng)成服務(wù)器類程序進(jìn)行優(yōu)化。適用于高吞吐量比啟動(dòng)時(shí)間和內(nèi)存占用更重要的應(yīng)用程序。 目前還有一個(gè)較新的選項(xiàng): -server -XX:TieredCompilation:結(jié)合了二者的優(yōu)點(diǎn),可以考慮代替-client。
2、-32與-64 使用32位JVM還是64位JVM由應(yīng)用程序使用的內(nèi)存來決定,基本原則如下: 0~2G:32位 2G~32G:使用-d64 -XX:+UserCompressedOops 32G以上:64位 事實(shí)上,在Java6 Update18之后,JVM根據(jù)堆大小自動(dòng)啟用-XX:+UserCompressedOops,因此配置時(shí)2G以內(nèi)使用-32,2G以上使用-64即可。
3、選擇垃圾收集器 一般情況下,使用默認(rèn)的Throughput收集器即可。
四、確定內(nèi)存占用 1、垃圾收集基礎(chǔ) (1)三個(gè)性能屬性(內(nèi)存占用、延遲、吞吐量)中任何一個(gè)屬性性能的提高幾乎都是以另一個(gè)或者2個(gè)屬性的性能損失作為代價(jià)的。 (2)在程序運(yùn)行中開啟垃圾收集器日志可以收集GC的大量信息,從而為調(diào)優(yōu)作好數(shù)據(jù)準(zhǔn)備,以下命令用于開啟GC日志: java -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:./test.log SignalGenerator
詳細(xì)分析請(qǐng)見《JAVA性能優(yōu)化權(quán)威指南》P194.
2、JAVA程序的內(nèi)存布局 正如其它一切應(yīng)用,JAVA在內(nèi)存中的占用主要分為堆和棧2種,其中堆用于保存程序運(yùn)行中的各種對(duì)象,棧用于保存程序的方法調(diào)用、線程調(diào)用等。 (1)棧:線程越多,方法調(diào)用層次越深,棧占用的內(nèi)存就越大。 (2)堆:JVM中的堆分為三部分:新生代、老生代、永久代。
3、關(guān)于新生代、老生代、永久代。 (1)Java應(yīng)用程序分配Java對(duì)象時(shí),首先在新生代空間中分配對(duì)象。存活下來的對(duì)象,即經(jīng)過幾次Full GC之后還保持活躍的對(duì)象會(huì)被提升進(jìn)入老生代空間。永久代空間中存放VM和Java類的元數(shù)據(jù),以及駐留的Strings和類靜態(tài)變量。 (2)新生代與老生代共用Java堆空間,永久代單獨(dú)使用空間。
4、堆空間配置選項(xiàng): (1)-Xms:初始堆大小 ? -Xmx:最大堆大小
- 默認(rèn)(MinHeapFreeRatio參數(shù)可以調(diào)整)空余堆內(nèi)存小于40%時(shí),JVM就會(huì)增大堆直到-Xmx的最大限制。默認(rèn)(MaxHeapFreeRatio參數(shù)可以調(diào)整)空余堆內(nèi)存大于70%時(shí),JVM會(huì)減少堆直到 -Xms的最小限制。
- 上面指定的空間大小為新老生代所共用,默認(rèn)情況下JVM可以根據(jù)應(yīng)用程序的需要?jiǎng)討B(tài)的擴(kuò)展或者收縮。
- 關(guān)注吞吐量及延遲的應(yīng)用程序應(yīng)該將-Xms與-Xmx設(shè)定為同一值。這是因?yàn)闊o論擴(kuò)展還是收縮新生代或者老生代空間都要進(jìn)行Full GC。
(3)-XX:PermSize=<n>[g|m|k] ?-XX:MaxPermSize=<n>[g|m|k] 用于設(shè)置永久代的空間大小。
5、計(jì)算活躍數(shù)據(jù)大小 活躍數(shù)據(jù)是指應(yīng)用程序處于穩(wěn)定態(tài)(多次執(zhí)行Full GC以后),Full GC之后Java堆中老年代和永久代所占用的空間大小。
6、Java堆大小計(jì)算法則
| java堆 | -Xms -Xmx | 3~4倍Full GC后的老年代空間大小 |
| 永久代 | -XX:PermSize -XX:MaxPermSize | 1.2~1.5倍Full GC后的永久代空間大小 |
| 新生代 | -Xmn | 1~1.5倍Full GC后的老年代空間大小 |
| 老生代 | java堆大小減去新生代大小 | 2~3倍Full GC后的老年代空間大小 |
總結(jié)
- 上一篇: 如何在hadoop中控制map的个数
- 下一篇: NoSql中的B-tree、B+tree