久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

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

 昵稱597197 2018-02-18

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

Tomcat 7.png

Tomcat 的優(yōu)化不像其它軟件那樣,,簡簡單單的修改幾個(gè)參數(shù)就可以了,,它的優(yōu)化主要有三方面,分為系統(tǒng)優(yōu)化,,Tomcat 本身的優(yōu)化,,Java 虛擬機(jī)(JVM)調(diào)優(yōu)。系統(tǒng)優(yōu)化就不在介紹了,,接下來就詳細(xì)的介紹一下 Tomcat 本身與 JVM 優(yōu)化,,以 Tomcat 7 為例。

一,、Tomcat 本身優(yōu)化

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

1,、工作方式選擇

為了提升性能,,首先就要對(duì)代碼進(jìn)行動(dòng)靜分離,讓 Tomcat 只負(fù)責(zé) jsp 文件的解析工作,。如采用 Apache 和 Tomcat 的整合方式,,他們之間的連接方案有三種選擇,JK,、http_proxy 和 ajp_proxy,。相對(duì)于 JK 的連接方式,,后兩種在配置上比較簡單的,靈活性方面也一點(diǎn)都不遜色,。但就穩(wěn)定性而言不像JK 這樣久經(jīng)考驗(yàn),,所以建議采用 JK 的連接方式。 

2,、Connector 連接器的配置

之前文件介紹過的 Tomcat 連接器的三種方式: bio,、nio 和 apr,三種方式性能差別很大,,apr 的性能最優(yōu),, bio 的性能最差。而 Tomcat 7 使用的 Connector  默認(rèn)就啟用的 Apr 協(xié)議,,但需要系統(tǒng)安裝 Apr 庫,,否則就會(huì)使用 bio 方式。

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

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

默認(rèn)配置下,,Tomcat 會(huì)為每個(gè)連接器創(chuàng)建一個(gè)綁定的線程池(最大線程數(shù) 200),服務(wù)啟動(dòng)時(shí),,默認(rèn)創(chuàng)建了 5 個(gè)空閑線程隨時(shí)等待用戶請(qǐng)求,。

首先,打開 ${TOMCAT_HOME}/conf/server.xml,,搜索【<Executor name="tomcatThreadPool"】,,開啟并調(diào)整為

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

注意, Tomcat 7 在開啟線程池前,,一定要安裝好 Apr 庫,,并可以啟用,否則會(huì)有錯(cuò)誤報(bào)出,,shutdown.sh 腳本無法關(guān)閉進(jìn)程,。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    <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 使用線程來處理接收的每個(gè)請(qǐng)求,,這個(gè)值表示 Tomcat 可創(chuàng)建的最大的線程數(shù),,默認(rèn)值是 200

minSpareThreads:最小空閑線程數(shù),Tomcat 啟動(dòng)時(shí)的初始化的線程數(shù),,表示即使沒有人使用也開這么多空線程等待,,默認(rèn)值是 10,。

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

上邊配置的參數(shù),最大線程 500(一般服務(wù)器足以),,要根據(jù)自己的實(shí)際情況合理設(shè)置,,設(shè)置越大會(huì)耗費(fèi)內(nèi)存和 CPU,因?yàn)?CPU 疲于線程上下文切換,,沒有精力提供請(qǐng)求服務(wù)了,,最小空閑線程數(shù) 20,線程最大空閑時(shí)間 60 秒,,當(dāng)然允許的最大線程連接數(shù)還受制于操作系統(tǒng)的內(nèi)核參數(shù)設(shè)置,,設(shè)置多大要根據(jù)自己的需求與環(huán)境,。當(dāng)然線程可以配置在“tomcatThreadPool”中,,也可以直接配置在“Connector”中,但不可以重復(fù)配置,。

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

connnectionTimeout: 網(wǎng)絡(luò)連接超時(shí),,單位:毫秒,設(shè)置為 0 表示永不超時(shí),,這樣設(shè)置有隱患的,。通常可設(shè)置為 30000 毫秒,,可根據(jù)檢測(cè)實(shí)際情況,,適當(dāng)修改。

enableLookups: 是否反查域名,,以返回遠(yuǎn)程主機(jī)的主機(jī)名,,取值為:true 或 false,如果設(shè)置為false,,則直接返回IP地址,,為了提高處理能力,應(yīng)設(shè)置為 false,。

