Tomcat 調(diào)優(yōu)及 JVM 參數(shù)優(yōu)化

Tomcat 的缺省配置是不能穩(wěn)定長期運行的挥吵,也就是不適合生產(chǎn)環(huán)境,它會死機花椭,讓你不斷重新啟動忽匈,甚至在午夜時分喚醒你。對于操作系統(tǒng)優(yōu)化來說矿辽,是盡可能的增大可使用的內(nèi)存容量丹允、提高CPU 的頻率,保證文件系統(tǒng)的讀寫速率等袋倔。經(jīng)過壓力測試驗證雕蔽,在并發(fā)連接很多的情況下,CPU 的處理能力越強宾娜,系統(tǒng)運行速度越快批狐。

1446271963871899.png

Tomcat 的優(yōu)化不像其它軟件那樣,簡簡單單的修改幾個參數(shù)就可以了前塔,它的優(yōu)化主要有三方面嚣艇,分為系統(tǒng)優(yōu)化,Tomcat 本身的優(yōu)化华弓,Java 虛擬機(JVM)調(diào)優(yōu)食零。系統(tǒng)優(yōu)化就不在介紹了,接下來就詳細的介紹一下 Tomcat 本身與 JVM 優(yōu)化寂屏,以 Tomcat 7 為例贰谣。
一、Tomcat 本身優(yōu)化

Tomcat 的自身參數(shù)的優(yōu)化迁霎,這塊很像 ApacheHttp Server吱抚。修改一下 xml 配置文件中的參數(shù),調(diào)整最大連接數(shù)考廉,超時等频伤。此外,我們安裝 Tomcat 是芝此,優(yōu)化就已經(jīng)開始了憋肖。

1、工作方式選擇

為了提升性能婚苹,首先就要對代碼進行動靜分離岸更,讓 Tomcat 只負責 jsp 文件的解析工作。如采用 Apache 和 Tomcat 的整合方式膊升,他們之間的連接方案有三種選擇怎炊,JK、http_proxy 和 ajp_proxy。相對于 JK 的連接方式评肆,后兩種在配置上比較簡單的债查,靈活性方面也一點都不遜色。但就穩(wěn)定性而言不像JK 這樣久經(jīng)考驗瓜挽,所以建議采用 JK 的連接方式盹廷。

2、Connector 連接器的配置

之前文件介紹過的 Tomcat 連接器的三種方式: bio久橙、nio 和 apr俄占,三種方式性能差別很大,apr 的性能最優(yōu)淆衷, bio 的性能最差缸榄。而 Tomcat 7 使用的 Connector 默認就啟用的 Apr 協(xié)議,但需要系統(tǒng)安裝 Apr 庫祝拯,否則就會使用 bio 方式甚带。

3、配置文件優(yōu)化

配置文件優(yōu)化其實就是對 server.xml 優(yōu)化佳头,可以提大大提高 Tomcat 的處理請求的能力欲低,下面我們來看 Tomcat 容器內(nèi)的優(yōu)化。

默認配置下畜晰,Tomcat 會為每個連接器創(chuàng)建一個綁定的線程池(最大線程數(shù) 200),服務啟動時瑞筐,默認創(chuàng)建了 5 個空閑線程隨時等待用戶請求凄鼻。
首先,打開 ${TOMCAT_HOME}/conf/server.xml聚假,搜索【<Executor name="tomcatThreadPool"】块蚌,開啟并調(diào)整為

 <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="500" minSpareThreads="20" maxSpareThreads="50" maxIdleTime="60000"/>

注意, Tomcat 7 在開啟線程池前膘格,一定要安裝好 Apr 庫峭范,并可以啟用,否則會有錯誤報出瘪贱,shutdown.sh 腳本無法關(guān)閉進程纱控。

然后,修改<Connector …>節(jié)點菜秦,增加 executor 屬性甜害,搜索【port="8080"】,調(diào)整為

 <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               URIEncoding="UTF-8"
               connectionTimeout="30000"
               enableLookups="false"
               disableUploadTimeout="false"
               connectionUploadTimeout="150000"
               acceptCount="300"
               keepAliveTimeout="120000"
               maxKeepAliveRequests="1"
               compression="on"
               compressionMinSize="2048"
               compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png" 
               redirectPort="8443" />

