1. 程式人生 > >JVM堆大小的調整

JVM堆大小的調整

Sun HotSpot 1.4.1使用分代收集器,它把堆分為三個主要的域:新域、舊域以及永久域。Jvm生成的所有新物件放在新域中。一旦物件經歷了一定數量的垃圾收集迴圈後,便獲得使用期並進入舊域。在永久域中jvm則儲存class和method物件。就配置而言,永久域是一個獨立域並且不認為是堆的一部分。
  這裡寫圖片描述

  • 可使用-Xms和-Xmx 控制整個堆的原始大小或最大值。
  • 為控制新域的大小,可使用-XX:NewRatio設定新域在堆中所佔的比例。
    下面的命令把整個堆設定成128m,新域比率設定成3,即新域與舊域比例為1:3,新域為堆的1/4或32M:
–Xms128m 
–Xmx128m
–XX:NewRatio 
=3
  • 可使用-XX:NewSize和-XX:MaxNewsize設定新域的初始值和最大值。
    下面的命令把新域的初始值和最大值設定成64m:
–Xms256m 
–Xmx256m 
–Xmn64m
  • 永久域預設大小為4m。執行程式時,jvm會調整永久域的大小以滿足需要。每次調整時,jvm會對堆進行一次完全的垃圾收集。
    使用-XX:MaxPerSize標誌來增加永久域搭大小。在WebLogic Server應用程式載入較多類時,經常需要增加永久域的最大值。當jvm載入類時,永久域中的物件急劇增加,從而使jvm不斷調整永久域大小。為了避免調整,可使用-XX:PerSize標誌設定初始值。
    下面把永久域初始值設定成32m,最大值設定成64m。
-Xms512m 
-Xmx512m 
-XX:PermSize=32m 
-XX:MaxPermSize=64m
  • 預設狀態下,HotSpot在新域中使用複製收集器。該域一般分為三個部分。第一部分為Eden,用於生成新的物件。另兩部分稱為救助空間,當Eden充滿時,收集器停止應用程式,把所有可到達物件複製到當前的from救助空間,一旦當前的from救助空間充滿,收集器則把可到達物件複製到當前的to救助空間。From和to救助空間互換角色。維持活動的物件將在救助空間不斷複製,直到它們獲得使用期並轉入舊域。使用-XX:SurvivorRatio可控制新域子空間的大小。
    同NewRation一樣,SurvivorRation規定某救助域與Eden空間的比值。比如,以下命令把新域設定成64m,Eden佔32m,每個救助域各佔16m:
-Xms256m 
-Xmx256m 
-Xmn64m 
-XX:SurvivorRation =2
  • 如前所述,預設狀態下HotSpot對新域使用複製收集器,對舊域使用標記-清除-壓縮收集器。在新域中使用複製收集器有很多意義,因為應用程式生成的大部分物件是短壽命的。理想狀態下,所有過渡物件在移出Eden空間時將被收集。如果能夠這樣的話,並且移出Eden空間的物件是長壽命的,那麼理論上可以立即把它們移進舊域,避免在救助空間反覆複製。但是,應用程式不能適合這種理想狀態,因為它們有一小部分中長壽命的物件。最好是保持這些中長壽命的物件並放在新域中,因為複製小部分的物件總比壓縮舊域廉價。為控制新域中物件的複製,可用-XX:TargetSurvivorRatio控制救助空間的比例(該值是設定救助空間的使用比例。如救助空間位1M,該值50表示可用500K)。該值是一個百分比,預設值是50。當較大的堆疊使用較低的sruvivorratio時,應增加該值到80至90,以更好利用救助空間。用-XX:maxtenuringThreshold可控制上限。

    為放置所有的複製全部發生以及希望物件從eden擴充套件到舊域,可以把MaxTenuring Threshold設定成0。設定完成後,實際上就不再使用救助空間了,因此應把SurvivorRatio設成最大值以最大化Eden空間,設定如下:

“`
-XX:MaxTenuringThreshold=0
–XX:SurvivorRatio=50000