JVM是Java程序的運(yùn)行環(huán)境,因此對于JVM的掌握有助于理解Java程序的執(zhí)行以及編寫,尤其是運(yùn)行時(shí)碰到的一些詭異問題,那么怎么樣能考察自己對于JVM關(guān)鍵知識(shí)點(diǎn)的掌握情況,幫助學(xué)習(xí)JVM機(jī)制呢,在這篇blog中來探討下。
對于Java程序而言,JVM的關(guān)鍵機(jī)制有:字節(jié)碼的加載、方法的執(zhí)行、對象內(nèi)存的分配和回收、線程和鎖機(jī)制,這幾個(gè)機(jī)制涉及到的jvm的知識(shí)點(diǎn)遠(yuǎn)沒有寫這幾個(gè)字這么簡單,里面的復(fù)雜度還是非常高的。 字節(jié)碼的加載 JVM通過ClassLoader來完成字節(jié)碼的動(dòng)態(tài)加載,這里面涉及到的主要是ClassLoader的雙親委派、ClassLoader的編寫方法、Class是否被加載的唯一標(biāo)識(shí)以及Class的加載過程。 在考察的時(shí)候我覺得可以以這么兩道簡單的題來考察: 1、寫一段將目錄中指定的.class文件加載到JVM的程序,并通過Class對象獲取到完整類名等信息; 2、一段展示代碼,里面包含一個(gè)全局靜態(tài)整型變量,問如果用兩個(gè)ClassLoader加載此對象,執(zhí)行這個(gè)整型變量++操作后結(jié)果會(huì)是怎么樣的? 方法的執(zhí)行 JVM有自己的一套指令系統(tǒng),字節(jié)碼中即已經(jīng)是指令了,需要大概掌握了JVM對static、interface、instance、構(gòu)造器采用的不同的執(zhí)行方法,另外就是JVM中反射的實(shí)現(xiàn)(可以以Sun JDK來舉例)、動(dòng)態(tài)代理的實(shí)現(xiàn),最后相關(guān)的就是JVM執(zhí)行字節(jié)碼的方式(解釋、JIT、Hotspot),以及什么時(shí)候觸發(fā)編譯成機(jī)器碼,如何控制。 在考察的時(shí)候我覺得可以以這么三道題來考察: 1、A a=new A();a.execute();和IA a=new A();a.execute();執(zhí)行有什么不同; 2、反射的性能低的原因是? 3、編寫一段程序,動(dòng)態(tài)的創(chuàng)建一個(gè)接口的實(shí)現(xiàn),并加載到JVM中執(zhí)行;(可以允許用BCEL等工具) 對象內(nèi)存的分配和回收 這塊涉及的知識(shí)點(diǎn)也是比較的多,例如JVM內(nèi)存區(qū)域的劃分、自然類型和引用類型的內(nèi)存分配的不同、TLAB、GC的算法、Sun JDK對于GC的實(shí)現(xiàn)、GC觸發(fā)的時(shí)機(jī)、GC的跟蹤和分析的方法。 在考察的時(shí)候我覺得可以以這么三道題來考察: 1、經(jīng)典的String比較程序題: String a="a"; String b="b"; String ab="ab"; (a+b)==ab; ?? (引深題,如何才能讓(a+b)==ab) ("a"+"b")==ab; ?? 2、寫一段程序,讓其OutOfMemory,或頻繁執(zhí)行Minor GC,但又不觸發(fā)Full GC,又或頻繁執(zhí)行Full GC,但不執(zhí)行minor GC,而且不OutOfMemory,甚至可以是控制幾次Minor GC后發(fā)生一次Full GC; 3、詳細(xì)講解GC的實(shí)現(xiàn),例如minor GC的時(shí)候?qū)е率窃趺椿厥諏ο髢?nèi)存的,F(xiàn)ull GC的時(shí)候是怎么回收對象內(nèi)存的。 線程和鎖機(jī)制 這塊涉及的知識(shí)點(diǎn)仍然是非常的多,例如線程中變量的操作機(jī)制、線程調(diào)度機(jī)制、線程的狀態(tài)以及控制方法、線程的跟蹤和分析方法、同步關(guān)鍵字、lock/unlock的原理等。 在考察的時(shí)候我覺得可以以這么幾道題考察下: 1、i++的執(zhí)行過程; 2、一個(gè)線程需要等待另外一個(gè)線程將某變量置為true才繼續(xù)執(zhí)行,如何編寫這段程序,或者如何控制多個(gè)線程共同啟動(dòng)等; 3、控制線程狀態(tài)的轉(zhuǎn)換的方法,或者給幾個(gè)thread dump,分析下哪個(gè)線程有問題,問題出在哪; 4、static屬性加鎖、全局變量屬性加鎖、方法加鎖的不同點(diǎn)? |
|