maxThreads :Tomcat 使用線程來處理接收的每個請求球昨,這個值表示 Tomcat 可創(chuàng)建的最大的線程數(shù)尔店,默認值是 200

minSpareThreads:最小空閑線程數(shù),Tomcat 啟動時的初始化的線程數(shù),表示即使沒有人使用也開這么多空線程等待嚣州,默認值是 10鲫售。

maxSpareThreads:最大備用線程數(shù),一旦創(chuàng)建的線程超過這個值该肴,Tomcat 就會關(guān)閉不再需要的 socket 線程情竹。

上邊配置的參數(shù),最大線程 500(一般服務器足以)沙庐,要根據(jù)自己的實際情況合理設置鲤妥,設置越大會耗費內(nèi)存和 CPU,因為 CPU 疲于線程上下文切換拱雏,沒有精力提供請求服務了棉安,最小空閑線程數(shù) 20,線程最大空閑時間 60 秒铸抑,當然允許的最大線程連接數(shù)還受制于操作系統(tǒng)的內(nèi)核參數(shù)設置贡耽,設置多大要根據(jù)自己的需求與環(huán)境。當然線程可以配置在“tomcatThreadPool”中鹊汛,也可以直接配置在“Connector”中蒲赂,但不可以重復配置。

URIEncoding:指定 Tomcat 容器的 URL 編碼格式刁憋,語言編碼格式這塊倒不如其它 WEB 服務器軟件配置方便滥嘴,需要分別指定。

connnectionTimeout: 網(wǎng)絡連接超時至耻,單位:毫秒若皱,設置為 0 表示永不超時,這樣設置有隱患的尘颓。通匙叽ィ可設置為 30000 毫秒,可根據(jù)檢測實際情況疤苹,適當修改互广。

enableLookups: 是否反查域名,以返回遠程主機的主機名卧土,取值為:true 或 false惫皱,如果設置為false,則直接返回IP地址尤莺,為了提高處理能力逸吵,應設置為 false。

disableUploadTimeout:上傳時是否使用超時機制缝裁。

connectionUploadTimeout:上傳超時時間扫皱,畢竟文件上傳可能需要消耗更多的時間足绅,這個根據(jù)你自己的業(yè)務需要自己調(diào),以使Servlet有較長的時間來完成它的執(zhí)行韩脑,需要與上一個參數(shù)一起配合使用才會生效氢妈。

acceptCount:指定當所有可以使用的處理請求的線程數(shù)都被使用時,可傳入連接請求的最大隊列長度段多,超過這個數(shù)的請求將不予處理首量,默認為100個。

keepAliveTimeout:長連接最大保持時間(毫秒)进苍,表示在下次請求過來之前加缘,Tomcat 保持該連接多久,默認是使用 connectionTimeout 時間觉啊,-1 為不限制超時拣宏。

maxKeepAliveRequests:表示在服務器關(guān)閉之前,該連接最大支持的請求數(shù)杠人。超過該請求數(shù)的連接也將被關(guān)閉勋乾,1表示禁用,-1表示不限制個數(shù)嗡善,默認100個辑莫,一般設置在100~200之間。

compression:是否對響應的數(shù)據(jù)進行 GZIP 壓縮罩引,off:表示禁止壓縮各吨;

on:表示允許壓縮(文本將被壓縮)、force:表示所有情況下都進行壓縮袁铐,默認值為off揭蜒,壓縮數(shù)據(jù)后可以有效的減少頁面的大小,一般可以減小1/3左右昭躺,節(jié)省帶寬。

compressionMinSize:表示壓縮響應的最小值伪嫁,只有當響應報文大小大于這個值的時候才會對報文進行壓縮领炫,如果開啟了壓縮功能,默認值就是2048张咳。

compressableMimeType:壓縮類型帝洪,指定對哪些類型的文件進行數(shù)據(jù)壓縮。

noCompressionUserAgents="gozilla, traviata": 對于以下的瀏覽器脚猾,不啟用壓縮葱峡。

