成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JVM GC調(diào)整優(yōu)化過程全揭秘

開發(fā) 后端
調(diào)整JVM GC(Garbage Collection),可以極大的減少由于JVM GC工作,而導(dǎo)致的程序運行中斷方面的問題,進而適當(dāng)?shù)奶岣逬ava程序的工作效率。

JVM GC調(diào)整優(yōu)化是以個極為復(fù)雜的過程,由于各個程序具備不同的特點,如:web和GUI程序就有很大區(qū)別(Web可以適當(dāng)?shù)耐nD,但GUI停頓是客戶無法接受的),而且由于跑在各個機器上的配置不同(主要cup個數(shù),內(nèi)存不同),所以使用的JVM GC種類也會不同。接下來,我簡單介紹一下如何進行JVM GC調(diào)整優(yōu)化。

首先說一下如何監(jiān)視JVM GC,你可以使用我以前文章中提到的JDK中的jstat工具,也可以在java程序啟動的opt里加上如下幾個參數(shù)(注:這兩個參數(shù)只針對SUN的HotSpotVM):

  1. -XX:-PrintGCPrintmessagesatgarbagecollection.Manageable.  
  2. -XX:-PrintGCDetailsPrintmoredetailsatgarbagecollection.Manageable.(Introducedin1.4.0.)  
  3. -XX:-PrintGCTimeStampsPrinttimestampsatgarbagecollection.Manageable(Introducedin1.4.0.) 

當(dāng)把-XX:-PrintGCDetails加入到j(luò)avaopt里以后可以看見如下輸出:

[GC[DefNew:34538K->2311K(36352K),0.0232439secs]45898K->15874K(520320K),0.0233874secs]
[FullGC[Tenured:13563K->15402K(483968K),0.2368177secs]21163K->15402K(520320K),[Perm:28671K->28635K(28672K)],0.2371537secs]

他們分別顯示了JVM GC的過程,清理出了多少空間。第一行GC使用的是‘普通GC’(MinorCollections),第二行使用的是‘全GC’(MajorCollections)。他們的區(qū)別很大,在第一行最后我們可以看見他的時間是0.0233874秒,而第二行的FullGC的時間是0.2371537秒。第二行的時間是第一行的接近10倍,也就是我們這次調(diào)優(yōu)的重點,減少FullGC的次數(shù),以為FullGC會暫停程序比較長的時間,如果FullGC的次數(shù)比較多。程序就會經(jīng)常性的假死。當(dāng)然這只是他們的表面現(xiàn)象,接下來我仔細(xì)介紹一下GC,和FullGC(為后面的調(diào)優(yōu)做準(zhǔn)備)。

我們知道Java和C++的區(qū)別主要是,Java不需要像c++那樣,由程序員主動的釋放內(nèi)存。而是由JVM里的GC(GarbageCollection)來,在適當(dāng)?shù)臅r候替我們釋放內(nèi)存。JVM GC調(diào)整優(yōu)化的內(nèi)部工作,即JVM GC的算法有很多種,如:標(biāo)記清除收集器,壓縮收集器,分代收集器等等。現(xiàn)在比較常用的是分代收集(也是SUNVM使用的),即將內(nèi)存分為幾個區(qū)域,將不同生命周期的對象放在不同區(qū)域里(新的對象會先生成在Youngarea,在幾次GC以后,如過沒有收集到,就會逐漸升級到Tenuredarea)。在JVM GC收集的時候,頻繁收集生命周期短的區(qū)域(Youngarea),因為這個區(qū)域內(nèi)的對象生命周期比較短,GC效率也會比較高。而比較少的收集生命周期比較長的區(qū)域(OldareaorTenuredarea),以及基本不收集的永久區(qū)(Permarea)。

注:Youngarea又分為三個區(qū)域分別叫Eden,和倆個Survivorspaces。Eden用來存放新的對象,Survivorspaces用于新對象升級到Tenuredarea時的拷貝。

我們管收集生命周期短的區(qū)域(Youngarea)的收集叫GC,而管收集生命周期比較長的區(qū)域(OldareaorTenuredarea)的收集叫FullGC,因為他們的收集算法不同,所以使用的時間也會不同。我們要盡量減少FullGC的次數(shù)。