disableUploadTimeout:上傳時(shí)是否使用超時(shí)機(jī)制,。

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

acceptCount:指定當(dāng)所有可以使用的處理請(qǐng)求的線程數(shù)都被使用時(shí),,可傳入連接請(qǐng)求的最大隊(duì)列長度,,超過這個(gè)數(shù)的請(qǐng)求將不予處理,默認(rèn)為100個(gè),。

keepAliveTimeout:長連接最大保持時(shí)間(毫秒),,表示在下次請(qǐng)求過來之前,Tomcat 保持該連接多久,,默認(rèn)是使用 connectionTimeout 時(shí)間,,-1 為不限制超時(shí)。

maxKeepAliveRequests:表示在服務(wù)器關(guān)閉之前,,該連接最大支持的請(qǐng)求數(shù),。超過該請(qǐng)求數(shù)的連接也將被關(guān)閉,1表示禁用,,-1表示不限制個(gè)數(shù),,默認(rèn)100個(gè),一般設(shè)置在100~200之間,。

compression:是否對(duì)響應(yīng)的數(shù)據(jù)進(jìn)行 GZIP 壓縮,,off:表示禁止壓縮;on:表示允許壓縮(文本將被壓縮),、force:表示所有情況下都進(jìn)行壓縮,,默認(rèn)值為off,壓縮數(shù)據(jù)后可以有效的減少頁面的大小,,一般可以減小1/3左右,,節(jié)省帶寬。

compressionMinSize:表示壓縮響應(yīng)的最小值,,只有當(dāng)響應(yīng)報(bào)文大小大于這個(gè)值的時(shí)候才會(huì)對(duì)報(bào)文進(jìn)行壓縮,,如果開啟了壓縮功能,默認(rèn)值就是2048,。

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

noCompressionUserAgents="gozilla, traviata": 對(duì)于以下的瀏覽器,,不啟用壓縮,。

如果已經(jīng)對(duì)代碼進(jìn)行了動(dòng)靜分離,靜態(tài)頁面和圖片等數(shù)據(jù)就不需要 Tomcat 處理了,,那么也就不需要配置在 Tomcat 中配置壓縮了,。

以上是一些常用的配置參數(shù)屬性,當(dāng)然還有好多其它的參數(shù)設(shè)置,還可以繼續(xù)深入的優(yōu)化,,HTTP Connector 與 AJP Connector 的參數(shù)屬性值,,可以參考官方文檔的詳細(xì)說明:

https://tomcat./tomcat-7.0-doc/config/http.html

https://tomcat./tomcat-7.0-doc/config/ajp.html

二、JVM 優(yōu)化

 Tomcat 啟動(dòng)命令行中的優(yōu)化參數(shù),,就是 JVM 的優(yōu)化 ,。Tomcat 首先跑在 JVM 之上的,因?yàn)樗膯?dòng)其實(shí)也只是一個(gè) java 命令行,,首先我們需要對(duì)這個(gè) JAVA 的啟動(dòng)命令行進(jìn)行調(diào)優(yōu),。不管是 YGC 還是 Full GC,GC 過程中都會(huì)對(duì)導(dǎo)致程序運(yùn)行中中斷,,正確的選擇不同的 GC 策略,,調(diào)整 JVM、GC 的參數(shù),,可以極大的減少由于 GC 工作,,而導(dǎo)致的程序運(yùn)行中斷方面的問題,進(jìn)而適當(dāng)?shù)奶岣?Java 程序的工作效率,。但是調(diào)整 GC 是以個(gè)極為復(fù)雜的過程,,由于各個(gè)程序具備不同的特點(diǎn),,如:web 和 GUI 程序就有很大區(qū)別(Web可以適當(dāng)?shù)耐nD,,但GUI停頓是客戶無法接受的),而且由于跑在各個(gè)機(jī)器上的配置不同(主要 cup 個(gè)數(shù),內(nèi)存不同),,所以使用的 GC 種類也會(huì)不同。

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

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

JAVA_OPTS:用于當(dāng) Java 運(yùn)行時(shí)選項(xiàng)“start”,、“stop”或“run”命令執(zhí)行。