如果已經(jīng)對代碼進行了動靜分離,靜態(tài)頁面和圖片等數(shù)據(jù)就不需要 Tomcat 處理了龙助,那么也就不需要配置在 Tomcat 中配置壓縮了砰奕。
以上是一些常用的配置參數(shù)屬性,當然還有好多其它的參數(shù)設置,還可以繼續(xù)深入的優(yōu)化军援,HTTP Connector 與 AJP Connector 的參數(shù)屬性值仅淑,可以參考官方文檔的詳細說明:
https://tomcat.apache.org/tomcat-7.0-doc/config/http.html
https://tomcat.apache.org/tomcat-7.0-doc/config/ajp.html

二、JVM 優(yōu)化

Tomcat 啟動命令行中的優(yōu)化參數(shù)胸哥,就是 JVM 的優(yōu)化 涯竟。Tomcat 首先跑在 JVM 之上的,因為它的啟動其實也只是一個 java 命令行空厌,首先我們需要對這個 JAVA 的啟動命令行進行調(diào)優(yōu)庐船。不管是 YGC 還是 Full GC,GC 過程中都會對導致程序運行中中斷嘲更,正確的選擇不同的 GC 策略筐钟,調(diào)整 JVM、GC 的參數(shù)哮内,可以極大的減少由于 GC 工作盗棵,而導致的程序運行中斷方面的問題,進而適當?shù)奶岣?Java 程序的工作效率北发。但是調(diào)整 GC 是以個極為復雜的過程纹因,由于各個程序具備不同的特點,如:web 和 GUI 程序就有很大區(qū)別(Web可以適當?shù)耐nD琳拨,但GUI停頓是客戶無法接受的)爸舒,而且由于跑在各個機器上的配置不同(主要 cup 個數(shù),內(nèi)存不同)摹蘑,所以使用的 GC 種類也會不同舀透。

1、JVM 參數(shù)配置方法

Tomcat 的啟動參數(shù)位于安裝目錄 ${JAVA_HOME}/bin目錄下密任,Linux 操作系統(tǒng)就是 catalina.sh 文件颜启。JAVA_OPTS,就是用來設置 JVM 相關(guān)運行參數(shù)的變量浪讳,還可以在 CATALINA_OPTS 變量中設置缰盏。關(guān)于這 2 個變量,還是多少有些區(qū)別的:

JAVA_OPTS:用于當 Java 運行時選項“start”淹遵、“stop”或“run”命令執(zhí)行口猜。

CATALINA_OPTS:用于當 Java 運行時選項“start”或“run”命令執(zhí)行。

為什么有兩個不同的變量透揣?它們之間都有什么區(qū)別呢济炎?

首先,在啟動 Tomcat 時辐真,任何指定變量的傳遞方式都是相同的须尚,可以傳遞到執(zhí)行“start”或“run”命令中崖堤,但只有設定在 JAVA_OPTS 變量里的參數(shù)被傳遞到“stop”命令中。對于 Tomcat 運行過程恨闪,可能沒什么區(qū)別倘感,影響的是結(jié)束程序,而不是啟動程序咙咽。

第二個區(qū)別是更微妙老玛,其他應用程序也可以使用 JAVA_OPTS 變量,但只有在 Tomcat 中使用 CATALINA_OPTS 變量钧敞。如果你設置環(huán)境變量為只使用 Tomcat蜡豹,最好你會建議使用 CATALINA_OPTS 變量,而如果你設置環(huán)境變量使用其它的 Java 應用程序溉苛,例如 JBoss镜廉,你應該把你的設置放在JAVA_OPTS 變量中。

2愚战、JVM 參數(shù)屬性

32 位系統(tǒng)下 JVM 對內(nèi)存的限制:不能突破 2GB 娇唯,那么這時你的 Tomcat 要優(yōu)化,就要講究點技巧了寂玲,而在 64 位操作系統(tǒng)上無論是系統(tǒng)內(nèi)存還是 JVM 都沒有受到 2GB 這樣的限制塔插。

針對于 JMX 遠程監(jiān)控也是在這里設置,以下為 64 位系統(tǒng)環(huán)境下的配置拓哟,內(nèi)存加入的參數(shù)如下:

