国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
一步步優(yōu)化JVM<三>:GC優(yōu)化基礎(chǔ)
本節(jié)主要描述關(guān)于垃圾回收器性能的三個指標(biāo),三個關(guān)于垃圾回收器優(yōu)化的基本原則,以及優(yōu)化HotSpot VM的垃圾回收器的信息收集,在這些指標(biāo)中權(quán)衡以及信息的收集是非常重要的。

性能指標(biāo)
   吞吐量:衡量垃圾回收器運(yùn)行在性能峰值的時候不需要關(guān)心垃圾回收器暫停的時間或者需要占用內(nèi)存的能力。
   延遲:衡量垃圾回收器最小化甚至消滅由垃圾回收器引起的暫停時間和應(yīng)用抖動的能力。
   內(nèi)存占用:衡量為了高效的運(yùn)行,垃圾回收器需要的內(nèi)存。

   一項(xiàng)指標(biāo)的提升,往往需要犧牲其他一項(xiàng)或者兩項(xiàng)指標(biāo)。換一句話說,一項(xiàng)指標(biāo)的妥協(xié)通常是為了支持提升其他一項(xiàng)或者兩項(xiàng)指標(biāo)。然而,對于大多數(shù)應(yīng)用來說,很少有3項(xiàng)指標(biāo)都非常重要,通常,一項(xiàng)或者兩項(xiàng)比其他的更重要。

   由于始終需要各種權(quán)衡,那么知道哪項(xiàng)指標(biāo)對應(yīng)用是最有必要的就顯得非常重要。

原則
   在優(yōu)化JVM垃圾回收器的時候,有3項(xiàng)基本原則
  • 在minor垃圾回收器中,最大量的對象被回收,這個被稱為Minor GC回收原則。秉承這個原則可以減少由應(yīng)用產(chǎn)生的full垃圾回收數(shù)量和頻率,F(xiàn)ull垃圾回收往往需要更長的時間,以致于應(yīng)用無法達(dá)到延遲和吞吐量的需求。
  • 更多的內(nèi)存分配給垃圾回收器,也就是說更大的Java堆空間,垃圾回收器和應(yīng)用在吞吐量和延遲上會表現(xiàn)得更好,這條原則被稱為GC最大內(nèi)存原則。
  • 優(yōu)化JVM垃圾回收器的3個指標(biāo)中的2個,這個被稱為2/3 GC優(yōu)化原則。
   在進(jìn)行優(yōu)化JVM垃圾回收器的時候, 牢牢記住這三條原則會讓你的優(yōu)化任務(wù)更容易完成。
命令行選項(xiàng)和GC日志
   從垃圾回收器獲取監(jiān)控信息,是優(yōu)化JVM的重要操作。收集垃圾回收器信息的最好辦法就是收集日志。這個意味著通過HotSpot VM的命令行選項(xiàng)可以收集垃圾回收器的統(tǒng)計信息。開啟垃圾回收器日志(即使在生產(chǎn)環(huán)境)是很好的主意,其實(shí)開啟垃圾回收器的開銷很小而且可以提供豐富的信息,這些信息和垃圾回收器應(yīng)用事件或者JVM事件有關(guān)系,比如說:一個應(yīng)用在運(yùn)行過程中出現(xiàn)了一個比較長的暫停,如果有垃圾回收信息,就可以判斷出是垃圾回收器引起的暫停還是應(yīng)用進(jìn)行的其他操作引起的暫停。

   有很多的HotSpot VM命令行選項(xiàng)可以用在垃圾回收的日志上面,下面列舉幾個推薦使用的命令行選項(xiàng):
  1. -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:  

-XX:+PrintGCTimeStamps打印出垃圾回收發(fā)生的時間是距離HotSpot VM啟動時間的秒數(shù)。-XX:+PrintGCDetails提供了垃圾回收特有的統(tǒng)計信息而且具體信息依賴于使用的垃圾回收器類型。-Xloggc:<filename>表示垃圾回收器的信息輸出到叫<filename>的文件。

   下面是通過使用-XX:+UseParallelOldGC或者-XX:+UseParallelGC選項(xiàng)來打印出來的垃圾回收信息,而且使用了前面列出的3個選項(xiàng)。
  1. 45.152: [GC [PSYoungGen: 295648K->32968K(306432K)] 296198K->33518K(1006848K), 0.1083183 secs][Times: user=1.83 sys=0.01, real=0.11 secs]  

