亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

一次JVM調優的筆記

2019-11-14 15:29:09
字體:
來源:轉載
供稿:網友

1. JVM Tuning基礎知識

1.1 java堆結構

  Java堆可以處于物理上不連續的內存空間上,只要邏輯上是連續的即可。Java堆就是各種對象分配和保存的內存空間,線程間共享。Java堆分為Eden區,Survivor區,tenured區和Permanent區,如下圖所示。

  Java堆的分配原則如下:

  • Java堆分布如下圖所示,新的類的實例大部分在Eden(之所以用Eden這個詞也就是表示初創起始的意思)區分配。
  • Eden區滿的時候,或者需要GC時,依然存活的對象將被復制到Survivor區,一共有兩個survivor區,當一個survivor區滿時,依然存活的對象將被復制到另一個survivor區。
  • 當survivor區全滿時,從第一個survivor區復制過來的,且此時還存活的對象將被復制到Tenured Generation(年老代)
  • Perm Generation用于存放靜態文件,持久代大小可以通過MaxPermSize進行設置。

 

  Perm Generation是JVM的駐留內存,用于存放JDK自身攜帶的CLASS,Interface的元數據等。被裝載進此區域的數據是不會被垃圾回收器GC回收掉的,關閉JVM時,釋放此區域所控制的內存。

  Java對象的聲明周期在堆中從Young到Tenured,這個期間從Eden誕生到Tenured死亡。當EDEN區不夠用時,將觸發minor gc,GC會對EDEN區進行垃圾回收,將不再使用的對象進行銷毀,同時如果發現對象還被其他對象引用,則將對象移動到survivor區,后面依此類推,當Tenured區發生GC時,稱為major gc,由于java中大部分對象的生命周期都很短,所以GC一般發生在Eden區,因此minor gc發生的頻率比major gc要高很多。如果最后整個堆空間都滿了,則會爆出異常JVM對空間溢出:java.lang.OutOfMemoryError: java heap space。

1.2 JVM GC算法枚舉

  • Mark-sweep算法

        即標記回收算法,將需要回收的對象標記,再統一回收。這種算法適合Perm代的對象,以為Perm代的存儲空間比較大,需要回收的又不多。

  • Copying算法

     即復制算法,直接拷貝。適合Eden區的對象向survivor區拷貝,因為Eden區的對象大部分都需要GC,而且Eden區的容量小。

  •  Mark-compact算法

   即標記整理算法,與標記清除算法不同,標記整理算法避免了內存碎片問題,它將所有存活的對象向內存的一端移動,“整理”完成后,一端是存活的對象一端是可回收內存,然后直接清除可回收內存。

1.3 GC收集器

  • Serial收集器

   最基本、最古老的收集器。這是一個單線程收集器,GC過程中,應用會被停掉,即stop-the-world。

  • Parnew收集器

   實現代碼與serial差不多,不同的是這是一個多線程回收器。

  • Paralled scavenge收集器 

     Paralled scavenger收集器是一個新生代回收器,使用復制算法,也是一個多線程并行收集器。parallel scavenge收集器專注于提高吞吐量,吞吐量定義為:

            吞吐量 = 用戶程序執行時間/(用戶程序執行時間 + 垃圾回收時間)

  • Serial old收集器

   Serial old是Serial收集器的老年代版本。

  • Parallel old收集器

   Parallel Scavenge收集器的老年代版本。使用標記-整理算法。

  • CMS(concurrent mark sweep)收集器:并發標記清除收集器,以最短停頓時間為目標的收集器。采用標記—清除算法實現。

 

2.VisualVM1實際監控JVM狀態

2.1 常用調優參數列表

  主要需要熟悉的是總存儲空間大小,各個區的比例設置,針對不同的區設定不同的回收器和回收算法。在默認情況下有些選項是不打開的,因此需要手動配置,并且根據自己應用的情況選擇適當的參數。

參數描述

–XX:+UseSerialGC

使用串行GC收集器

–XX:+UseParallelGC

 使用并行GC收集器

–XX:+UseParallelOldGC

使用parallel old收集器 

–XX:+UseConcMarkSweepGC
使用CMS收集器 
 -Xms 初始狀態堆大小
 -Xmx堆的最大大小
 -XX:MaxPermSize=n 設置Permanent區的大小
 -XX:NewSize=n 設置Young generation大小