CATALINA_OPTS="
-server 
-Xms6000M 
-Xmx6000M 
-Xss512k 
-XX:NewSize=2250M 
-XX:MaxNewSize=2250M 
-XX:PermSize=128M
-XX:MaxPermSize=256M  
-XX:+AggressiveOpts 
-XX:+UseBiasedLocking 
-XX:+DisableExplicitGC 
-XX:+UseParNewGC 
-XX:+UseConcMarkSweepGC 
-XX:MaxTenuringThreshold=31 
-XX:+CMSParallelRemarkEnabled 
-XX:+UseCMSCompactAtFullCollection 
-XX:LargePageSizeInBytes=128m 
-XX:+UseFastAccessorMethods 
-XX:+UseCMSInitiatingOccupancyOnly
-Duser.timezone=Asia/Shanghai 
-Djava.awt.headless=true"

為了看著方便想许,將每個參數(shù)單獨寫一行。上面參數(shù)好多啊断序,可能有人寫到現(xiàn)在都沒見過一個在 Tomcat 的啟動命令里加了這么多參數(shù)流纹,當然,這些參數(shù)只是我機器上的违诗,不一定適合你漱凝,尤其是參數(shù)后的 value(值)是需要根據(jù)你自己的實際情況來設置的。

上述這樣的配置诸迟,基本上可以達到:

系統(tǒng)響應時間增快茸炒;

JVM回收速度增快同時又不影響系統(tǒng)的響應率;

JVM內(nèi)存最大化利用亮蒋;

線程阻塞情況最小化扣典。

JVM 常用參數(shù)詳解:

-server:一定要作為第一個參數(shù)妆毕,在多個 CPU 時性能佳慎玖,還有一種叫 -client 的模式,特點是啟動速度比較快笛粘,但運行時性能和內(nèi)存管理效率不高趁怔,通常用于客戶端應用程序或開發(fā)調(diào)試湿硝,在 32 位環(huán)境下直接運行 Java 程序默認啟用該模式。Server 模式的特點是啟動速度比較慢润努,但運行時性能和內(nèi)存管理效率很高关斜,適用于生產(chǎn)環(huán)境,在具有 64 位能力的 JDK 環(huán)境下默認啟用該模式铺浇,可以不配置該參數(shù)痢畜。

-Xms:表示 Java 初始化堆的大小,-Xms 與-Xmx 設成一樣的值鳍侣,避免 JVM 反復重新申請內(nèi)存丁稀,導致性能大起大落,默認值為物理內(nèi)存的 1/64倚聚,默認(MinHeapFreeRatio參數(shù)可以調(diào)整)空余堆內(nèi)存小于 40% 時线衫,JVM 就會增大堆直到 -Xmx 的最大限制。

-Xmx:表示最大 Java 堆大小惑折,當應用程序需要的內(nèi)存超出堆的最大值時虛擬機就會提示內(nèi)存溢出授账,并且導致應用服務崩潰,因此一般建議堆的最大值設置為可用內(nèi)存的最大值的80%惨驶。如何知道我的 JVM 能夠使用最大值白热,使用 java -Xmx512M -version 命令來進行測試,然后逐漸的增大 512 的值,如果執(zhí)行正常就表示指定的內(nèi)存大小可用敞咧,否則會打印錯誤信息棘捣,默認值為物理內(nèi)存的 1/4,默認(MinHeapFreeRatio參數(shù)可以調(diào)整)空余堆內(nèi)存大于 70% 時休建,JVM 會減少堆直到-Xms 的最小限制乍恐。

-Xss:表示每個 Java 線程堆棧大小,JDK 5.0 以后每個線程堆棧大小為 1M测砂,以前每個線程堆棧大小為 256K茵烈。根據(jù)應用的線程所需內(nèi)存大小進行調(diào)整,在相同物理內(nèi)存下砌些,減小這個值能生成更多的線程呜投,但是操作系統(tǒng)對一個進程內(nèi)的線程數(shù)還是有限制的,不能無限生成存璃,經(jīng)驗值在 3000~5000 左右仑荐。一般小的應用, 如果棧不是很深纵东, 應該是128k 夠用的粘招,大的應用建議使用 256k 或 512K,一般不易設置超過 1M偎球,要不然容易出現(xiàn)out ofmemory洒扎。這個選項對性能影響比較大辑甜,需要嚴格的測試。

-XX:NewSize:設置新生代內(nèi)存大小袍冷。

-XX:MaxNewSize:設置最大新生代新生代內(nèi)存大小

-XX:PermSize:設置持久代內(nèi)存大小

-XX:MaxPermSize:設置最大值持久代內(nèi)存大小磷醋,永久代不屬于堆內(nèi)存,堆內(nèi)存只包含新生代和老年代胡诗。