接下來介紹一下HotSpotVMGC的種類,GC在HotSpotVM5.0里有四種。一種是默認(rèn)的叫serialcollector,另外幾種分別叫throughputcollector,concurrentlowpausecollector,incremental(sometimescalledtrain)lowpausecollector(廢棄掉了)。以下是SUN的官方說明:

1.Thethroughputcollector:thiscollectorusesaparallelversionoftheyounggenerationcollector.Itisusedifthe-XX:+UseParallelGCoptionispassedonthecommandline.Thetenuredgenerationcollectoristhesameastheserialcollector.

2.Theconcurrentlowpausecollector:thiscollectorisusedifthe-Xincgc™or-XX:+UseConcMarkSweepGCispassedonthecommandline.Theconcurrentcollectorisusedtocollectthetenuredgenerationanddoesmostofthecollectionconcurrentlywiththeexecutionoftheapplication.Theapplicationispausedforshortperiodsduringthecollection.Aparallelversionoftheyounggenerationcopyingcollectorisusedwiththeconcurrentcollector.Theconcurrentlowpausecollectorisusediftheoption-XX:+UseConcMarkSweepGCispassedonthecommandline.

3.Theincremental(sometimescalledtrain)lowpausecollector:thiscollectorisusedonlyif-XX:+UseTrainGCispassedonthecommandline.ThiscollectorhasnotchangedsincetheJ2SEPlatformversion1.4.2andiscurrentlynotunderactivedevelopment.Itwillnotbesupportedinfuturereleases.Pleaseseethe1.4.2GCTuningDocumentforinformationonthiscollector.

簡單來說就是throughputcollector和concurrentlowpausecollector:使用多線程的方式,利用多CUP來提高GC的效率,而throughputcollector與concurrentlowpausecollector的去別是throughputcollector只在youngarea使用使用多線程,而concurrentlowpausecollector則在tenuredgeneration也使用多線程。

根據(jù)官方文檔,他們倆個需要在多CPU的情況下,才能發(fā)揮作用。在一個CPU的情況下,會不如默認(rèn)的serialcollector,因為線程管理需要耗費CPU資源。而在兩個CPU的情況下,也挺高不大。只是在更多CPU的情況下,才會有所提高。當(dāng)然concurrentlowpausecollector有一種模式可以在CPU較少的機器上,提供盡可能少的停頓的模式,見下文。

當(dāng)要使用throughputcollector時,在javaopt里加上-XX:+UseParallelGC,啟動throughputcollector收集。也可加上-XX:ParallelGCThreads=來改變線程數(shù)。還有兩個參數(shù)-XX:MaxGCPauseMillis=和-XX:GCTimeRatio=,MaxGCPauseMillis=用來控制最大暫停時間,而-XX:GCTimeRatio可以提高GC說占CPU的比,以最大話的減小heap。

當(dāng)要使用concurrentlowpausecollector時,在java的opt里加上-XX:+UseConcMarkSweepGC。concurrentlowpausecollector還有一種為CPU少的機器準(zhǔn)備的模式,叫Incrementalmode。這種模式使用一個CPU來在程序運行的過程中GC,只用很少的時間暫停程序,檢查對象存活。

在Incrementalmode里,每個收集過程中,會暫停兩次,第二次略長。第一次用來,簡單從root查詢存活對象。第二次用來,詳細(xì)檢查存活對象。整個過程如下:

  1. *stopallapplicationthreads;dotheinitialmark;resumeallapplicationthreads(第一次暫停,初始話標(biāo)記)  
  2. *dotheconcurrentmark(usesoneprocesorfortheconcurrentwork)(運行是標(biāo)記)  
  3. *dotheconcurrentpre-clean(usesoneprocessorfortheconcurrentwork)(準(zhǔn)備清理)  
  4. *stopallapplicationthreads;dotheremark;resumeallapplicationthreads(第二次暫停,標(biāo)記,檢查)  
  5. *dotheconcurrentsweep(usesoneprocessorfortheconcurrentwork)(運行過程中清理)  
  6. *dotheconcurrentreset(usesoneprocessorfortheconcurrentwork)(復(fù)原) 

