<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          解讀JVM虛擬機(jī)

          共 8399字,需瀏覽 17分鐘

           ·

          2020-10-30 03:08

          閱讀文本大概需要3分鐘。

          概要點(diǎn):

          • java虛擬機(jī)概述和基本概念

          • 堆、棧、方法區(qū)

          • 了解虛擬機(jī)參數(shù)

          • 垃圾回收概念和算法、及對象的分代轉(zhuǎn)換

          • 垃圾收集器

          java虛擬機(jī)的原理:

          • 所謂虛擬機(jī),就是一臺虛擬的機(jī)器。它是一款軟件,用來執(zhí)行一系列虛擬計(jì)算機(jī)指令,大體上虛擬機(jī)可以分為系統(tǒng)虛擬機(jī)和程序虛擬機(jī),大名鼎鼎的Visual Box、VMare就屬于系統(tǒng)虛擬機(jī),他們完全是對物理計(jì)算機(jī)的仿真,提供了一個(gè)可運(yùn)行完整操作系統(tǒng)的軟件平臺。

          • 程序虛擬機(jī)典型代表就是Java虛擬機(jī),它專門為執(zhí)行單個(gè)計(jì)算機(jī)程序而設(shè)計(jì),在java虛擬機(jī)中執(zhí)行的指令我們成為java字節(jié)碼指令。無論是系統(tǒng)虛擬機(jī)還是程序虛擬機(jī),在上面運(yùn)行的軟件都被限制于虛擬機(jī)提供的資源中。Java發(fā)展至今,出現(xiàn)過很多虛擬機(jī),最初Sun使用的一款叫Classic的Java虛擬機(jī),到現(xiàn)在引用最廣泛的是HotSpot虛擬機(jī),除了Sun外,還有BEA的JRockit,目前JRockit和HotSpot都被Oracle收入旗下,大有整合的趨勢。

          java虛擬機(jī)的基本結(jié)構(gòu)

          ?

          結(jié)構(gòu)概念說明:

          • 類加載子系統(tǒng):負(fù)責(zé)從文件系統(tǒng)或者網(wǎng)絡(luò)中加載Class信息,加載的信息 存放在一塊稱之為方法區(qū)的內(nèi)存空間。

          • 方法區(qū):就是存放類信息、常量信息、常量池信息、包括字符串字面量和數(shù)字常量等。

          • java堆:在java虛擬機(jī)啟動的時(shí)候建立java堆,它是java程序最主要的內(nèi)存工作區(qū)域,幾乎所有的對象實(shí)例都存放到j(luò)ava堆中,堆空間是所有線程共享的。

          • 直接內(nèi)存:Java的NIO庫允許java程序使用直接內(nèi)存,從而提高性能,通常直接內(nèi)存速度會優(yōu)于java堆。讀寫頻繁的場合可能會考慮使用。

          • 每個(gè)虛擬機(jī)線程都有一個(gè)私有的棧,一個(gè)線程的java棧在線程創(chuàng)建的時(shí)候被創(chuàng)建,java棧中保存著局部變量、方法參數(shù)、同時(shí)java的方法調(diào)用、返回值等。

          • 本地方法棧和java棧非常類似,最大不同為本地方法棧用于本地方法調(diào)用。java虛擬機(jī)允許java直接調(diào)用本地方法(通常使用C編寫)。

          • 垃圾收集系統(tǒng)是java的核心,也是必不可少的,java有一套自己進(jìn)行垃圾清理的機(jī)制,開發(fā)人員無需手工清理,我們稍后詳細(xì)說明。

          • PC(Program Counter)寄存器也是每個(gè)線程私有的空間,java虛擬機(jī)會為每個(gè)線程創(chuàng)建PC寄存器,在任意時(shí)刻,一個(gè)java線程總是在執(zhí)行一個(gè)方法,這個(gè)方法被稱為當(dāng)前方法,如果當(dāng)前方法不是本地方法,PC寄存器就會執(zhí)行當(dāng)前正在被執(zhí)行的指令,如果是本地方法,則PC寄存器值為undefined,寄存器存放如當(dāng)前執(zhí)行環(huán)境指針、程序計(jì)數(shù)器、操作棧指針、計(jì)算的變量指針等信息。

          • 虛擬機(jī)最核心的組件就是執(zhí)行引擎了,它負(fù)責(zé)執(zhí)行虛擬機(jī)的字節(jié)碼。一般會先進(jìn)行編譯成機(jī)器碼后執(zhí)行

          堆、棧、方法區(qū)概念和聯(lián)系:

          • 堆解決的是數(shù)據(jù)存儲的問題,即數(shù)據(jù)怎么放、放在哪兒。棧解決程序的運(yùn)行問題,即程序如何執(zhí)行,或者說如何處理數(shù)據(jù)。

          • 方法區(qū)則是輔助堆棧的快永久區(qū)(Perm),解決堆棧信息的產(chǎn)生,是先決條件。

          • 我們創(chuàng)建一個(gè)新的對象,User:那么User類的一些信息(類信息、靜態(tài)信息都存在于方法區(qū)中) 而User類被實(shí)例化出來之后,被存儲到j(luò)ava堆中,一塊內(nèi)存空間 當(dāng)我們?nèi)ナ褂玫臅r(shí)候,都是使用User對象的引用,形如User user = new User(); 這里的user就是存放在java棧中的,即User真實(shí)對象的一個(gè)引用。

          java棧:

          • java棧是一塊線程私有的內(nèi)存空間,一個(gè)棧,一般由三部分組成:局部變量表、操作數(shù)棧和幀數(shù)據(jù)區(qū)。

          • 局部變量表:用于報(bào)錯(cuò)函數(shù)的參數(shù)及局部變量。操作數(shù)棧:主要保存計(jì)算過程的中間結(jié)果,同時(shí)作為計(jì)算過程中變量臨時(shí)的存儲空間。

          • 幀數(shù)據(jù)區(qū):除了局部變量表和操作數(shù)棧以外,棧還需要一些數(shù)據(jù)來支持常量池的解析,這里幀數(shù)據(jù)區(qū)保存著訪問常量池的指針,方便程序訪問常量池。

          • 另外,當(dāng)函數(shù)返回或者出現(xiàn)異常時(shí),虛擬機(jī)必須有一個(gè)異常處理表,方便發(fā)送異常的時(shí)候找到異常的代碼,因此異常處理表也是幀數(shù)據(jù)區(qū)的一部分。

          java方法區(qū):

          • java方法區(qū)和堆一樣,方法區(qū)是一塊所有線程共享的內(nèi)存區(qū)域,它保存系統(tǒng)的類信息,比如類的字段、方法、常量池等。

          • 方法區(qū)的大小決定了系統(tǒng)可以保存多少個(gè)類,如果系統(tǒng)定義太多的類,導(dǎo)致方法區(qū)溢出。虛擬機(jī)同樣會拋出內(nèi)存溢出錯(cuò)誤。方法區(qū)可以理解為永久區(qū)(Perm)

          ?虛擬機(jī)參數(shù):

          • 在虛擬機(jī)運(yùn)行的過程中,如果可以跟蹤系統(tǒng)的運(yùn)行狀態(tài),那么對于問題的故障排查會有一定的幫助。

          • 為此,虛擬機(jī)提供了一些跟蹤系統(tǒng)狀態(tài)的參數(shù),使用給定的參數(shù)執(zhí)行java虛擬機(jī),就可以在系統(tǒng)運(yùn)行時(shí)打印相關(guān)日志,用于分析實(shí)際問題。我們進(jìn)行虛擬機(jī)參數(shù)配置,其實(shí)主要就是圍繞著堆、棧、方法區(qū)進(jìn)行配置。

          堆分配參數(shù)(一):

          • -XX:+PrintGC 使用這個(gè)參數(shù),虛擬機(jī)啟動后,只要遇到GC就會打印日志。

          • -XX:+UseSerialGC 配置串行回收器

          • -XX:+PrintGCDetails 可以查看詳細(xì)信息,包括各個(gè)區(qū)的情況

          • -Xms:設(shè)置java程序啟動時(shí)初始堆大小

          • -Xmx:設(shè)置java程序能獲得的最大堆大小

          • -Xmx20m -Xms5m -XX:+PrintCommandLineFlags : 可以將隱式或者顯示傳給虛擬機(jī)的參數(shù)輸出

          • 總結(jié):在實(shí)際工作中,我們可以直接將初始的堆大小與最大堆大小設(shè)置相等,這樣的好處是可以減少程序運(yùn)行時(shí)的垃圾回收次數(shù),從而提高性能。

          堆分配參數(shù)(二):

          • 新生代的配置 -Xmn:可以設(shè)置新生代的大小,設(shè)置一個(gè)比較大的新生代會減少老年代的大小,這個(gè)參數(shù)對系統(tǒng)性能以及GC行為有很大的影響,新生代大小一般會設(shè)置整個(gè)堆空間的1/3到1/4左右。

          • -XX:SurvivorRatio:用來設(shè)置新生代中eden空間和from/to空間的比例。含義:-XX:SurvivorRatio=eden/from=eden/to

          • 總結(jié):不同的堆分布情況,對系統(tǒng)執(zhí)行會產(chǎn)生一定的影響,在實(shí)際工作中,應(yīng)該根據(jù)系統(tǒng)的特點(diǎn)做出合理的配置,基本策略:盡可能將對象預(yù)留在新生代,減少老年代的GC次數(shù)。除了可以設(shè)置新生代的絕對大小(-Xmn),還可以使用(-XX:NewRatio)設(shè)置新生代和老年代的比例:-XX:NewRatio=老年代/新生代

          堆溢出處理:

          • 在java程序的運(yùn)行過程中,如果堆空間不足,則會拋出內(nèi)存溢出的錯(cuò)誤(Out Of Menory)OOM,一旦這類問題發(fā)生在生產(chǎn)環(huán)境,可能引起嚴(yán)重的業(yè)務(wù)中斷。

          • java虛擬機(jī)提供了-XX:+HeapDumpOnOutOfMemoryError,使用該參數(shù)可以在內(nèi)存溢出時(shí)導(dǎo)出整個(gè)堆信息,與之配合使用的還有參數(shù), -XX:HeapDumpPath,可以設(shè)置導(dǎo)出堆的存放路徑。

          棧配置:

          • Java虛擬機(jī)提供了參數(shù)-Xss來指定線程的最大??臻g,整個(gè)參數(shù)也直接決定了函數(shù)可調(diào)用的最大深度。

          方法區(qū):

          • 和java堆一樣,方法區(qū)是一塊所有線程共享的內(nèi)存區(qū)域,它用于保存系統(tǒng)的類信息,方法區(qū)(永久區(qū))可以保存多少信息可以對其進(jìn)行配置。

          • 在默認(rèn)情況下,-XX:MaxPermSize為64MB,如果系統(tǒng)運(yùn)行時(shí)生產(chǎn)大量的類,就需要設(shè)置一個(gè)相對合適的方法區(qū),以免出現(xiàn)永久區(qū)內(nèi)存溢出的問題。-XX:PermSize=64M -XX:MaxPermSize=64M

          直接內(nèi)存配置:

          • 直接內(nèi)存也是java程序中非常重要的組成部分,特別是廣泛用在NIO中,直接內(nèi)存跳過了java堆,使java程序可以直接訪問原生堆空間,因此在一定程度上加快了內(nèi)存空間的訪問速度。但是說直接內(nèi)存一定就可以提高內(nèi)存訪問速度也不見得,具體情況具體分析。

          • 相關(guān)配置參數(shù):-XX:MaxDirectMemorySize,如果不設(shè)置默認(rèn)值為最大堆空間,即-Xmx。直接內(nèi)存使用達(dá)到上限時(shí),就會觸發(fā)垃圾回收,如果不能有效的釋放空間,也會引起系統(tǒng)的OOM.

          垃圾回收概念和其算法:

          • 談到垃圾回收(Garbage Collection,簡稱GC),需要先澄清什么是垃圾,類比日常生活中的垃圾,我們會把他們丟入垃圾桶,然后倒掉。

          • GC中的垃圾,特指存于內(nèi)存中、不會再被使用的對象,而回收就是相當(dāng)于把垃圾“倒掉”。垃圾回收有很多種算法:如引用計(jì)數(shù)法、標(biāo)記壓縮法、復(fù)制算法、分代、分區(qū)的思想。

          垃圾收集算法(一):

          • 引用計(jì)數(shù)法:這是個(gè)比較古老而經(jīng)典的垃圾收集算法,其核心就是在對象被其他所引用時(shí)計(jì)數(shù)器加1,而當(dāng)引用失效時(shí)則減1,但是這種方式有非常嚴(yán)重的問題:無法處理循環(huán)引用的情況、還有就是每次進(jìn)行加減操作比較浪費(fèi)系統(tǒng)性能。標(biāo)記清除法:就是分為標(biāo)記和清除倆個(gè)階段進(jìn)行處理內(nèi)存中的對象,當(dāng)然這種方式也有非常大的弊端,就是空間碎片問題,垃圾回收后的空間不是連續(xù)的,不連續(xù)的內(nèi)存空間的工作效率要低于連續(xù)的內(nèi)存空間。

          • 復(fù)制算法:其核心思想就是將內(nèi)存空間分為兩塊,,每次只使用其中一塊,在垃圾回收時(shí),將正在使用的內(nèi)存中的存留對象復(fù)制到未被使用的內(nèi)存塊中去,之后去清除之前正在使用的內(nèi)存塊中所有的對象,反復(fù)去交換倆個(gè)內(nèi)存的角色,完成垃圾收集。(java中新生代的from和to空間就是使用這個(gè)算法)

          • 標(biāo)記壓縮法:標(biāo)記壓縮法在標(biāo)記清除法基礎(chǔ)之上做了優(yōu)化,把存活的對象壓縮到內(nèi)存一端,而后進(jìn)行垃圾清理。(java中老年代使用的就是標(biāo)記壓縮法) 考慮一個(gè)問題:為什么新生代和老年代使用不同的算法?

          垃圾收集算法(二):

          • 分代算法:就是根據(jù)對象的特點(diǎn)把內(nèi)存分成N塊,而后根據(jù)每個(gè)內(nèi)存的特點(diǎn)使用不同的算法。對于新生代和老年代來說,新生代回收頻率很高,但是每次回收耗時(shí)都很短,而老年代回收頻率較低,但是耗時(shí)會相對較長,所以應(yīng)該盡量減少老年代的GC.

          • 分區(qū)算法:其主要就是將整個(gè)內(nèi)存分為N多個(gè)小的獨(dú)立空間,每個(gè)小空間都可以獨(dú)立使用,這樣細(xì)粒度的控制一次回收都少個(gè)小空間和那些個(gè)小空間,而不是對整個(gè)空間進(jìn)行GC,從而提升性能,并減少GC的停頓時(shí)間。

          垃圾回收時(shí)的停頓現(xiàn)象:

          • 垃圾回收器的任務(wù)是識別和回收垃圾對象進(jìn)行內(nèi)存清理,為了讓垃圾回收器可以高效的執(zhí)行,大部分情況下,會要求系統(tǒng)進(jìn)入一個(gè)停頓的狀態(tài)。

          • 停頓的目的是終止所有應(yīng)用線程,只有這樣系統(tǒng)才不會有新的垃圾產(chǎn)生,同時(shí)停頓保證了系統(tǒng)狀態(tài)在某一個(gè)瞬間的一致性,也有益于更好標(biāo)記垃圾對象。因此在垃圾回收時(shí),都會產(chǎn)生應(yīng)用程序的停頓。

          對象如何進(jìn)入老年代:

          • 一般而言對象首次創(chuàng)建會被放置在新生代的eden區(qū),如果沒有GC介入,則對象不會離開eden區(qū),那么eden區(qū)的對象如何進(jìn)入老年代呢?

          • 一般來講,只要對象的年齡達(dá)到一定的大小,就會自動離開年輕代進(jìn)入老年代,對象年齡是由對象經(jīng)歷數(shù)次GC決定的,在新生代每次GC之后如果對象沒有被回收則年齡加1.虛擬機(jī)提供了一個(gè)參數(shù)來控制新生代對象的最大年齡,當(dāng)超過這個(gè)年齡范圍就會晉升老年代。-XX:MaxTenuringThreshold,默認(rèn)情況下為15。

          • 總結(jié):根據(jù)設(shè)置MaxTenuringThreshold參數(shù),可以指定新生代對象經(jīng)過多少次回收后進(jìn)入老年代。另外,大對象(新生代eden區(qū)無法裝入時(shí),也會直接進(jìn)入老年代)。JVM里有個(gè)參數(shù)可以設(shè)置對象的大小超過在指定的大小之后,直接晉升老年代。-XX:PretenureSizeThreshold

          • 總結(jié):使用PretenureSizeThreshold可以進(jìn)行指定進(jìn)入老年代的對象大小,但是要注意TLAB區(qū)域優(yōu)先分配空間。

          對象創(chuàng)建流程圖:

          ?垃圾收集器:

          • 在java虛擬機(jī)中,垃圾回收器不僅僅只有一種,什么情況下該使用哪種,對性能又有什么樣的影響,這都是我們需要了解的。

          • 串行垃圾回收器

          • 并行垃圾回收器

          • CMS回收器

          • G1回收器

          串行回收器:

          • 串行回收器是指使用單線程進(jìn)行垃圾回收的回收器。每次回收時(shí),串行回收器只有一個(gè)工作線程,對于并行能力較弱的計(jì)算機(jī)來說,串行回收器的專注性和獨(dú)占性往往有更好的性能表現(xiàn)。

          • 串行回收器可以在新生代和老年代使用,根據(jù)作用于不同的堆空間,分為新生代串行回收器和老年代串行回收器。使用-XX:+UseSerialGC 參數(shù)可以設(shè)置使用新生代串行回收器和老年代串行回收器

          并行回收器(ParNew回收器):

          • 并行回收器在串行回收器基礎(chǔ)上做了改進(jìn),他可以使用多個(gè)線程同時(shí)進(jìn)行垃圾回收,對于計(jì)算能力強(qiáng)的計(jì)算機(jī)而言,可以有效的縮短垃圾回收所需的實(shí)際時(shí)間。

          • ParNew回收器是一個(gè)工作在新生代的垃圾收集器,他只是簡單的將串行回收器多線程化,他的回收策略和算法和串行回收器一樣。

          • 使用 -XX:+UseParNewGC 新生代ParNew回收器,老年代則使用串行回收器 ParNew回收器工作時(shí)的線程數(shù)量可以使用

          • -XX:ParallelGCThreads參數(shù)指定,一般最好和計(jì)算機(jī)的CPU相當(dāng),避免過多的線程影響性能。

          并行回收器(ParallelGC回收器):

          • 新生代ParallelGC回收器,使用了復(fù)制算法的收集器,也是多線程獨(dú)占形式的收集器,但ParallelGC回收器有個(gè)非常重要的特點(diǎn),就是它非常關(guān)注系統(tǒng)的吞吐量。

          • 提供了倆個(gè)非常關(guān)鍵的參數(shù)控制系統(tǒng)的吞吐量

          • -XX:MaxGCPauseMillis:設(shè)置最大垃圾收集停頓時(shí)間,可用把虛擬機(jī)在GC停頓的時(shí)間控制在MaxGCPauseMillis范圍內(nèi),如果希望減少GC停頓時(shí)間可以將MaxGCPauseMillis設(shè)置的很小,但是會導(dǎo)致GC頻繁,從而增加了GC的總時(shí)間,降低了吞吐量。所以需要根據(jù)實(shí)際情況設(shè)置該值。

          • -XX:GCTimeRatio:設(shè)置吞吐量大小,它是一個(gè)0到100之間的整數(shù),默認(rèn)情況下他的取值是99,那么系統(tǒng)將花費(fèi)不超過1/(1+n)的時(shí)間用于垃圾回收,也就是1/(1+99) = 1%的時(shí)間。

          • 另外還可以指定 -XX:+UseAdaptiveSizePolicy打開自適應(yīng)模式,在這種模式下,新生代的大小、eden、from/to的比例,以及晉升老年代的對象年齡參數(shù)會被自動調(diào)整,以達(dá)到在堆大小、吞吐量和停頓時(shí)間之間的平衡點(diǎn)。

          并行回收器(ParallelOldGC回收器):

          • 老年代ParallelOldGC回收器也是一種多線程的回收器,和新生代的ParallelGC回收器一樣,也是一種關(guān)注吞吐量的回收器,他使用了標(biāo)記壓縮算法進(jìn)行實(shí)現(xiàn)。

          • -XX:+UseParallelOldGC 進(jìn)行設(shè)置

          • -XX:+ParallelGCThreads 也可以設(shè)置垃圾收集時(shí)的線程數(shù)量。

          CMS回收器:

          • CMS全稱為:Concurrent Mark Sweep 意為并發(fā)標(biāo)記清除,他使用的是標(biāo)記清除法,主要關(guān)注系統(tǒng)停頓時(shí)間。

          • 使用 -XX:+UseConcMarkSweepGC 進(jìn)行設(shè)置。

          • 使用 -XX:ConcGCThreads 設(shè)置并發(fā)線程數(shù)量。

          • CMS并不是獨(dú)占的回收器,也就說CMS回收的過程中,應(yīng)用程序仍然在不停的工作,又會有新的垃圾不斷的產(chǎn)生,所以在使用CMS的過程中應(yīng)該確保應(yīng)用程序的內(nèi)存足夠可用。CMS不會等到應(yīng)用程序飽和的時(shí)候才去回收垃圾,而是在某一閥值的時(shí)候開始回收,回收閥值可用指定的參數(shù)進(jìn)行配置,-XX:CMSInitiatingOccupancyFraction來指定,默認(rèn)為68,也就是說當(dāng)老年代的空間使用率達(dá)到68%的時(shí)候,會執(zhí)行CMS回收。如果內(nèi)存使用率增長的很快,在CMS執(zhí)行的過程中,已經(jīng)出現(xiàn)了內(nèi)存不足的情況,此時(shí)CMS回收就會失敗,虛擬機(jī)將啟動老年代串行回收器進(jìn)行垃圾回收,這會導(dǎo)致應(yīng)用程序中斷,知道垃圾回收完成后才會正常工作,這個(gè)過程GC的停頓時(shí)間可能較長,所以 - XX:CMSInitiatingOccupancyFraction的設(shè)置要根據(jù)實(shí)際的情況。

          • 標(biāo)記清除法有個(gè)缺點(diǎn)就是存在內(nèi)存碎片的問題,那么CMS有個(gè)參數(shù)設(shè)置-XX:+UseCMSCompactAtFullCollecion可以使CMS回收完成之后進(jìn)行一次碎片整理,-XX:CMSFullGCsBeforeCompaction參數(shù)可以設(shè)置進(jìn)行多少次CMS回收之后,對內(nèi)存進(jìn)行一次壓縮。

          G1回收器:

          • G1回收器(Garbage-First)是在jdk1.7中正式使用的垃圾回收器,從長期目標(biāo)來看是為了取代CMS回收器,G1回收器擁有獨(dú)特的垃圾回收策略,G1屬于分代垃圾回收器,區(qū)分新生代和老年代,依然有eden和from/to區(qū),它并不要求整個(gè)eden區(qū)或者新生代、老年代的空間都連續(xù),它使用了分區(qū)算法。

          • 并行性:G1回收期間可多線程同時(shí)工作。

          • 并發(fā)性:G1擁有與應(yīng)用程序交替執(zhí)行能力,部分工作可與應(yīng)用程序同時(shí)執(zhí)行,在整個(gè)GC期間不會完全阻塞應(yīng)用程序。

          • 分代GC:G1依然是一個(gè)分代的收集器,但是它是兼顧新生代和老年代一起工作,之前的垃圾收集器他們或者在新生代工作,或者在老年代工作,因此這是一個(gè)很大的不同??臻g整理:G1在回收過程中,不會像CMS那樣在若干次GC后需要進(jìn)行碎片整理,G1采用了有效復(fù)制對象的方式,減少空間碎片。

          • 可預(yù)見性:由于分區(qū)的原因,G1可以只選取部分區(qū)域進(jìn)行回收,縮小了回收的范圍,提升了性能。

          • 使用 -XX:+UseG1GC 應(yīng)用G1收集器

          • 使用 -XX:MaxGCPauseMillis 指定最大停頓時(shí)間

          • 使用 -XX:ParallelGCThreads 設(shè)置并行回收的線程數(shù)量

          Tomcat性能影響實(shí)驗(yàn):

          • 配置環(huán)境說明:Tomcat7

          • 一個(gè)JSP網(wǎng)站 測試網(wǎng)站吞吐量(1個(gè)指標(biāo)、停頓時(shí)間,內(nèi)存的使用情況,包括回收的效率....)

          • 工具:Apache JMeter 下載地址:http://jmeter.apache.org/download_jmeter.cgi

          • 實(shí)驗(yàn)原理:通過JMeter對Tomcat增加壓力,不同的虛擬機(jī)參數(shù)應(yīng)該會有不同的表現(xiàn)

          • 目的:觀察不同配置參數(shù)對吞吐量的影響

          測試串行回收器:

          • -XX:+PrintGCDetails -Xmx32M -Xms32M

          • -XX:+HeapDumpOnOutOfMemoryError

          • -XX:+UseSerialGC -XX:PermSize=32M

          • 測試結(jié)果顯示吞吐量為:1152 115

          擴(kuò)大堆內(nèi)存以提升系統(tǒng)性能:

          • -XX:+PrintGCDetails -Xmx512M -Xms32M

          • -XX:+HeapDumpOnOutOfMemoryError

          • -XX:+UseSerialGC

          • -XX:PermSize=32M -Xloggc:d:/gc.log

          • 測試結(jié)果顯示吞吐量為:1557 155

          調(diào)整初始堆大小:

          • -XX:+PrintGCDetails -Xmx512M -Xms64M

          • -XX:+HeapDumpOnOutOfMemoryError

          • -XX:+UseSerialGC

          • -XX:PermSize=32M -Xloggc:d:/gc.log

          • 測試結(jié)果顯示吞吐量為:2100 209

          測試ParNew回收器的表現(xiàn):

          • -XX:+PrintGCDetails -Xmx512M -Xms64M

          • -XX:+HeapDumpOnOutOfMemoryError

          • -XX:+UseParNewGC -XX:PermSize=32M -Xloggc:d:/gc.log

          • 測試結(jié)果顯示吞吐量為:2200 220

          使用ParallelOldGC回收器:

          • -XX:+PrintGCDetails -Xmx512M -Xms64M

          • -XX:+HeapDumpOnOutOfMemoryError

          • -XX:+UseParallelGC -XX:+UseParallelOldGC

          • -XX:ParallelGCThreads=8 -XX:PermSize=32M -Xloggc:d:/gc.log

          • 測試結(jié)果顯示吞吐量為:3336 330

          測試CMS回收器的性能:

          • -XX:+PrintGCDetails -Xmx512M -Xms64M

          • -XX:+HeapDumpOnOutOfMemoryError

          • -XX:+UseConcMarkSweepGC -XX:ConcGCThreads=8

          • -XX:PermSize=32M -Xloggc:d:/gc.log

          • 測試結(jié)果顯示吞吐量為:2100? 209

          suorce:https://www.cnblogs.com/haha66/p/13821842.html




          往期精彩



          01?漫談發(fā)版哪些事,好課程推薦

          02?Linux的常用最危險(xiǎn)的命令

          03?互聯(lián)網(wǎng)支付系統(tǒng)整體架構(gòu)詳解

          04?優(yōu)秀的Java程序員必須了解的GC哪些

          05?IT大企業(yè)有哪些病,別被這些病毀了自己?

          關(guān)注我每天進(jìn)步一點(diǎn)點(diǎn)

          你點(diǎn)的在看,我都當(dāng)成了喜歡


          瀏覽 112
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美一级A片在线观看 | 欧美尻屄视频 | 亚洲高清无码在线视频 | 日韩最新高清无码 | 全国极品999无码视频免费观看 |