-XX:+AggressiveOpts:作用如其名(aggressive)邓线,啟用這個參數(shù),則每當 JDK 版本升級時煌恢,你的 JVM 都會使用最新加入的優(yōu)化技術(shù)(如果有的話)褂痰。

-XX:+UseBiasedLocking:啟用一個優(yōu)化了的線程鎖,我們知道在我們的appserver症虑,每個http請求就是一個線程缩歪,有的請求短有的請求長,就會有請求排隊的現(xiàn)象谍憔,甚至還會出現(xiàn)線程阻塞匪蝙,這個優(yōu)化了的線程鎖使得你的appserver內(nèi)對線程處理自動進行最優(yōu)調(diào)配。

-XX:+DisableExplicitGC:在 程序代碼中不允許有顯示的調(diào)用“System.gc()”习贫。每次在到操作結(jié)束時手動調(diào)用 System.gc() 一下逛球,付出的代價就是系統(tǒng)響應時間嚴重降低,就和關(guān)于 Xms苫昌,Xmx 里的解釋的原理一樣颤绕,這樣去調(diào)用 GC 導致系統(tǒng)的 JVM 大起大落。

-XX:+UseConcMarkSweepGC:設置年老代為并發(fā)收集祟身,即 CMS gc奥务,這一特性只有 jdk1.5后續(xù)版本才具有的功能,它使用的是 gc 估算觸發(fā)和 heap 占用觸發(fā)袜硫。我們知道頻頻繁的 GC 會造面 JVM的大起大落從而影響到系統(tǒng)的效率氯葬,因此使用了 CMS GC 后可以在 GC 次數(shù)增多的情況下,每次 GC 的響應時間卻很短婉陷,比如說使用了 CMSGC 后經(jīng)過 jprofiler 的觀察帚称,GC 被觸發(fā)次數(shù)非常多,而每次 GC 耗時僅為幾毫秒秽澳。

-XX:+UseParNewGC:對新生代采用多線程并行回收闯睹,這樣收得快,注意最新的 JVM 版本担神,當使用 -XX:+UseConcMarkSweepGC 時楼吃,-XX:UseParNewGC 會自動開啟。因此,如果年輕代的并行 GC 不想開啟所刀,可以通過設置 -XX:-UseParNewGC 來關(guān)掉。

-XX:MaxTenuringThreshold:設置垃圾最大年齡捞挥。如果設置為0的話浮创,則新生代對象不經(jīng)過 Survivor 區(qū),直接進入老年代砌函。對于老年代比較多的應用(需要大量常駐內(nèi)存的應用)斩披,可以提高效率。如果將此值設置為一 個較大值讹俊,則新生代對象會在 Survivor 區(qū)進行多次復制垦沉,這樣可以增加對象在新生代的存活時間,增加在新生代即被回收的概率仍劈,減少Full GC的頻率厕倍,這樣做可以在某種程度上提高服務穩(wěn)定性。該參數(shù)只有在串行 GC 時才有效贩疙,這個值的設置是根據(jù)本地的 jprofiler 監(jiān)控后得到的一個理想的值讹弯,不能一概而論原搬照抄。

-XX:+CMSParallelRemarkEnabled:在使用 UseParNewGC 的情況下这溅,盡量減少 mark 的時間组民。

-XX:+UseCMSCompactAtFullCollection:在使用 concurrent gc 的情況下,防止 memoryfragmention悲靴,對 live object 進行整理臭胜,使 memory 碎片減少。

-XX:LargePageSizeInBytes:指定 Java heap 的分頁頁面大小癞尚,內(nèi)存頁的大小不可設置過大耸三, 會影響 Perm 的大小。

-XX:+UseFastAccessorMethods:使用 get浇揩,set 方法轉(zhuǎn)成本地代碼吕晌,原始類型的快速優(yōu)化。

-XX:+UseCMSInitiatingOccupancyOnly:只有在 oldgeneration 在使用了初始化的比例后 concurrent collector 啟動收集临燃。

-Duser.timezone=Asia/Shanghai:設置用戶所在時區(qū)睛驳。

