下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、.Tomcat 中 Java 垃圾收集調(diào)優(yōu)1 JVM 內(nèi)存 JAVA_OPTS參數(shù)說(shuō)明設(shè)置服務(wù)器端的JVM參數(shù)一般在catalina.bat文件中 :JAVA_OPTS=-server-Xms2048m-Xmx2048m -Xss512kJVM中對(duì)象的劃分及管理介紹JVM根據(jù)運(yùn)行于其中的對(duì)象的生存時(shí)間大致的分為3 種。并且將這3 種不同的對(duì)象分別存放在JVM從系統(tǒng)分配到的不同的內(nèi)存空間。這種對(duì)象存放空間的管理方式叫做Generation 管理方式。1). Young Generation(年輕代):用于存放“早逝”對(duì)象(即瞬時(shí)對(duì)象)。例如:在創(chuàng)建對(duì)象時(shí)或者調(diào)用方法時(shí)使用的臨時(shí)對(duì)象或局部變量。2
2、). Tenured Generation(年老代 ) :用于存放“駐留”對(duì)象(即較長(zhǎng)時(shí)間被引用的對(duì)象)。往往體現(xiàn)為一個(gè)大型程序中的全局對(duì)象或長(zhǎng)時(shí)間被使用的對(duì)象。3). Perm Generation(永久保存區(qū)域 ) :用于存放“永久”對(duì)象。這些對(duì)象管理著運(yùn)行于JVM中的類和方法。-在命令行下用 java -XmxXXXXM -version命令來(lái)測(cè)試 java 可用最大內(nèi)存,測(cè)試可逐漸增大XXXX的值,如果執(zhí)行正常就表示指定的內(nèi)存大小可用,否則會(huì)打印錯(cuò)誤信息。通常測(cè)試 windows 系統(tǒng) (32 位 )最大內(nèi)存為: 1500M, 但系統(tǒng)一般到1280M 就差不多了-關(guān)于垃圾收集分類介紹在
3、 JVM中有兩種垃圾方式:1).一種叫做Minor (次收集)。Minor 在 Young Generation (年輕代)的空間被對(duì)象全部占用后執(zhí)行,主要是對(duì) Young Generation中的對(duì)象進(jìn)行垃圾收集。2).一種叫做Major (主收集)。 Major 是針對(duì)于整個(gè)Heap size(Xms 和 Xmx設(shè)置為 JVM使用的內(nèi)存,但不包括永久保存區(qū)域使用的內(nèi)存) 的垃圾收集。其中 Minor 方式的收集經(jīng)常發(fā)生,并且Minor 收集所占用的系統(tǒng)時(shí)間小。而Major 方式的垃圾收集則是一種“昂貴”的垃圾收集方式,因?yàn)樵贛ajor 要對(duì)整個(gè)Heap size 進(jìn)行垃圾收集, 這會(huì)使得應(yīng)
4、用停頓的時(shí)間變得較長(zhǎng)。關(guān)于 TOMCAT內(nèi)存占用介紹Tomcat 運(yùn)行占用內(nèi)存= Xmx 占用的內(nèi)存+ Perm Generation(永久保存區(qū)域) 占用內(nèi)存 +所有 Java 應(yīng)用創(chuàng)建線程數(shù) x 1MJava 應(yīng)用每創(chuàng)建一個(gè)線程,在JVM的內(nèi)存里也會(huì)創(chuàng)建一個(gè)Thread 對(duì)象,但是同時(shí)也會(huì)在操作系統(tǒng)里創(chuàng)建一個(gè)真正的物理線程(參考JVM規(guī)范),操作系統(tǒng)會(huì)在TOMCAT余下的內(nèi)存里創(chuàng)建這個(gè)物理線程,而不是在JVM的 Xmx設(shè)置的內(nèi)存堆里創(chuàng)建。在jdk1.4里頭,默認(rèn)的棧大小是256KB,但是在jdk1.5里頭,默認(rèn)的棧大小為 1M每線程。因此,如果系統(tǒng)剩余內(nèi)存為400M的可用內(nèi)存,則Java
5、應(yīng)用最多創(chuàng)建400 個(gè)可用線程。結(jié)論:要想創(chuàng)建更多的線程,必須減少分配給JVM的最大內(nèi)存。參數(shù)說(shuō)明如下 :1 / 5.-server:一定要作為第一個(gè)參數(shù),在多個(gè)CPU時(shí)性能佳-Xms:初始 Heap 大小,使用的最小內(nèi)存,cpu 性能高時(shí)此值應(yīng)設(shè)的大一些-Xmx: java heap最大值,使用的最大內(nèi)存上面兩個(gè)值是分配JVM的最小和最大內(nèi)存,取決于硬件物理內(nèi)存的大小,建議均設(shè)為物理內(nèi)存的一半,最大不要超過(guò)可用物理內(nèi)存的80。-Xmn: young generation(年輕代)的heap 大小,一般設(shè)置為Xmx的 3、 4 分之一(此值對(duì)系統(tǒng)性能影響較大, Sun 官方推薦配置為整個(gè)堆的3
6、/8 )( 可使用 -XX:NewSize 和 -XX:MaxNewsize 設(shè)置年輕代的初始值和最大值)-Xincgc :啟動(dòng)增量垃圾收集器,缺省是關(guān)閉的。增量垃圾收集器能減少偶然發(fā)生的長(zhǎng)時(shí)間的垃圾回收造成的暫停時(shí)間。但增量垃圾收集器和應(yīng)用程序并發(fā)執(zhí)行,因此會(huì)占用部分CPU在應(yīng)用程序上的功能。-XX:CMSInitiatingOccupancyFraction=70發(fā)現(xiàn)引起promotion failed錯(cuò)誤的原因是CMS來(lái)不及回收(CMS默認(rèn)在年老代占到90%左右才會(huì)執(zhí)行) ,年老代又沒(méi)有足夠的空間供GC把一些活的對(duì)象從年輕代移到年老代,所以執(zhí)行FullGC。CMSInitiatingOc
7、cupancyFraction=70表示年老代占到約70%時(shí)就開(kāi)始執(zhí)行 CMS,這樣就不會(huì)頻繁出現(xiàn)Full GC了。上兩個(gè)參數(shù)設(shè)置有很大技巧,基本上滿足:(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100=Xmn就不會(huì)出現(xiàn)promotion failed。如果在應(yīng)用中設(shè)置Xmx(最大內(nèi)存)是1500m,Xmn(年輕代)是340m,那么 Xmx-Xmn是 1160m,也就是年老代有 1160 兆,CMSInitiatingOccupancyFraction=70說(shuō)明年老代到70%滿的時(shí)候開(kāi)始執(zhí)行對(duì)年老代的并發(fā)垃圾回收( CMS),這時(shí)還剩 30
8、%的空間是 1160*30%=348 兆,所以即使 Xmn(也就是年輕代共 340 兆)里所有對(duì)象都搬到年老代里, 348 兆的空間也足夠了,所以只要滿足上面的公式,就不會(huì)出現(xiàn)垃圾回收時(shí)的 promotion failed-XX:PermSize= xxxm:設(shè)定 xxx 兆內(nèi)存的永久保存區(qū)域-XX:MaxPermSize=xxxm: 設(shè)定 xxx 兆最大內(nèi)存的永久保存區(qū)域PermSize 和 MaxPermSize 指明虛擬機(jī)為java永久生成對(duì)象(Permanate generation)如, class對(duì)象、方法對(duì)象這些可反射(reflective)對(duì)象分配內(nèi)存限制,這些內(nèi)存不包括在He
9、ap(堆內(nèi)存) 區(qū)之中。上述參數(shù)如果不設(shè)定,永久保存區(qū)域默認(rèn)大?。?server選項(xiàng)下默認(rèn)MaxPermSize 為 64m,-client選項(xiàng)下默認(rèn) MaxPermSize 為 32m。運(yùn)行程序時(shí), jvm 會(huì)調(diào)整永久保存區(qū)域的大小以滿足需要。每次調(diào)整時(shí), jvm 會(huì)對(duì)堆進(jìn)行一次完全的垃圾收集。-XX:+UseConcMarkSweepGC :選擇 CMS收集器(并發(fā)回收,縮短major 收集的時(shí)間)提示:此選項(xiàng)在Heap Size比較大而且Major 收集時(shí)間較長(zhǎng)的情況下使用更合適?!?-XX:+UseParNewGC :對(duì)年輕代采用多線程并行回收,這樣收得快(縮短minor 收集的時(shí)間,
10、如果設(shè)置 -XX:+UseConcMarkSweepGC,無(wú)須設(shè)置 -XX:+UseParNewGC,是默認(rèn)的)】-XX:MaxTenuringThreshold=5 CMS收集器中,新生代對(duì)象撐過(guò)過(guò)多少次minor gc 才進(jìn)入年老代的。默認(rèn)為0(或另一說(shuō)法:一個(gè)對(duì)象如果在救助空間移動(dòng)5 次還沒(méi)有被回收就放入年老代)。如果設(shè)置為0 就是去掉了新生代空間, 存活的臨時(shí)對(duì)象不經(jīng)過(guò)Survivor區(qū)直接進(jìn)入年老代, 不久就占滿年老代發(fā)生fullgc-XX:GCTimeRatio=19表示 java可以用 5%的時(shí)間來(lái)做垃圾回收,1/(1+19)=1 /20=5%-XX:CMSFullGCsBefo
11、reCompaction=N表示執(zhí)行 N 次 Full GC后執(zhí)行內(nèi)存壓縮,免得產(chǎn)生內(nèi)存碎片(案例都設(shè)置為:-XX:CMSFullGCsBeforeCompaction=0)-XX:+UseCMSCompactAtFullCollection:表示執(zhí)行Full GC后對(duì)內(nèi)存進(jìn)行整理壓縮,免得產(chǎn)生內(nèi)存碎片-Xnoclassgc :禁用類垃圾回收,性能會(huì)高一點(diǎn);-verbose:gc顯示垃圾收集信息(在虛擬機(jī)發(fā)生內(nèi)存回收時(shí)在輸出設(shè)備顯示信息)2 / 5.-Xloggc:gc.log指定垃圾收集日志文件-XX:+DisableExplicitGC禁止 System.gc():免得程序員誤調(diào)用gc 方
12、法影響性能;-XX:+ExplicitGCInvokesConcurrent: System.gc()可以與應(yīng)用程序并發(fā)執(zhí)行。( System.gc() 來(lái)收回不用的內(nèi)存, 是寫在程序里的。 System.gc() 只是“建議” JVM 回收內(nèi)存, 不是強(qiáng)制。禁止 System.gc() 要看實(shí)際開(kāi)發(fā)的程序如何處理。 因此編程要養(yǎng)成習(xí)慣, 創(chuàng)建一個(gè)對(duì)象, 不再用時(shí)指向 null ,這樣 jvm 發(fā)現(xiàn)它不再使用時(shí),會(huì)更早的把它放進(jìn)回收隊(duì)列,才能更早的進(jìn)行回收。例如:你要銷毀一個(gè)對(duì)象,可以代碼 :Stringa=ksadjflasdf;/dosomething./a=null;這不是銷毀一個(gè)對(duì)象僅
13、僅是把對(duì)一個(gè)對(duì)象的引用去掉了在 java 中一個(gè)對(duì)象可以被多個(gè)對(duì)象引用的只有一個(gè)對(duì)象不在被引用時(shí)才可以被垃圾收集)-XX:SoftRefLRUPolicyMSPerMB=N這個(gè)參數(shù)比較有用的,官方解釋是:Soft reference在虛擬機(jī)中比在客戶集中存活的更長(zhǎng)一些。其清除頻率可以用命令行參數(shù)-XX:SoftRefLRUPolicyMSPerMB= 來(lái)控制,這可以指定每兆堆空閑空間的soft reference保持存活(一旦它不強(qiáng)可達(dá)了)的毫秒數(shù),這意味著每兆堆中的空閑空間中的soft reference會(huì)(在最后一個(gè)強(qiáng)引用被回收之后)存活1 秒鐘。注意,這是一個(gè)近似的值,因?yàn)閟oft re
14、ference只會(huì)在垃圾回收時(shí)才會(huì)被清除,而垃圾回收并不總在發(fā)生。系統(tǒng)默認(rèn)為一秒,我覺(jué)得沒(méi)必要等1 秒,客戶集中不用就立刻清除,改為-XX:SoftRefLRUPolicyMSPerMB=0 ;-Xss 15120這使得 JBoss 每增加一個(gè)線程(thread)就會(huì)立即消耗15M內(nèi)存,而最佳值應(yīng)該是128K, 默認(rèn)值好像是 512k.+XX:AggressiveHeap會(huì)使得 Xms 沒(méi)有意義。這個(gè)參數(shù)讓jvm 忽略 Xmx參數(shù) , 瘋狂地吃完一個(gè)G物理內(nèi)存 , 再吃盡一個(gè)G的 swap。-Xss :每個(gè)線程的Stack 大小顯示日志參數(shù)-verbose:gc 在虛擬機(jī)發(fā)生內(nèi)存回收時(shí)在輸出設(shè)
15、備顯示信息,格式如下:Full GC 268K-168K(1984K), 0.0187390 secs該參數(shù)用來(lái)監(jiān)視虛擬機(jī)內(nèi)存回收的情況。-XX:+PrintGCDetails-XX:+PrintGCTimeStamps(GC發(fā)生的時(shí)間 )-XX:+PrintGCApplicationStoppedTime(GC消耗了多少時(shí)間)-XX:+PrintGCApplicationConcurrentTime(GC之間運(yùn)行了多少時(shí)間)-XX:+PrintTenuringDistribution參數(shù)觀察各個(gè)Age 的對(duì)象總大小2 GC 日志打印GC 調(diào)優(yōu)是個(gè)很實(shí)驗(yàn)很伽利略的活兒,GC日志是先決的數(shù)據(jù)參考
16、和最終驗(yàn)證:-XX:+PrintGCDetails-XX:+PrintGCTimeStamps(GC發(fā)生的時(shí)間 ) -XX:+PrintGCApplicationStoppedTime(GC消耗了多少時(shí)間) -XX:+PrintGCApplicationConcurrentTime(GC之間運(yùn)行了多少時(shí)間)3 收集器選擇3 / 5.CMS收集器(并發(fā)回收) :暫停時(shí)間優(yōu)先配置參數(shù): -XX:+UseConcMarkSweepGC已默認(rèn)無(wú)需配置的參數(shù):-XX:+UseParNewGC(Parallel收集新生代 )-XX:+CMSPermGenSweepingEnabled(CMS收集持久代 )
17、 -XX:UseCMSCompactAtFullCollection(full gc時(shí)壓縮年老代 )初始效果: 1g 堆內(nèi)存的新生代約60m,minor gc約 5-20 毫秒, full gc約 130 毫秒。Parallel收集器(并行回收) :吞吐量?jī)?yōu)先配置參數(shù):-XX:+UseParallelGC-XX:+UseParallelOldGC(Parallel收集年老代,從JDK6.0 開(kāi)始支持 )已默認(rèn)無(wú)需配置的參數(shù):-XX:+UseAdaptiveSizePolicy(動(dòng)態(tài)調(diào)整新生代大小)初始效果: 1g 堆內(nèi)存的新生代約90-110m( 動(dòng)態(tài)調(diào)整 ) , minor gc約 5-20
18、 毫秒, full gc有無(wú)UseParallelOldGC參數(shù)分別為1.3/1.1秒,差別不大。另外 -XX:MaxGCPauseMillis=100設(shè)置 minor gc 的期望最大時(shí)間,JVM會(huì)以此來(lái)調(diào)整新生代的大小,但在此測(cè)試環(huán)境中對(duì)象死的太快,此參數(shù)作用不大。4 調(diào)優(yōu)實(shí)戰(zhàn)Parallel收集高達(dá)1 秒的暫停時(shí)間基本不可忍受,所以選擇CMS收集器。在被壓測(cè)的Mule 2.0應(yīng)用里,每秒都有大約400M的海量短命對(duì)象產(chǎn)生:因?yàn)槟J(rèn)60M的新生代太小了,頻繁發(fā)生minor gc ,大約 0.2 秒就進(jìn)行一次。因?yàn)?CMS收集器中 MaxTenuringThreshold(新生代對(duì)象撐過(guò)過(guò)多
19、少次minor gc才進(jìn)入年老代的設(shè)置) 默認(rèn) 0,存活的臨時(shí)對(duì)象不經(jīng)過(guò)Survivor區(qū)直接進(jìn)入年老代,不久就占滿年老代發(fā)生full gc。對(duì)這兩個(gè)參數(shù)的調(diào)優(yōu),既要改善上面兩種情況,又要避免新生代過(guò)大,復(fù)制次數(shù)過(guò)多造成minor gc的暫停時(shí)間過(guò)長(zhǎng)。使用 -Xmn 調(diào)到 1/3總內(nèi)存。觀察后設(shè)置-Xmn500M,新生代實(shí)際約460m。( 用 -XX:NewRatio設(shè)置無(wú)效,只能用 -Xmn) 。添加 -XX:+PrintTenuringDistribution參數(shù)觀察各個(gè)Age 的對(duì)象總大小,觀察后設(shè)置-XX:MaxTenuringThreshold=5。優(yōu)化后,大約1.1 秒才發(fā)生一次minor gc ,且速度依然保持在15-20ms 之間。同時(shí)年老代的增長(zhǎng)速度大大減緩,很久才發(fā)生一次full gc,參數(shù)定稿:-server -Xms1536m -Xmx1536m -Xmn512m-XX:+UseConcMarkSweepGC-XX:MaxTenuringThreshold=5 -XX:+Expli
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二四年商業(yè)廣告燈箱安裝施工合同
- 2025年度大曰金地產(chǎn)樓盤銷售代理合同全案策劃執(zhí)行合同4篇
- 2025年私人住房買賣合同書含物業(yè)管理服務(wù)條款范本2篇
- 2025年度高端鈦礦資源批量采購(gòu)合同
- 二零二五版鍋爐設(shè)備買賣合同附安全使用操作手冊(cè)3篇
- 2025年度醫(yī)療設(shè)備租賃合同擔(dān)保與維修保養(yǎng)服務(wù)范本4篇
- 二零二五年度屋頂防水隔熱一體化合同
- 2025年BEC商務(wù)英語(yǔ)專業(yè)課程研發(fā)與授權(quán)使用合同3篇
- 二零二五版智慧城市基礎(chǔ)設(shè)施用地租賃合同3篇
- 預(yù)應(yīng)力專項(xiàng)施工方案
- 足球訓(xùn)練基地管理制度
- 太平洋藍(lán)鯨計(jì)劃制度和基本法
- (承諾書)安防監(jiān)控售后服務(wù)承諾書范文
- 高低溫交變濕熱試驗(yàn)檢測(cè)報(bào)告
- 蘇教版四年級(jí)數(shù)學(xué)下冊(cè)《全冊(cè)》完整課件ppt
- 《高一地理必修一全套課件》
- 新點(diǎn)軟件算量基礎(chǔ)知識(shí)內(nèi)部培訓(xùn)講義
- 幼兒園學(xué)前-《拍蚊子》教學(xué)課件設(shè)計(jì)
- 移動(dòng)商務(wù)內(nèi)容運(yùn)營(yíng)(吳洪貴)任務(wù)三 APP的品牌建立與價(jià)值提供
- 北師大版三年級(jí)數(shù)學(xué)上冊(cè)《總復(fù)習(xí)》教案及教學(xué)反思
- 新聞評(píng)論-第五章新聞評(píng)論的選題技巧課件
評(píng)論
0/150
提交評(píng)論