CATALINA_OPTS:用于當(dāng) Java 運(yùn)行時(shí)選項(xiàng)“start”或“run”命令執(zhí)行,。

為什么有兩個(gè)不同的變量,?它們之間都有什么區(qū)別呢?

首先,,在啟動(dòng) Tomcat 時(shí),,任何指定變量的傳遞方式都是相同的,可以傳遞到執(zhí)行“start”或“run”命令中,但只有設(shè)定在 JAVA_OPTS 變量里的參數(shù)被傳遞到“stop”命令中,。對(duì)于 Tomcat 運(yùn)行過程,,可能沒什么區(qū)別,影響的是結(jié)束程序,,而不是啟動(dòng)程序,。

第二個(gè)區(qū)別是更微妙,其他應(yīng)用程序也可以使用 JAVA_OPTS 變量,,但只有在 Tomcat 中使用 CATALINA_OPTS 變量,。如果你設(shè)置環(huán)境變量為只使用 Tomcat,最好你會(huì)建議使用 CATALINA_OPTS 變量,,而如果你設(shè)置環(huán)境變量使用其它的 Java 應(yīng)用程序,,例如 JBoss,你應(yīng)該把你的設(shè)置放在JAVA_OPTS 變量中,。

2,、JVM 參數(shù)屬性

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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"

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

上述這樣的配置,,基本上可以達(dá)到:

系統(tǒng)響應(yīng)時(shí)間增快;

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

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

線程阻塞情況最小化。

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

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

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

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

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

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

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

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

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

-XX:+AggressiveOpts:作用如其名(aggressive),啟用這個(gè)參數(shù),,則每當(dāng) JDK 版本升級(jí)時(shí),,你的 JVM 都會(huì)使用最新加入的優(yōu)化技術(shù)(如果有的話)。

-XX:+UseBiasedLocking:啟用一個(gè)優(yōu)化了的線程鎖,,我們知道在我們的appserver,,每個(gè)http請(qǐng)求就是一個(gè)線程,有的請(qǐng)求短有的請(qǐng)求長,,就會(huì)有請(qǐng)求排隊(duì)的現(xiàn)象,,甚至還會(huì)出現(xiàn)線程阻塞,這個(gè)優(yōu)化了的線程鎖使得你的appserver內(nèi)對(duì)線程處理自動(dòng)進(jìn)行最優(yōu)調(diào)配,。

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

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

-XX:+UseParNewGC:對(duì)新生代采用多線程并行回收,這樣收得快,,注意最新的 JVM 版本,,當(dāng)使用 -XX:+UseConcMarkSweepGC 時(shí),-XX:UseParNewGC 會(huì)自動(dòng)開啟,。因此,,如果年輕代的并行 GC 不想開啟,,可以通過設(shè)置 -XX:-UseParNewGC 來關(guān)掉。

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

-XX:+CMSParallelRemarkEnabled:在使用 UseParNewGC 的情況下,,盡量減少 mark 的時(shí)間,。

-XX:+UseCMSCompactAtFullCollection:在使用 concurrent gc 的情況下,防止 memoryfragmention,,對(duì) live object 進(jìn)行整理,,使 memory 碎片減少。

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

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

-XX:+UseCMSInitiatingOccupancyOnly:只有在 oldgeneration 在使用了初始化的比例后 concurrent collector 啟動(dòng)收集,。

-Duser.timezone=Asia/Shanghai:設(shè)置用戶所在時(shí)區(qū),。

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

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

