正常情況下,一個(gè)對(duì)象從創(chuàng)建到銷毀,應(yīng)該是從Eden,然后到Survivor Spaces(幸存區(qū)),再到Old Generation(年老代),后在某次GC下消失。
當(dāng)然,一個(gè)對(duì)象也可能直接在Eden里死掉,也可能一直在Old Generation(年老代)存活,這些都是有可能的。
關(guān)于內(nèi)存劃分,可以自己沒(méi)事用內(nèi)存分析工具看看,比如jmap、jvisualvm等等,觀察一下各個(gè)區(qū)域的內(nèi)存變化,結(jié)合實(shí)際去了解一下。
關(guān)于classloader機(jī)制的學(xué)習(xí),可以結(jié)合tomcat去學(xué)習(xí),了解清楚tomcat的classloader機(jī)制,看tomcat是如何保證各個(gè)APP之間的類隔離的。如果可能的話,看一下tomcat中classloader的源碼,或者看一下LZ的一個(gè)開(kāi)源項(xiàng)目niubi-job,當(dāng)中也包含了與tomcat類加載機(jī)制相似的部分。
至于GC,需要清楚GC Roots都有哪些,以及如何判斷一個(gè)對(duì)象可以被回收。此外,GC的算法和策略也要有大概的了解。
3)并發(fā)知識(shí)與concurrent包
要想進(jìn)入一線互聯(lián)網(wǎng)公司,這部分內(nèi)容必須要會(huì),否則的話,你始終都只能停留在比較low的段位。
關(guān)于并發(fā)知識(shí),重要的兩個(gè)概念一定要搞清楚,那就是可見(jiàn)性和原子性。其中可見(jiàn)性與前面提到的volatile關(guān)鍵字是息息相關(guān)的,可見(jiàn)性只是并發(fā)領(lǐng)域里的一個(gè)概念,而volatile則是Java語(yǔ)言中,實(shí)實(shí)在在保證變量可見(jiàn)性的關(guān)鍵字。
前面說(shuō)了,要弄清楚可見(jiàn)性,就需要搞清楚主存和工作內(nèi)存。關(guān)于主存和工作內(nèi)存,其實(shí)又屬于JVM的知識(shí)范疇。所以從這里就可以看出來(lái),知識(shí)都是有關(guān)聯(lián)性的。
原子性其實(shí)相對(duì)于可見(jiàn)性來(lái)說(shuō),反倒更好理解一些,相信那個(gè)萬(wàn)年不變的銀行匯款的關(guān)于事務(wù)的例子,就足以大部分人理解原子性這個(gè)概念了,它其實(shí)就是一個(gè)或多個(gè)操作,被視作一個(gè)整體的意思。
有了并發(fā)的基礎(chǔ)知識(shí)以后,你就需要研究一下concurrent包了。這里面的東西其實(shí)是一個(gè)寶藏,一旦你需要寫并發(fā)相關(guān)的功能,你會(huì)發(fā)現(xiàn)這里面的東西非常實(shí)用。
其中ConcurrentHashMap是面試容易被問(wèn)到的一個(gè)類,幾乎所有的面試都會(huì)問(wèn)你,ConcurrentHashMap和普通的同步HashMap有什么區(qū)別。
這個(gè)問(wèn)題其實(shí)需要你知道兩個(gè)知識(shí)就可以了,一個(gè)是HashMap的數(shù)據(jù)結(jié)構(gòu),一個(gè)是鎖分段的技術(shù),具體的LZ這里就不解釋了,大家自己下去找相關(guān)資料看吧。
此外,concurrent包里有一個(gè)非常重要的類,叫做AbstractQueuedSynchronizer,幾乎所有的concurrent包內(nèi)的并發(fā)工具類,都是基于這個(gè)抽象類擴(kuò)展出來(lái)的。因此,把AbstractQueuedSynchronizer這個(gè)類研究透徹,非常有助于你理解concurrent包。
后一點(diǎn),面試的時(shí)候還經(jīng)常會(huì)被問(wèn)到的一個(gè)問(wèn)題,就是ReentrantLock和synchronized關(guān)鍵字有什么區(qū)別。
未完待續(xù)。。。。。。