元空間
由于元數(shù)據(jù)空間大小的預(yù)測是件繁瑣且低效的工作,于是Java 8中干脆就去掉了持久代,轉(zhuǎn)而推出了元空間。從此以后,那些個(gè)雜七雜八的東西便都存儲(chǔ)到正常的Java堆了。
但是,類定義如今則是存儲(chǔ)到了元空間里。它存儲(chǔ)在本地內(nèi)存中,不會(huì)與堆 內(nèi)存相混雜。默認(rèn)情況下,元空間的大小只受限于Java進(jìn)程的可用本地內(nèi)存的大小。這大大解放了開發(fā)人員,他們不會(huì)再因?yàn)槎嘣黾恿艘粋€(gè)類而引發(fā) java.lang.OutOfMemoryError: Permgen space 異常了。值得注意的是,雖然看似元空間大小毫無限制了,但這一些并非是沒有代價(jià)的——如果任由元空間無節(jié)制地增長,你可能會(huì)面臨的是頻繁的內(nèi)存交換(swapping)或者是本地內(nèi)存分配失敗。
如果你希望避免此類情況,可以像下例中這樣限制一下元空間的大小,將它設(shè)置成比如256MB:
java -XX:MaxMetaspaceSize=256m com.mycompany.MyApplication
新生代GC(Minor GC) vs 老生代GC(Major GC) vs Full GC
清除堆內(nèi)存不同區(qū)域的垃圾回收事件又被稱為新生代GC,老生代GC,以及Full GC事件。本章我們將介紹一下不同事件的區(qū)別在哪里。不過你會(huì)發(fā)現(xiàn)其實(shí)各自的差別并不是那么重要。
重要的是我們希望知道應(yīng)用是否到達(dá)它的服務(wù)能力上限了,而這又只能去監(jiān)控應(yīng)用的處理延時(shí)或者吞吐量。只有在這個(gè)時(shí)間GC事件才能派上用場。這些事件的關(guān)鍵之處在于它們是否停止了應(yīng)用的運(yùn)行,以及停了多久。
不過由于新生代GC,老生代GC,F(xiàn)ull GC這幾個(gè)術(shù)語被廣泛使用卻又沒有一個(gè)清晰的定義,我們還是先來詳細(xì)地介紹一下它們的區(qū)別再說吧。
新生代GC
新生代垃圾的回收被稱作