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