-XX:CMSInitiatingOccupancyFraction:當(dāng)堆滿之后,,并行收集器便開始進(jìn)行垃圾收集,例如,,當(dāng)沒有足夠的空間來容納新分配或提升的對(duì)象,。對(duì)于 CMS 收集器,長時(shí)間等待是不可取的,,因?yàn)樵诓l(fā)垃圾收集期間應(yīng)用持續(xù)在運(yùn)行(并且分配對(duì)象),。因此,為了在應(yīng)用程序使用完內(nèi)存之前完成垃圾收集周期,,CMS 收集器要比并行收集器更先啟動(dòng),。因?yàn)椴煌膽?yīng)用會(huì)有不同對(duì)象分配模式,JVM 會(huì)收集實(shí)際的對(duì)象分配(和釋放)的運(yùn)行時(shí)數(shù)據(jù),,并且分析這些數(shù)據(jù),,來決定什么時(shí)候啟動(dòng)一次 CMS 垃圾收集周期。這個(gè)參數(shù)設(shè)置有很大技巧,,基本上滿足(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100 >= Xmn 就不會(huì)出現(xiàn) promotion failed,。例如在應(yīng)用中 Xmx 是6000,Xmn 是 512,,那么 Xmx-Xmn 是 5488M,,也就是老年代有 5488M,CMSInitiatingOccupancyFraction=90 說明老年代到 90% 滿的時(shí)候開始執(zhí)行對(duì)老年代的并發(fā)垃圾回收(CMS),,這時(shí)還 剩 10% 的空間是 5488*10% = 548M,,所以即使 Xmn(也就是新生代共512M)里所有對(duì)象都搬到老年代里,548M 的空間也足夠了,,所以只要滿足上面的公式,,就不會(huì)出現(xiàn)垃圾回收時(shí)的 promotion failed,因此這個(gè)參數(shù)的設(shè)置必須與 Xmn 關(guān)聯(lián)在一起,。

-XX:+CMSIncrementalMode:該標(biāo)志將開啟 CMS 收集器的增量模式,。增量模式經(jīng)常暫停 CMS 過程,以便對(duì)應(yīng)用程序線程作出完全的讓步,。因此,,收集器將花更長的時(shí)間完成整個(gè)收集周期,。因此,只有通過測(cè)試后發(fā)現(xiàn)正常 CMS 周期對(duì)應(yīng)用程序線程干擾太大時(shí),,才應(yīng)該使用增量模式,。由于現(xiàn)代服務(wù)器有足夠的處理器來適應(yīng)并發(fā)的垃圾收集,所以這種情況發(fā)生得很少,,用于但 CPU情況,。

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

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

-XX:+UseSerialGC:設(shè)置串行收集器。

-XX:+UseParallelGC:設(shè)置為并行收集器,。此配置僅對(duì)年輕代有效,。即年輕代使用并行收集,而年老代仍使用串行收集,。

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

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

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

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

以上就是一些常用的配置參數(shù),,有些參數(shù)是可以被替代的,,配置思路需要考慮的是 Java 提供的垃圾回收機(jī)制,。虛擬機(jī)的堆大小決定了虛擬機(jī)花費(fèi)在收集垃圾上的時(shí)間和頻度,。收集垃圾能夠接受的速度和應(yīng)用有關(guān),,應(yīng)該通過分析實(shí)際的垃圾收集的時(shí)間和頻率來調(diào)整。假如堆的大小很大,,那么完全垃圾收集就會(huì)很慢,,但是頻度會(huì)降低。假如您把堆的大小和內(nèi)存的需要一致,,完全收集就很快,,但是會(huì)更加頻繁。調(diào)整堆大小的的目的是最小化垃圾收集的時(shí)間,,以在特定的時(shí)間內(nèi)最大化處理客戶的請(qǐng)求,。在基準(zhǔn)測(cè)試的時(shí)候,為確保最好的性能,,要把堆的大小設(shè)大,,確保垃圾收集不在整個(gè)基準(zhǔn)測(cè)試的過程中出現(xiàn)。

假如系統(tǒng)花費(fèi)很多的時(shí)間收集垃圾,,請(qǐng)減小堆大小,。一次完全的垃圾收集應(yīng)該不超過 3-5 秒。假如垃圾收集成為瓶頸,,那么需要指定代的大小,,檢查垃圾收集的周詳輸出,研究垃圾收集參數(shù)對(duì)性能的影響,。當(dāng)增加處理器時(shí),,記得增加內(nèi)存,因?yàn)榉峙淠軌虿⑿羞M(jìn)行,,而垃圾收集不是并行的,。

3、設(shè)置系統(tǒng)屬性