-Djava.awt.headless=true:這個參數(shù)一般我們都是放在最后使用的,這全參數(shù)的作用是這樣的膜廊,有時我們會在我們的 J2EE 工程中使用一些圖表工具如:jfreechart乏沸,用于在 web 網(wǎng)頁輸出 GIF/JPG 等流,在 winodws 環(huán)境下爪瓜,一般我們的 app server 在輸出圖形時不會碰到什么問題蹬跃,但是在linux/unix 環(huán)境下經(jīng)常會碰到一個 exception 導致你在 winodws 開發(fā)環(huán)境下圖片顯示的好好可是在 linux/unix 下卻顯示不出來,因此加上這個參數(shù)以免避這樣的情況出現(xiàn)铆铆。

-Xmn:新生代的內(nèi)存空間大小蝶缀,注意:此處的大小是(eden+ 2 survivor space)丹喻。與 jmap -heap 中顯示的 New gen 是不同的。整個堆大小 = 新生代大小 + 老生代大小 + 永久代大小翁都。在保證堆大小不變的情況下碍论,增大新生代后,將會減小老生代大小柄慰。此值對系統(tǒng)性能影響較大鳍悠,Sun官方推薦配置為整個堆的 3/8。

-XX:CMSInitiatingOccupancyFraction:當堆滿之后坐搔,并行收集器便開始進行垃圾收集藏研,例如,當沒有足夠的空間來容納新分配或提升的對象概行。對于 CMS 收集器蠢挡,長時間等待是不可取的,因為在并發(fā)垃圾收集期間應用持續(xù)在運行(并且分配對象)凳忙。因此袒哥,為了在應用程序使用完內(nèi)存之前完成垃圾收集周期,CMS 收集器要比并行收集器更先啟動消略。因為不同的應用會有不同對象分配模式堡称,JVM 會收集實際的對象分配(和釋放)的運行時數(shù)據(jù),并且分析這些數(shù)據(jù)艺演,來決定什么時候啟動一次 CMS 垃圾收集周期却紧。這個參數(shù)設置有很大技巧,基本上滿足(Xmx-Xmn)(100-CMSInitiatingOccupancyFraction)/100 >= Xmn 就不會出現(xiàn) promotion failed胎撤。例如在應用中 Xmx 是6000晓殊,Xmn 是 512,那么 Xmx-Xmn 是 5488M伤提,也就是老年代有 5488M巫俺,CMSInitiatingOccupancyFraction=90 說明老年代到 90% 滿的時候開始執(zhí)行對老年代的并發(fā)垃圾回收(CMS),這時還 剩 10% 的空間是 548810% = 548M肿男,所以即使 Xmn(也就是新生代共512M)里所有對象都搬到老年代里介汹,548M 的空間也足夠了,所以只要滿足上面的公式舶沛,就不會出現(xiàn)垃圾回收時的 promotion failed嘹承,因此這個參數(shù)的設置必須與 Xmn 關(guān)聯(lián)在一起。

-XX:+CMSIncrementalMode:該標志將開啟 CMS 收集器的增量模式如庭。增量模式經(jīng)常暫停 CMS 過程叹卷,以便對應用程序線程作出完全的讓步。因此,收集器將花更長的時間完成整個收集周期骤竹。因此帝牡,只有通過測試后發(fā)現(xiàn)正常 CMS 周期對應用程序線程干擾太大時,才應該使用增量模式蒙揣。由于現(xiàn)代服務器有足夠的處理器來適應并發(fā)的垃圾收集靶溜,所以這種情況發(fā)生得很少,用于但 CPU情況鸣奔。

-XX:NewRatio:年輕代(包括 Eden 和兩個 Survivor 區(qū))與年老代的比值(除去持久代),-XX:NewRatio=4 表示年輕代與年老代所占比值為 1:4惩阶,年輕代占整個堆棧的 1/5挎狸,Xms=Xmx 并且設置了 Xmn 的情況下,該參數(shù)不需要進行設置断楷。

-XX:SurvivorRatio:Eden 區(qū)與 Survivor 區(qū)的大小比值锨匆,設置為 8,表示 2 個 Survivor 區(qū)(JVM 堆內(nèi)存年輕代中默認有 2 個大小相等的 Survivor 區(qū))與 1 個 Eden 區(qū)的比值為 2:8冬筒,即 1 個 Survivor 區(qū)占整個年輕代大小的 1/10恐锣。

-XX:+UseSerialGC:設置串行收集器。