當(dāng)要使用Incrementalmode時,需要使用以下幾個變量:

  1. -XX:+CMSIncrementalModedefault:disabled啟動i-CMS模式(mustwith-  
  2.  
  3. XX:+UseConcMarkSweepGC)  
  4. -XX:+CMSIncrementalPacingdefault:disabled提供自動校正功能  
  5. -XX:CMSIncrementalDutyCycle=default:50啟動CMS的上線  
  6. -XX:CMSIncrementalDutyCycleMin=default:10啟動CMS的下線  
  7. -XX:CMSIncrementalSafetyFactor=default:10用來計算循環(huán)次數(shù)  
  8. -XX:CMSIncrementalOffset=default:0最小循環(huán)次數(shù)(Thisisthepercentage(0-  
  9.  
  10. 100)bywhichtheincrementalmodedutycycleisshiftedtotherightwithintheperiod  
  11.  
  12. betweenminorcollections.)  
  13. -XX:CMSExpAvgFactor=default:25提供一個指導(dǎo)收集數(shù) 

SUN推薦的使用參數(shù)是:

  1. -XX:+UseConcMarkSweepGC\  
  2. -XX:+CMSIncrementalMode\  
  3. -XX:+CMSIncrementalPacing\  
  4. -XX:CMSIncrementalDutyCycleMin=0\  
  5. -XX:CMSIncrementalDutyCycle=10\  
  6. -XX:+PrintGCDetails\  
  7. -XX:+PrintGCTimeStamps\  
  8. -XX:-TraceClassUnloading 

注:如果JVM GC中使用throughputcollector和concurrentlowpausecollector,這兩種垃圾收集器,需要適當(dāng)?shù)耐Ω邇?nèi)存大小,以為多線程做準(zhǔn)備。JVM GC調(diào)整優(yōu)化到此結(jié)束。

【編輯推薦】

  1. 安裝JDK后JRE與JVM聯(lián)系淺談
  2. 監(jiān)視JSP中JVM可用內(nèi)存
  3. JDK、JRE、JVM之間的關(guān)系
  4. Java之父:我們看中的并非Java語言,而是JVM
  5. Java虛擬機(JVM)中的內(nèi)存設(shè)置詳解
責(zé)任編輯:彭凡 來源: javadby
相關(guān)推薦

2017-11-08 15:23:57

Java GC優(yōu)化jvm

2020-09-10 14:52:01

JVMJava算法

2020-07-29 14:15:04

JavaJvm算法

2019-11-15 15:12:19

Windows激活KMS

2017-09-26 16:32:03

JavaGC分析

2021-04-12 09:36:14

JVM生產(chǎn)問題JVM FULL GC

2010-09-26 16:31:07

JVM參數(shù)配置

2010-09-17 15:25:03

JAVAJVM

2010-09-17 14:03:40

2019-09-04 14:30:54

Nginx功能服務(wù)器

2019-12-10 08:59:55

JVM內(nèi)存算法

2025-04-24 09:01:37

2022-05-27 08:01:36

JVM內(nèi)存收集器

2014-07-25 11:12:32

2025-06-05 02:25:00

2025-04-02 00:00:03

2023-12-07 12:21:04

GCJVM垃圾

2012-10-09 09:25:52

CPU制造過程硅晶片

2023-11-23 09:26:50

Java調(diào)優(yōu)

2012-01-11 11:07:04

JavaJVM
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩精品在线看 | 97精品一区二区 | 国产成人精品在线播放 | 久久久久久久网 | 日本不卡一区 | 国产精品乱码一二三区的特点 | 成人免费视频网站在线看 | 99精品视频免费观看 | 亚洲午夜视频 | 欧美精品一二三 | 国产自产c区 | 日韩中文字幕在线 | 日本午夜在线视频 | 天天艹日日干 | 国产精品成人一区二区三区 | 欧美国产精品一区二区三区 | 波多野结衣一区二区三区 | 欧美 日韩 国产 成人 在线 91 | 色五月激情五月 | 中文字幕精品一区二区三区在线 | 一二三四在线视频观看社区 | 亚洲九九 | 男人影音 | 一级黄a视频 | 欧美高清视频 | 欧美在线a | 日韩理论电影在线观看 | 91久久夜色 | 久久这里只有精品首页 | 国产精品综合久久 | 国产999精品久久久 精品三级在线观看 | 日本黄色大片免费 | 国产人成精品一区二区三 | 亚洲成人精品 | 美女一级毛片 | 国产精品日日夜夜 | 午夜激情国产 | 欧美a区 | 久久综合一区 | 久久国产精品久久久久久 | 国产一级片免费视频 |