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