Permanet Generation(持久代)空間滿
PermanetGeneration中存放的為一些class的信息等,當(dāng)系統(tǒng)中要加載的類、反射的類和調(diào)用的方法較多時(shí),Permanet Generation可能會被占滿,在未配置為采用CMS GC的情況下會執(zhí)行Full GC。如果經(jīng)過Full GC仍然回收不了,那么JVM會拋出如下錯誤信息:
java.lang.OutOfMemoryError:PermGen space為避免Perm Gen占滿造成Full GC現(xiàn)象,可采用的方法為增大Perm Gen空間或轉(zhuǎn)為使用CMS GC。
CMS GC時(shí)出現(xiàn)promotion failed和concurrent mode failure
對于采用CMS進(jìn)行舊生代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure兩種狀況,當(dāng)這兩種狀況出現(xiàn)時(shí)可能會觸發(fā)Full GC。
promotion failed是在進(jìn)行Minor GC時(shí),survivor space放不下、對象只能放入舊生代,而此時(shí)舊生代也放不下造成的;concurrent mode failure是在執(zhí)行CMS GC的過程中同時(shí)有對象要放入舊生代,而此時(shí)舊生代空間不足造成的。
應(yīng)對措施為:增大survivorspace、舊生代空間或調(diào)低觸發(fā)并發(fā)GC的比率,但在JDK 5.0+、6.0+的版本中有可能會由于JDK的bug29導(dǎo)致CMS在remark完畢后很久才觸發(fā)sweeping動作。對于這種狀況,可通過設(shè)置
-XX:CMSMaxAbortablePrecleanTime=5(單位為ms)來避免。
統(tǒng)計(jì)得到的Minor GC晉升到舊生代的平均大小大于舊生代的剩余空間
這是一個較為復(fù)雜的觸發(fā)情況,Hotspot為了避免由于新生代對象晉升到舊生代導(dǎo)致舊生代空間不足的現(xiàn)象,在進(jìn)行Minor GC時(shí),做了一個判斷,如果之前統(tǒng)計(jì)所得到的Minor GC晉升到舊生代的平均大小大于舊生代的剩余空間,那么就直接觸發(fā)Full GC。
例如程序第一次觸發(fā)MinorGC后,有6MB的對象晉升到舊生代,那么當(dāng)下一次Minor GC發(fā)生時(shí),首先檢查舊生代的剩余空間是否大于6MB,如果小于6MB,則執(zhí)行Full GC。
當(dāng)新生代采用PS GC時(shí),方式稍有不同,PS GC是在Minor GC后也會檢查,例如上面的例子中第一次Minor GC后,PS GC會檢查此時(shí)舊生代的剩余空間是否大于6MB,如小于,則觸發(fā)對舊生代的回收。
除了以上4種狀況外,對于使用RMI來進(jìn)行RPC或管理的Sun JDK應(yīng)用而言,默認(rèn)情況下會一小時(shí)執(zhí)行一次Full GC。可通過在啟動時(shí)通過
-java-Dsun.rmi.dgc.client.gcInterval=3600000
來設(shè)置Full GC執(zhí)行的間隔時(shí)間或通過-XX:+DisableExplicitGC來禁止RMI調(diào)用System.gc。
死鎖
產(chǎn)生死鎖的原因主要是:
(1)因?yàn)橄到y(tǒng)資源不足。
(2)進(jìn)程運(yùn)行推進(jìn)的順序不合適。
(3)資源分配不當(dāng)?shù)取?/p>
如果系統(tǒng)資源充足,進(jìn)程的資源請求都能夠得到滿足,死鎖出現(xiàn)的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。其次,進(jìn)程運(yùn)行推進(jìn)順序與速度不同,也可能產(chǎn)生死鎖。
產(chǎn)生死鎖的四個必要條件:
(1)互斥條件:一個資源每次只能被一個進(jìn)程使用。
(2)請求與保持條件:一個進(jìn)程因請求資源而阻塞時(shí),對已獲得的資源保持不放。
(3)不剝奪條件:進(jìn)程已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪。
(4)循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。
這四個條件是死鎖的必要條件,只要系統(tǒng)發(fā)生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發(fā)生死鎖。
死鎖的解除與預(yù)防:
理解了死鎖的原因,尤其是產(chǎn)生死鎖的四個必要條件,就可以最大可能地避免、預(yù)防和解除死鎖。所以,在系統(tǒng)設(shè)計(jì)、進(jìn)程調(diào)度等方面注意如何不讓這四個必要條件成立,如何確定資源的合理分配算法,避免進(jìn)程永久占據(jù)系統(tǒng)資源。此外,也要防止進(jìn)程在處于等待狀態(tài)情況下占用資源。因此,對資源的分配要給予合理的規(guī)劃。
以上就是北大青鳥長沙麓谷校區(qū)java培訓(xùn)機(jī)構(gòu)的小編針對“Java面試筆試題必考總結(jié)”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
Java面試題