垃圾回收基礎

jvm系列java

一、性能屬性:

(1)吞吐量:不考慮垃圾收集引發的停頓時間或內存消耗,垃圾收集器能支撐應用程序達到的最高性能指標
(2)延遲:縮短因爲垃圾收集引發的停頓時間或徹底消除垃圾收集所引發的停頓,避免應用程序運行時發生抖動
(3)內存:垃圾收集器流暢運行所須要的內存數量

任何一個屬性性能的提供幾乎都是以另一個或兩個屬性性能的損失做爲代價的。

二、原則:

(1)MinorGC回收原則:每次MinorGC儘量多地收集垃圾對象
(2)GC內存最大化原則:java堆空間越大,垃圾收集的效果就越好
(3)GC調優3選2原則:吞吐量、延遲、內存任意選擇兩個進行調優

推薦的GC日誌參數
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-Xloggc:<filename>

-XX:+PrintGCDateStamps
-XX:+PrintGCApplicationStoppedTime (安全點阻塞代碼的時間)
-XX:+PrintGCApplicationConcurrentTime (應用某段時間段的響應時間)
-XX:+PrintSafepointStatistics (區分垃圾收集安全點與其餘安全點)

三、內存佔用

活躍數據的大小是肯定運行應用程序所需java堆大小的不錯切入點,它也決定了咱們是否須要從新回顧應用程序的內存佔用需求、或者是否須要修改應用程序以知足內存佔用需求。
活躍數據的大小是指應用程序穩定運行時長期存活對象所佔用的java堆內存量,換句話說,它是應用程序運行於穩定態時,FullGC以後java堆所佔用的空間大小。

(1)堆大小
-Xms與-Xmx設定爲同一個值,這是由於不管擴展仍是縮減新生代空間或年老代空間都須要進行FullGC,而FullGC會下降程序的吞吐量並致使更長的延遲。

(2)新生代大小
-XX:NewSize=[g|m|k]設置新生代最小值,同時應該指定其最大值-XX:MaxNewSize=[g|m|k]

-Xmn:[g|m|k],設置新生代的「固定空間」/初始值,若是Xms和Xmx沒有設置爲同一個值時,堆空間擴展或收縮時,新生代大小是不會隨着調整的,是固定的,只有Xms和Xmx是同一個值得時候,才使用Xmn選項。

(3)年老代大小
年老代空間的大小初始值爲-Xmx減去-XX:NewSize,最小值爲-Xmx減去-XX:MaxNewSize
若是使用了-Xmn,則年老代的大小爲-Xmx減去-Xmn

(4)永久代大小
-XX:PermSize=[g|m|k],永久代空間的初始值和最小值
-XX:MaxPermSize=[g|m|k],永久代空間的最大值
關注性能的java應用程序應該將-XX:PermSize和-XX:MaxPermSize設置爲同一個值,由於永久代空間的大小調整須要進行FullGC才能實現。

新生代、年老代和永久代這三個空間中的任何一個不能知足內存分配請求時,就會發生垃圾收集,理解這一點很是重要,換句話說,這三個空間中任何一個被用盡,同時又有新的空間請求沒法知足時就會觸發垃圾收集。新生代沒有足夠的空間知足java對象分配請求時,hotspot會進行MinorGC以釋放空間,MinorGC相對FullGC而言,持續的時間要短。

經歷過幾回MinorGC以後仍然活躍的對象最終會被提高到年老代,年老代不足以容納新提高的對象時,hotspot vm就會進行FullGC。實際上,當hotspot vm發現當前可用空間不足以容納下一次MinorGC提高的對象時就會促發FullGC。與因空間問題致使的MinorGC過程當中對象提高失敗比起來,這種方式的代價要小不少,從失敗的對象提高中恢復是一個很昂貴的操做。
永久代沒有足夠的空間存儲新的VM或類元數據時也會觸發FullGC

若是FullGC緣於年老代空間已經滿,即便永久代空間沒有用盡,年老代和永久代都會進行垃圾收集,一樣,若是FullGC是由永久代空間不夠引發的,年老代和永久代都會進行垃圾收集,不論年老代是否還有空閒空間。

若是使用的-XX:+UseParallelGC或-XX:+UseParallelOldGC,若是關閉-XX:-ScavengeBeforeFullGC,則hotspot在FullGC以前不會進行MinorGC,但FullGC時仍然會收集新生代,若是開啓這個選項,則在FullGC以前老是先作一次MinorGC,分擔一部分FullGC本來要作的工做。

相關文章
相關標籤/搜索