-XX:NewRatio=n 設置年輕代和年老代的比值

 

 2.2 查看并分析GC日志

    對于應用程序,在eclipse中可以通過工程屬性增加VM屬性,將GC輸出保存為日志文件。

  

  GC輸出選項: 

  -XX:+PRintGC 輸出GC日志  -XX:+PrintGCDetails 輸出GC的詳細日志  -XX:+PrintGCTimeStamps 輸出GC的時間戳(以基準時間的形式)  -XX:+PrintGCDateStamps 輸出GC的時間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)  -XX:+PrintHeapAtGC 在進行GC的前后打印出堆的信息  -Xloggc:../logs/gc.log 日志文件的輸出路徑

  日志輸出形式:

Java HotSpot(TM) Client VM (25.45-b02) for windows-x86 JRE (1.8.0_45-b14), built on Apr 10 2015 10:46:40 by "java_re" with MS VC++ 10.0 (VS2010)Memory: 4k page, physical 2074576k(402044k free), swap 4149152k(1441572k free)CommandLine flags: -XX:InitialHeapSize=16777216 -XX:MaxHeapSize=268435456 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:-UseLargePagesIndividualAllocation Heap def new generation   total 4928K, used 885K [0x04600000, 0x04b50000, 0x09b50000)  eden space 4416K,  20% used [0x04600000, 0x046dd5f0, 0x04a50000)  from space 512K,   0% used [0x04a50000, 0x04a50000, 0x04ad0000)  to   space 512K,   0% used [0x04ad0000, 0x04ad0000, 0x04b50000) tenured generation   total 10944K, used 0K [0x09b50000, 0x0a600000, 0x14600000)   the space 10944K,   0% used [0x09b50000, 0x09b50000, 0x09b50200, 0x0a600000) Metaspace       used 98K, capacity 2242K, committed 2368K, reserved 4480K

 

  編寫了一個簡單的遞歸計算Fibbonaccy數列的程序,并在最后增加了一句System.gc()強制進行Full GC,得到的GC日志如下,回收后Eden區使用量為0。當服務器型的應用運行起來時,免不了會有多次GC,通過GC日志可以比較容易定位性能問題,比如full gc次數過多等。

{Heap before GC invocations=0 (full 0): def new generation   total 4928K, used 1522K [0x04600000, 0x04b50000, 0x09b50000)  eden space 4416K,  34% used [0x04600000, 0x0477c9e8, 0x04a50000)  from space 512K,   0% used [0x04a50000, 0x04a50000, 0x04ad0000)  to   space 512K,   0% used [0x04ad0000, 0x04ad0000, 0x04b50000) tenured generation   total 10944K, used 0K [0x09b50000, 0x0a600000, 0x14600000)   the space 10944K,   0% used [0x09b50000, 0x09b50000, 0x09b50200, 0x0a600000) Metaspace       used 259K, capacity 2280K, committed 2368K, reserved 4480K15.463: [Full GC (System.gc()) 15.477: [Tenured: 0K->776K(10944K), 0.0428098 secs] 1522K->776K(15872K), [Metaspace: 259K->259K(4480K)], 0.0688257 secs] [Times: user=0.02 sys=0.00, real=0.07 secs] Heap after GC invocations=1 (full 1): def new generation   total 4992K, used 0K [0x04600000, 0x04b60000, 0x09b50000)  eden space 4480K,   0% used [0x04600000, 0x04600000, 0x04a60000)  from space 512K,   0% used [0x04a60000, 0x04a60000, 0x04ae0000)  to   space 512K,   0% used [0x04ae0000, 0x04ae0000, 0x04b60000) tenured generation   total 10944K, used 776K [0x09b50000, 0x0a600000, 0x14600000)   the space 10944K,   7% used [0x09b50000, 0x09c122f0, 0x09c12400, 0x0a600000) Metaspace       used 259K, capacity 2280K, committed 2368K, reserved 4480K}Heap def new generation   total 4992K, used 45K [0x04600000, 0x04b60000, 0x09b50000)  eden space 4480K,   1% used [0x04600000, 0x0460b4a8, 0x04a60000)  from space 512K,   0% used [0x04a60000, 0x04a60000, 0x04ae0000)  to   space 512K,   0% used [0x04ae0000, 0x04ae0000, 0x04b60000) tenured generation   total 10944K, used 776K [0x09b50000, 0x0a600000, 0x14600000)   the space 10944K,   7% used [0x09b50000, 0x09c122f0, 0x09c12400, 0x0a600000) Metaspace       used 259K, capacity 2280K, committed 2368K, reserved 4480K

 