-XX:+UseParallelGC:設置為并行收集器舞痰。此配置僅對年輕代有效土榴。即年輕代使用并行收集,而年老代仍使用串行收集响牛。

-XX:+UseParallelOldGC:配置年老代垃圾收集方式為并行收集玷禽,JDK6.0 開始支持對年老代并行收集。

-XX:ConcGCThreads:早期 JVM 版本也叫-XX:ParallelCMSThreads呀打,定義并發(fā) CMS 過程運行時的線程數(shù)矢赁。比如 value=4 意味著 CMS 周期的所有階段都以 4 個線程來執(zhí)行。盡管更多的線程會加快并發(fā) CMS 過程贬丛,但其也會帶來額外的同步開銷撩银。因此,對于特定的應用程序豺憔,應該通過測試來判斷增加 CMS 線程數(shù)是否真的能夠帶來性能的提升额获。如果還標志未設置,JVM 會根據(jù)并行收集器中的 -XX:ParallelGCThreads 參數(shù)的值來計算出默認的并行 CMS 線程數(shù)恭应。

-XX:ParallelGCThreads:配置并行收集器的線程數(shù)咪啡,即:同時有多少個線程一起進行垃圾回收,此值建議配置與 CPU 數(shù)目相等暮屡。

-XX:OldSize:設置 JVM 啟動分配的老年代內(nèi)存大小撤摸,類似于新生代內(nèi)存的初始大小 -XX:NewSize。

以上就是一些常用的配置參數(shù),有些參數(shù)是可以被替代的准夷,配置思路需要考慮的是 Java 提供的垃圾回收機制钥飞。虛擬機的堆大小決定了虛擬機花費在收集垃圾上的時間和頻度。收集垃圾能夠接受的速度和應用有關(guān)衫嵌,應該通過分析實際的垃圾收集的時間和頻率來調(diào)整读宙。假如堆的大小很大,那么完全垃圾收集就會很慢楔绞,但是頻度會降低结闸。假如您把堆的大小和內(nèi)存的需要一致,完全收集就很快酒朵,但是會更加頻繁桦锄。調(diào)整堆大小的的目的是最小化垃圾收集的時間,以在特定的時間內(nèi)最大化處理客戶的請求蔫耽。在基準測試的時候结耀,為確保最好的性能,要把堆的大小設大匙铡,確保垃圾收集不在整個基準測試的過程中出現(xiàn)图甜。

假如系統(tǒng)花費很多的時間收集垃圾,請減小堆大小鳖眼。一次完全的垃圾收集應該不超過 3-5 秒黑毅。假如垃圾收集成為瓶頸,那么需要指定代的大小钦讳,檢查垃圾收集的周詳輸出博肋,研究垃圾收集參數(shù)對性能的影響。當增加處理器時蜂厅,記得增加內(nèi)存匪凡,因為分配能夠并行進行,而垃圾收集不是并行的掘猿。

3病游、設置系統(tǒng)屬性

之前說過,Tomcat 的語言編碼稠通,配置起來很慢衬衬,要經(jīng)過多次設置才可以了,否則中文很有可能出現(xiàn)亂碼情況改橘。譬如漢字“中”滋尉,以 UTF-8 編碼后得到的是 3 字節(jié)的值 %E4%B8%AD,然后通過 GET 或者 POST 方式把這 3 個字節(jié)提交到 Tomcat 容器飞主,如果你不告訴 Tomcat 我的參數(shù)是用 UTF-8編碼的狮惜,那么 Tomcat 就認為你是用 ISO-8859-1 來編碼的高诺,而 ISO8859-1(兼容 URI 中的標準字符集 US-ASCII)是兼容 ASCII 的單字節(jié)編碼并且使用了單字節(jié)內(nèi)的所有空間,因此 Tomcat 就以為你傳遞的用 ISO-8859-1 字符集編碼過的 3 個字符碾篡,然后它就用 ISO-8859-1 來解碼虱而。
設置起來不難使用“ -D<名稱>=<值> ”來設置系統(tǒng)屬性:

-Djavax.servlet.request.encoding=UTF-8
-Djavax.servlet.response.encoding=UTF-8 
-Dfile.encoding=UTF-8 
-Duser.country=CN 
-Duser.language=zh

4、常見的 Java 內(nèi)存溢出有以下三種