45.152是表明距離JVM啟動到垃圾回收的秒數(shù),GC標(biāo)簽表明是Minor GC或者young代垃圾回收。

   [PSYoungGen: 295648K->32968K(306432K)]提供了young代的空間信息,PSYoungGen表示young代的垃圾回收是使用throughput垃圾回收器。其他可能的young代垃圾回收有ParNew(使用CMS垃圾回收器多線程回收young代空間)、DefNew(使用serial垃圾回收器單線程回收young代空間)。

   在“->”左邊的數(shù)字(295648K)表示垃圾回收前young代的空間大小,右邊數(shù)字(32968K)表示垃圾回收后的young代空間大小。young代被分為eden區(qū)域和survivor區(qū)域。由于在垃圾回收之后,eden區(qū)域是空的,右邊的數(shù)字其實(shí)就是survivor區(qū)域的空間。在括號里面的數(shù)字(306432K)表示young代的總空間。

   296198K->33518K(1006848K)提供了Java堆在垃圾回收前后的使用情況。另外,他提供Java堆的總大小,是young代和old代的和。在->左邊的數(shù)字(296198K)表示,在垃圾回收前Java堆占用的空間,->右邊的數(shù)字(33518K)表示垃圾回收后Java堆占用空間。括號里面的數(shù)字(1006848K)表示Java堆總共的空間。

   通過young代的占用空間和Java堆占用的空間,可以快速的計算出old代占用的空間。比如:Java堆的大小是1006848K,young代的空間大小是306432K,因此可以計算出old代的空間大小是1006848K-306432K=700416K。在垃圾回收之前,296198K-295648K=550K是old代使用了的空間。在垃圾回收后33518K-32968K=550K。在這個例子中,在垃圾回收前后沒有對象從young代移動到old代。這是一個重要的觀察說明了Minor GC回收原則。如果有對象被移動到old代,然后變成不可讀取的,就不是最大量的對象被回收,會違反Minor GC回收原則。

   0.1083183 secs表明垃圾回收執(zhí)行的時間。

   [Times: user=1.83 sys=0.01, real=0.11 secs]提供了CPU和占用時間。user表明垃圾回收在用戶模式下執(zhí)行消耗的CPU時間,即:在JVM里面運(yùn)行的時間,在這個例子中,垃圾回收器在用戶模式下消耗1.83秒的CPU時間。sys表示操作系統(tǒng)代表垃圾回收器消耗的時間,在這里例子中,垃圾回收器使用0.01秒的操作系統(tǒng)CPU時間。real表示垃圾回收執(zhí)行的時間的。這幾個數(shù)字精確到0.01秒。

   如果你對垃圾回收的實(shí)際時間感興趣,可以設(shè)置-XX:+PrintGCDateStamps選項(xiàng)。-XX:+PrintGCDateStamps顯示垃圾回收發(fā)生的年,月,日和時間。這個選項(xiàng)是在Java 6 Update 4引入的。下面的例子是同時使用-XX:+PrintGCDateStamps和-XX:+PrintGCDetails選項(xiàng)的結(jié)果:
  1. 2012-06-21T09:57:10.518-0500: [GC[PSYoungGen: 295648K->32968K(306432K)]296198K->33518K(1006848K), 0.1083183 secs][Times: user=1.83 sys=0.01, real=0.11 secs]  

   2012-06-21T09:57:10.518-0500字段是使用了ISO 8601日期和時間戳。格式是YYYY-MM-DDTHH-MM-SS.mmm-TZ,分別的意思是:
YYYY表示4位數(shù)的年
MM表示2位數(shù)月,如果只有一位數(shù),前面加0
DD表示2位數(shù)的天,如果只有一位數(shù),前面加0
T是一個字符用來隔開日期和時間
HH表示2位數(shù)小時,如果只有一位數(shù),前面加0
MM表示2位數(shù)分鐘,如果只有一位數(shù),前面加0
SS表示2位數(shù)秒,如果只有一位數(shù),前面加0
mmm表示3位數(shù)毫秒,如果不足三位,前面加0或者00
TZ表示格林尼治時間的時區(qū)

   盡管時區(qū)已經(jīng)包含在輸出里面了,但是輸出日期和時間不是GMT時間,而是本地化過的時間。

   當(dāng)為了低延遲而優(yōu)化HotSpot VM的時候,下面的兩個選項(xiàng)是非常有用的,這兩個選項(xiàng)會報告應(yīng)用由于虛擬機(jī)的安全點(diǎn)(Safepoint)操作而阻塞的時間以及應(yīng)用程序在安全點(diǎn)(Safepoint)執(zhí)行了多長的時間。
  1. -XX:+PrintGCApplicationStoppedTime    
  2. -XX:+PrintGCApplicationConcurrentTime  
安全點(diǎn)(Safepoint)操作會讓JVM進(jìn)入一種所有應(yīng)用程序的線程都被阻塞以及阻止任何正在執(zhí)行的本地程序把結(jié)果返回給Java代碼的狀態(tài)。當(dāng)需要進(jìn)行優(yōu)化虛擬機(jī)內(nèi)部操作的時候,安全點(diǎn)(Safepoint操作會被執(zhí)行以使得所有線程都進(jìn)入阻塞狀態(tài)避免影響Java堆(垃圾回收是一種安全點(diǎn)(Safepoint操作)。

   由于安全點(diǎn)(Safepoint)操作阻塞了所有Java程序的執(zhí)行,所以知道程序的響應(yīng)時間延遲是否和安全點(diǎn)(Safepoint)操作有關(guān)系就顯得非常重要了。因此,能夠觀察程序什么時候被阻塞( 通過設(shè)置-XX:+PrintGCApplicationStoppedTime選項(xiàng))通過應(yīng)用的日志信息能夠幫組你識別出,當(dāng)應(yīng)用的響應(yīng)時間超過預(yù)期的時候,是安全點(diǎn)(Safepoint)操作引起的還是應(yīng)用或者操作系統(tǒng)的其他操作引起的。-XX:+PrintSafepointStatistics可以幫助區(qū)別垃圾回收的安全點(diǎn)(Safepoint)以及其他的安全點(diǎn)(Safepoint)。

   在發(fā)現(xiàn)應(yīng)用的響應(yīng)時間超過預(yù)期的預(yù)期的時候,-XX:+PrintGCApplicationConcurrentTime選項(xiàng)可以用來判斷程序是否被執(zhí)行以及執(zhí)行了多長時間。

   下圖總結(jié)了前面提到的垃圾回收器的選項(xiàng)以及給出了使用它們的合適情況。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
一步步優(yōu)化JVM三:GC優(yōu)化基礎(chǔ)
深度揭秘垃圾回收底層,這次讓你徹底弄懂她
Java內(nèi)存與垃圾回收調(diào)優(yōu)
JVM7、8詳解及優(yōu)化
JavaOne 2011: The Definitive Set of HotSpot Performance Command-line Options
016-GC-JVM的Stop The World,安全點(diǎn)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服