日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

jvm 调优_Java架构—JVM调优

發布時間:2024/1/23 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jvm 调优_Java架构—JVM调优 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 常用調優參數列表

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

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 日志文件的輸出路徑

  日志輸出形式:

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

測試環境:

  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秒多左右,比原來快了一倍。

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

  先寫到這里吧。

喜歡的朋友可以轉發關注,謝謝啦!!!

總結

以上是生活随笔為你收集整理的jvm 调优_Java架构—JVM调优的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。