(1) java.lang.OutOfMemoryError: Java heap space —-JVM Heap(堆)溢出

JVM 在啟動的時候會自動設置 JVM Heap 的值开泽,其初始空間(即-Xms)是物理內(nèi)存的1/64牡拇,最大空間(-Xmx)不可超過物理內(nèi)存∧侣桑可以利用 JVM提供的 -Xmn -Xms -Xmx 等選項可進行設置惠呼。Heap 的大小是 Young Generation 和 Tenured Generaion 之和。在 JVM 中如果 98% 的時間是用于 GC峦耘,且可用的 Heap size 不足 2% 的時候?qū)伋龃水惓P畔ⅰ?br> 解決方法:手動設置 JVM Heap(堆)的大小剔蹋。

(2) java.lang.OutOfMemoryError: PermGen space —- PermGen space溢出。

PermGen space 的全稱是 Permanent Generation space贡歧,是指內(nèi)存的永久保存區(qū)域滩租。為什么會內(nèi)存溢出赋秀,這是由于這塊內(nèi)存主要是被 JVM 存放Class 和 Meta 信息的利朵,Class 在被 Load 的時候被放入 PermGen space 區(qū)域,它和存放 Instance 的 Heap 區(qū)域不同猎莲,sun 的 GC 不會在主程序運行期對 PermGen space 進行清理绍弟,所以如果你的 APP 會載入很多 CLASS 的話,就很可能出現(xiàn) PermGen space 溢出著洼。
解決方法: 手動設置 MaxPermSize 大小

(3) java.lang.StackOverflowError —- 棧溢出

棧溢出了樟遣,JVM 依然是采用棧式的虛擬機,這個和 C 與 Pascal 都是一樣的身笤。函數(shù)的調(diào)用過程都體現(xiàn)在堆棧和退棧上了豹悬。調(diào)用構(gòu)造函數(shù)的 “層”太多了,以致于把棧區(qū)溢出了液荸。通常來講瞻佛,一般棧區(qū)遠遠小于堆區(qū)的,因為函數(shù)調(diào)用過程往往不會多于上千層娇钱,而即便每個函數(shù)調(diào)用需要 1K 的空間(這個大約相當于在一個 C 函數(shù)內(nèi)聲明了 256 個 int 類型的變量)伤柄,那么棧區(qū)也不過是需要 1MB 的空間。通常棧的大小是 1-2MB 的文搂。通常遞歸也不要遞歸的層次過多适刀,很容易溢出。

參考文章:http://blog.csdn.net/ldx891113/article/details/51735171

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末煤蹭,一起剝皮案震驚了整個濱河市笔喉,隨后出現(xiàn)的幾起案子取视,更是在濱河造成了極大的恐慌,老刑警劉巖然遏,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贫途,死亡現(xiàn)場離奇詭異,居然都是意外死亡待侵,警方通過查閱死者的電腦和手機丢早,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秧倾,“玉大人怨酝,你說我怎么就攤上這事∧窍龋” “怎么了农猬?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長售淡。 經(jīng)常有香客問我斤葱,道長,這世上最難降的妖魔是什么揖闸? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任揍堕,我火速辦了婚禮,結(jié)果婚禮上汤纸,老公的妹妹穿的比我還像新娘衩茸。我一直安慰自己,他們只是感情好贮泞,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布楞慈。 她就那樣靜靜地躺著,像睡著了一般啃擦。 火紅的嫁衣襯著肌膚如雪囊蓝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天令蛉,我揣著相機與錄音聚霜,去河邊找鬼。 笑死言询,一個胖子當著我的面吹牛俯萎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播运杭,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼夫啊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辆憔?” 一聲冷哼從身側(cè)響起撇眯,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤报嵌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后熊榛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锚国,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年玄坦,在試婚紗的時候發(fā)現(xiàn)自己被綠了血筑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡煎楣,死狀恐怖豺总,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情择懂,我是刑警寧澤喻喳,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站困曙,受9級特大地震影響表伦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜慷丽,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一蹦哼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盈魁,春花似錦翔怎、人聲如沸窃诉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽飘痛。三九已至珊膜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宣脉,已是汗流浹背车柠。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留塑猖,地道東北人竹祷。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像羊苟,于是被迫代替她去往敵國和親塑陵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容