之前說過,,Tomcat 的語言編碼,,配置起來很慢,要經(jīng)過多次設(shè)置才可以了,,否則中文很有可能出現(xiàn)亂碼情況,。譬如漢字“中”,以 UTF-8 編碼后得到的是 3 字節(jié)的值 %E4%B8%AD,,然后通過 GET 或者 POST 方式把這 3 個(gè)字節(jié)提交到 Tomcat 容器,,如果你不告訴 Tomcat 我的參數(shù)是用 UTF-8編碼的,那么 Tomcat 就認(rèn)為你是用 ISO-8859-1 來編碼的,,而 ISO8859-1(兼容 URI 中的標(biāo)準(zhǔn)字符集 US-ASCII)是兼容 ASCII 的單字節(jié)編碼并且使用了單字節(jié)內(nèi)的所有空間,,因此 Tomcat 就以為你傳遞的用 ISO-8859-1 字符集編碼過的 3 個(gè)字符,,然后它就用 ISO-8859-1 來解碼。

設(shè)置起來不難使用“ -D<名稱>=<值> ”來設(shè)置系統(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 在啟動(dòng)的時(shí)候會(huì)自動(dòng)設(shè)置 JVM Heap 的值,,其初始空間(即-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)不可超過物理內(nèi)存,??梢岳?JVM提供的 -Xmn -Xms -Xmx 等選項(xiàng)可進(jìn)行設(shè)置。Heap 的大小是 Young Generation 和 Tenured Generaion 之和,。在 JVM 中如果 98% 的時(shí)間是用于 GC,,且可用的 Heap size 不足 2% 的時(shí)候?qū)伋龃水惓P畔ⅰ?/p>

解決方法:手動(dòng)設(shè)置 JVM Heap(堆)的大小。  
(2) java.lang.OutOfMemoryError: PermGen space  —- PermGen space溢出,。

PermGen space 的全稱是 Permanent Generation space,,是指內(nèi)存的永久保存區(qū)域。為什么會(huì)內(nèi)存溢出,,這是由于這塊內(nèi)存主要是被 JVM 存放Class 和 Meta 信息的,,Class 在被 Load 的時(shí)候被放入 PermGen space 區(qū)域,它和存放 Instance 的 Heap 區(qū)域不同,,sun 的 GC 不會(huì)在主程序運(yùn)行期對(duì) PermGen space 進(jìn)行清理,,所以如果你的 APP 會(huì)載入很多 CLASS 的話,就很可能出現(xiàn) PermGen space 溢出,。

解決方法: 手動(dòng)設(shè)置 MaxPermSize 大小

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

棧溢出了,,JVM 依然是采用棧式的虛擬機(jī),這個(gè)和 C 與 Pascal 都是一樣的,。函數(shù)的調(diào)用過程都體現(xiàn)在堆棧和退棧上了,。調(diào)用構(gòu)造函數(shù)的 “層”太多了,以致于把棧區(qū)溢出了,。通常來講,,一般棧區(qū)遠(yuǎn)遠(yuǎn)小于堆區(qū)的,因?yàn)楹瘮?shù)調(diào)用過程往往不會(huì)多于上千層,,而即便每個(gè)函數(shù)調(diào)用需要 1K 的空間(這個(gè)大約相當(dāng)于在一個(gè) C 函數(shù)內(nèi)聲明了 256 個(gè) int 類型的變量),,那么棧區(qū)也不過是需要 1MB 的空間。通常棧的大小是 1-2MB 的,。
通常遞歸也不要遞歸的層次過多,,很容易溢出。

解決方法:修改程序,。

更多信息,,請(qǐng)參考以下文章:

JVM 垃圾回收調(diào)優(yōu)總結(jié)

http://developer.51cto.com/art/201201/312639.htm

JVM調(diào)優(yōu)總結(jié):典型配置舉例

http://developer.51cto.com/art/201201/311739.htm

JVM基礎(chǔ):JVM參數(shù)設(shè)置、分析 

http://developer.51cto.com/art/201201/312018.htm

JVM 堆內(nèi)存相關(guān)的啟動(dòng)參數(shù):年輕代、老年代和永久代的內(nèi)存分配

http://www./kf/201409/334840.html

Java 虛擬機(jī)–新生代與老年代GC

http://my.oschina.net/sunnywu/blog/332870

JVM(Java虛擬機(jī))優(yōu)化大全和案例實(shí)戰(zhàn)

http://blog.csdn.net/kthq/article/details/8618052

JVM內(nèi)存區(qū)域劃分Eden Space,、Survivor Space,、Tenured Gen,Perm Gen解釋 

http://blog./xmlrpc.php?r=blog/article&uid=29632145&id=4616836

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多