JVM知識點題目

          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屬性加鎖、全局變量屬性加鎖、方法加鎖的不同點?

          posted on 2009-03-27 14:30 BlueDavy 閱讀(9519) 評論(9)  編輯  收藏 所屬分類: Java

          評論

          # re: JVM知識點題目 2009-03-27 15:28 flyisland

          希望不是你當面試官,哈  回復  更多評論   

          # re: JVM知識點題目 2009-03-27 16:05 云襄

          JVM的東西的確比較復雜  回復  更多評論   

          # re: JVM知識點題目 2009-03-27 19:27 問問

          都不是很懂,什么時候貼答案啊?  回復  更多評論   

          # re: JVM知識點題目[未登錄] 2009-03-27 20:15 逝水fox

          看了問題 很想知道答案 看書去咯  回復  更多評論   

          # re: JVM知識點題目[未登錄] 2009-03-28 15:55 kimi

          關于ClassLoader的兩個問題
          第一個題目把文件系統中的.class文件讀到一個bute數組中,使用ClassLoader的defineClass方法把這個byte數組傳遞給jvm,則返回一個Class對象,通過這個Class對象可以做關于一個對象的任何事情,但defineClass方法是protected的,所以要寫一個ClassLoader的子類,也就是實現一個自己的ClassLoader。

          第二個題目由于Java中ClassLoader本質上是定義了一個Class的集合,而且ClassLoader之間是項目隔離的,除非它們之間是父子關系,但即使這樣,只能是子ClassLoader能看到父ClassLoader定義的Class,父ClassLoader看不到子ClassLoader定義的Class,所以使用一個ClassLoader加載的類的靜態變量執行++操作,對另一個ClassLoader加載的對象的靜態變量是沒有影響的。

          班門弄斧了,還請博主指正我的回答是否正確。  回復  更多評論   

          # re: JVM知識點題目 2009-05-24 01:51 ttt

          老大,給個答案啊,別變成炫耀貼了。  回復  更多評論   

          # re: JVM知識點題目 2011-12-31 14:33 whwang

          這題太狠了:
          3、編寫一段程序,動態的創建一個接口的實現,并加載到JVM中執行;(可以允許用BCEL等工具)
            回復  更多評論   

          # re: JVM知識點題目 2012-01-02 00:23 斌斌

          將目錄里的*.class filter出來,getName一個個來  回復  更多評論   

          # re: JVM知識點題目 2012-08-10 17:04 jb

          1.1 findclass
          1.2 不同classloader加載的class是不同的class,其實包名與文件名都相同

          2.3用asm 框架 writeclass  回復  更多評論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導航

          <2009年3月>
          22232425262728
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          統計

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 绥江县| 昌宁县| 彭阳县| 大关县| 和平区| 靖安县| 绥芬河市| 石楼县| 会理县| 成武县| 微博| 桂东县| 博湖县| 辽源市| 莱西市| 三台县| 鹤峰县| 渝中区| 平罗县| 鄂托克前旗| 同德县| 青海省| 张掖市| 若羌县| 马尔康县| 习水县| 会理县| 上蔡县| 宝应县| 宽甸| 资阳市| 松原市| 裕民县| 舞钢市| 承德县| 海阳市| 定边县| 大石桥市| 年辖:市辖区| 徐州市| 武陟县|