JDK8 JVM性能優化-1

原文地址:https://blog.csdn.net/xingkongtianma01/article/details/80689928java

 

大 多數狀況下,咱們並不須要關心JVM的底層,可是若是瞭解它的話,對於咱們系統調優是很是有用的,在這裏面瞭解JVM的GC原理,是很是重要的一塊知識。 咱們都知道對於一個大型網站,若是JVM頻繁發生FULL GC,那麼將會是致命的危險,不只僅會形成網站響應遲鈍,更嚴重的時候會致使系統崩潰,這對用戶體驗來說,都是咱們不肯意看到的。 

在JVM裏的內存空間,從大的層面劃分,主要有新生代空間(Young)和老年代空間(Old),其中Young空間,又被分爲2個部分和3個板塊,分別是1個Egen區,和2個Survivor區,看下圖: 安全

OK,下面來具體看下,每部分都是幹啥的 
(1)Eden區域是用來存放使用new或者newInstance等方式建立的對象,默認都是存放在Eden區,除非這個對象太大,或者超過了設定的閾值-XX:PretenureSizeThresold,這樣的對象會被直接分配到Old區域。 

(2)2個Survivor(倖存)區,通常稱S0,S1,理論上他們是同樣大的,解釋一下,他們是如何工做的: 
在不斷建立對象的過程當中,Eden區會滿,這時候會開始作Young G也叫Minor GC,而Young空間的第一次GC就是找出Eden區中,倖存活着的對象,而後將這些對象,放到S0,或S1區中的其中一個, 假設第一次選擇了S0,它會逐步將活着的對象拷貝到S0區域,可是若是S0區域滿了,剩下活着的對象只能放old區域了,接下來要作的是,將Eden區域 清空,此時時候S1區域也是空的。 

當第二次Eden區域滿的時候,就將Eden區域中活着的對象+S0區域中活着的對象,遷移到S1中,若是S1放不下,就會將剩下的部門,放到Old區域中,只是此次對象來源區域增長了S0,最後會將Eden區+S0區域,清空 

第三次和第四次依次類推,始終保證S0和S1有一個是空的,用來存儲臨時對象,用於交換空間的目的,反反覆覆屢次沒有被淘汰的對象,將會放入old區域中,默認是15次。具體的交換過程就和上圖中的信息類似。 




問題一:怎麼定義活着的對象? 
從根引用開始,對象的內部屬性可能也是引用,只要能級聯到的都被認爲是活着的對象 

問題二:什麼是根? 
本地變量引用,操做數棧引用,PC寄存器,本地方法棧引用等這些都是根。 

問題三:對象進入Old區域有什麼壞處? 
old區域通常稱爲老年代,老年代與新生代不同,年輕代,咱們能夠認爲存活下來的對象不多,而老年代則相反,存活下來的對象不少,因此JVM的 堆內存,纔是咱們一般關注的主戰場,由於這裏面活着的對象很是多,因此發生一次FULL GC,來找出來全部存活的對象是很是耗時的,所以,咱們應該儘可能避免FULL GC的發生。 

問題四:S0和S1通常多大,靠什麼參數來控制,有什麼變化? 

通常來講很小,咱們大概知道它與Young差很少相差一倍的比例,設置的的參數主要有兩個: 
-XX:SurvivorRatio=8 
-XX:InitialSurvivorRatio=8 

第一個參數是Eden和Survivor區域比重,注意是一個Survivor的的大小,若是將其設置爲8,則說明Eden區是一個Survivor區的8倍,換句話說S0或S1空間是整個Young空間的1/10,剩餘的80%由Eden區域來使用。 

第二個參數是Young/S0的比值,當其設置爲8時,表示s0或s1佔整個Young空間的12.5%。 


問題五;一個對象每次Minor Gc時,活着的對象都會在s0和s1區域轉移,通過通過Minor GC多少次後,會進入Old區域呢? 

默認是15次,參數設置-XX:MaxTenuringThreshold=15,計數器會在對象的頭部記錄它交換的次數 


問題六:爲何發生FULL GC會帶來很大的危害? 

在發生FULL GC的時候,意味着JVM會安全的暫停全部正在執行的線程(Stop The World),來回收內存空間,在這個時間段內,全部除了回收垃圾的線程外,其餘有關JAVA的程序,代碼都會靜止,反映到系統上,就會出現系統響應大幅度變慢,卡機等狀態。 

舉個通俗易懂點的例子,就是在一個房間裏,若是有一我的,不停的扔垃圾,而後有一個清潔工不停掃垃圾,這時候,咱們的系統是OK的,由於基本不會 出現垃圾堆滿房間的情景,並且由於清潔工能夠對付過來,假設如今有10我的不停扔垃圾,那麼就房間就會很快被堆滿,這時候清潔工,因爲工做不過來了,大聲 吼一聲,大家都暫停3分鐘,別再扔了,我先把這個房間打掃完,大家才能夠扔。 
在這個場景中,一我的扔,一我的掃,就相似於Minor GC,這時候,並不會影響扔垃圾的人,而後一旦10我的同時仍,並且很快就沒地方仍了,這時候,就會觸發Full GC,而後JVM下令,大家暫時都別仍了,等我何時回收完垃圾了,大家在仍,如今你們清楚了吧,所謂的10我的,就是相似咱們成千上百的java類, 在不停的執行任務,所謂的清潔工,就是咱們的GC機制,因此,你們在平時編碼的時候,必定注意儘可能少造點垃圾對象,這樣觸發FULL GC的概率,纔會變小。網站

相關文章
相關標籤/搜索