測試環境:

  JVM: Java HotSpot(TM) Client VM (25.60-b23, mixed mode, sharing)
  Java: version 1.8.0_60, vendor Oracle Corporation

Step1:

  監控界面,能夠直觀地看到JVM各個區域的內存使用情況。除了監視虛擬機,還可以監視應用的內存使用情況。嘗試對Eclipse的啟動進行優化,可以很明顯的看到eclipse啟動時,S0的對象向S1拷貝,而old區的使用量略微增加。

  

  還可以監控當前CPU和內存負載情況,類加載數量和線程數:

  

  

Step2:

  eclipse安裝目錄下有個.ini文件,即eclipse的配置文件,將需要的參數配置填寫進去即可。啟動eclipse后,查看GC日志,發現整個啟動過程中共發生了27次GC,其中有3次Full GC,整個啟動過程,我掐指一算大概6~7秒,相當慢了。

  通過參數-XX:NewSize=n 將Eden區重設為128m后,再次啟動eclipse發現,這次就只發生了11次GC,下降了一般還多,啟動速度也明顯比原來快了一些。

Step3:  

  接著使用-Xverify:none禁掉類加載時的字節碼驗證過程,GC次數為10次,現在啟動速度基本為3秒多左右,比原來快了一倍。

 

{Heap before GC invocations=10 (full 4): def new generation   total 36864K, used 35041K [0x04400000, 0x06bf0000, 0x0eea0000)  eden space 32832K, 100% used [0x04400000, 0x06410000, 0x06410000)  from space 4032K,  54% used [0x06410000, 0x06638570, 0x06800000)  to   space 4032K,   0% used [0x06800000, 0x06800000, 0x06bf0000) tenured generation   total 57224K, used 40267K [0x0eea0000, 0x12682000, 0x24400000)   the space 57224K,  70% used [0x0eea0000, 0x115f2ca0, 0x115f2e00, 0x12682000) Metaspace       used 31836K, capacity 33329K, committed 33408K, reserved 34176K5.742: [GC (Allocation Failure) 5.742: [DefNew: 35041K->4031K(36864K), 0.0193873 secs] 75308K->46613K(94088K), 0.0194649 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] 

 

  然而這種調優粒度太粗,服務器上程序需要定位更精確的時間,所以需要更多參數來調試。

  先寫到這里吧。  

  玄不救非,氪不改命。

 

Reference

  1.http://timyang.net/java/java_gc_tunning/

  2.ImportNew

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲亚裔videos黑人hd| 国产在线播放91| 久久久久久亚洲| 国产精品久久久久久久久久小说| 久久久久久尹人网香蕉| 欧洲亚洲妇女av| www.国产精品一二区| 亚洲变态欧美另类捆绑| 久热国产精品视频| 国产主播精品在线| 一区二区亚洲欧洲国产日韩| 亚洲国产精品美女| 一二美女精品欧洲| 日韩亚洲国产中文字幕| 91香蕉电影院| 欧美在线视频在线播放完整版免费观看| 亚洲男人av电影| 永久免费毛片在线播放不卡| 久久精品国产91精品亚洲| 91国内产香蕉| 亚洲精品免费网站| 亚洲精品xxxx| 亚洲欧美资源在线| 亚洲自拍高清视频网站| 欧美日韩视频在线| 亚洲xxxx3d| 亚洲电影免费观看| 亚洲一区二区国产| 日韩中文字幕在线| 国产成人精品a视频一区www| 国产日韩欧美视频| 日韩精品免费在线视频| 亚洲色图综合网| 亚洲黄色av女优在线观看| 中文字幕精品www乱入免费视频| 亚洲精品成a人在线观看| 国产精品久久久久久五月尺| 亚洲视频视频在线| 久久久www成人免费精品张筱雨| 亚洲国产又黄又爽女人高潮的| 亚洲欧美另类国产| 久久久久久久久综合| 亚洲国产第一页| 亚洲色图17p| 精品一区二区三区四区在线| 亚洲国产精品99| 久久免费精品日本久久中文字幕| 欧美成人黑人xx视频免费观看| 国产日韩精品在线播放| 久久人人爽亚洲精品天堂| 91系列在线观看| 国产97在线亚洲| 国产日韩精品视频| 亚洲无限乱码一二三四麻| 国产精品日韩在线观看| 久久精品国产2020观看福利| 国产精品一区二区久久久久| 大胆人体色综合| 91精品国产乱码久久久久久久久| 在线视频亚洲欧美| 欧美一区二区三区免费观看| 久久久久久美女| 日韩视频免费中文字幕| 亚洲第一精品电影| 九九精品在线视频| 国产91在线播放九色快色| 丝袜亚洲另类欧美重口| 欧美视频在线观看免费| 欧美激情精品在线| 久久久久久网站| 日韩少妇与小伙激情| 国产成人午夜视频网址| 日韩大陆毛片av| 日本亚洲欧美成人| 久久久久久久999精品视频| 日韩视频免费大全中文字幕| 一本色道久久综合狠狠躁篇的优点| 国产成人自拍视频在线观看| 亚洲香蕉成人av网站在线观看| 欧美色videos| 亚洲精品动漫100p| 欧美日韩中国免费专区在线看| 精品久久久久久久久久久久久久| 久久久久久久久久久免费精品| 国产精品美女999| 91久久中文字幕| 欧美在线观看一区二区三区| 亚洲精品国产精品久久清纯直播| 欧美日韩一区二区精品| 欧美孕妇孕交黑巨大网站| 亚洲一区二区三区视频播放| 日韩精品中文字幕有码专区| 97视频网站入口| 尤物99国产成人精品视频| 2021国产精品视频| 亚洲va电影大全| 日韩亚洲第一页| 91在线精品视频| 久久视频在线看| 欧美乱大交xxxxx另类电影| 欧美专区中文字幕| 国产成人啪精品视频免费网| 永久555www成人免费| 一区二区亚洲精品国产| 日韩精品高清视频| 成人xvideos免费视频| 国内精品模特av私拍在线观看| 国产suv精品一区二区三区88区| 国产69精品久久久久久| 欧美日韩一区二区三区| 成人免费网站在线观看| 亚洲国产婷婷香蕉久久久久久| 国产精品大陆在线观看| 国产精品爱啪在线线免费观看| 日本欧美黄网站| 日韩在线视频免费观看| 91影视免费在线观看| 日韩有码视频在线| 亚洲精品国产精品自产a区红杏吧| 欧美日韩另类视频| 日韩欧美精品中文字幕| 久久久久九九九九| 久久人人爽人人爽人人片av高清| 日韩精品在线视频美女| 欧美一区第一页| 欧美日韩中文字幕综合视频| 亚洲美女福利视频网站| 91精品视频播放| 亚洲欧美综合区自拍另类| 午夜精品理论片| 国产精品久久久久9999| 国产精品自产拍在线观看| 亚洲人成欧美中文字幕| 亚洲美女动态图120秒| 国产精品久在线观看| 日韩在线视频导航| 欧美日韩亚洲天堂| 国产精品视频永久免费播放| 成人美女av在线直播| 97在线看免费观看视频在线观看| 精品中文字幕久久久久久| 欧美日韩国产丝袜美女| 亚洲高清av在线| 91性高湖久久久久久久久_久久99| 国产福利精品在线| 亚洲自拍小视频免费观看| 日韩在线观看成人| 一本一本久久a久久精品牛牛影视| 国产精品1区2区在线观看| 琪琪第一精品导航| 亚洲欧美在线磁力| 日韩亚洲欧美中文高清在线| 国产精品成av人在线视午夜片| 国产精品毛片a∨一区二区三区|国| 国产精品91在线观看| 欧美激情一区二区三区成人| 日韩精品视频在线免费观看| 日本道色综合久久影院| 一区二区亚洲欧洲国产日韩| 亚洲国产精品网站| 日韩精品免费一线在线观看| 91tv亚洲精品香蕉国产一区7ujn| 久久精品在线播放| 欧美做爰性生交视频|