JVM知識(shí)點(diǎn)題目

          JVM是Java程序的運(yùn)行環(huán)境,因此對(duì)于JVM的掌握有助于理解Java程序的執(zhí)行以及編寫,尤其是運(yùn)行時(shí)碰到的一些詭異問題,那么怎么樣能考察自己對(duì)于JVM關(guān)鍵知識(shí)點(diǎn)的掌握情況,幫助學(xué)習(xí)JVM機(jī)制呢,在這篇blog中來探討下。

          對(duì)于Java程序而言,JVM的關(guān)鍵機(jī)制有:字節(jié)碼的加載、方法的執(zhí)行、對(duì)象內(nèi)存的分配和回收、線程和鎖機(jī)制,這幾個(gè)機(jī)制涉及到的jvm的知識(shí)點(diǎn)遠(yuǎn)沒有寫這幾個(gè)字這么簡(jiǎn)單,里面的復(fù)雜度還是非常高的。

          字節(jié)碼的加載
          JVM通過ClassLoader來完成字節(jié)碼的動(dòng)態(tài)加載,這里面涉及到的主要是ClassLoader的雙親委派、ClassLoader的編寫方法、Class是否被加載的唯一標(biāo)識(shí)以及Class的加載過程。
          在考察的時(shí)候我覺得可以以這么兩道簡(jiǎn)單的題來考察:
          1、寫一段將目錄中指定的.class文件加載到JVM的程序,并通過Class對(duì)象獲取到完整類名等信息;
          2、一段展示代碼,里面包含一個(gè)全局靜態(tài)整型變量,問如果用兩個(gè)ClassLoader加載此對(duì)象,執(zhí)行這個(gè)整型變量++操作后結(jié)果會(huì)是怎么樣的?

          方法的執(zhí)行
          JVM有自己的一套指令系統(tǒng),字節(jié)碼中即已經(jīng)是指令了,需要大概掌握了JVM對(duì)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等工具)

          對(duì)象內(nèi)存的分配和回收
          這塊涉及的知識(shí)點(diǎn)也是比較的多,例如JVM內(nèi)存區(qū)域的劃分、自然類型和引用類型的內(nèi)存分配的不同、TLAB、GC的算法、Sun JDK對(duì)于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ū)е率窃趺椿厥諏?duì)象內(nèi)存的,F(xiàn)ull GC的時(shí)候是怎么回收對(duì)象內(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)?

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

          評(píng)論

          # re: JVM知識(shí)點(diǎn)題目 2009-03-27 15:28 flyisland

          希望不是你當(dāng)面試官,哈  回復(fù)  更多評(píng)論   

          # re: JVM知識(shí)點(diǎn)題目 2009-03-27 16:05 云襄

          JVM的東西的確比較復(fù)雜  回復(fù)  更多評(píng)論   

          # re: JVM知識(shí)點(diǎn)題目 2009-03-27 19:27 問問

          都不是很懂,什么時(shí)候貼答案啊?  回復(fù)  更多評(píng)論   

          # re: JVM知識(shí)點(diǎn)題目[未登錄] 2009-03-27 20:15 逝水fox

          看了問題 很想知道答案 看書去咯  回復(fù)  更多評(píng)論   

          # re: JVM知識(shí)點(diǎn)題目[未登錄] 2009-03-28 15:55 kimi

          關(guān)于ClassLoader的兩個(gè)問題
          第一個(gè)題目把文件系統(tǒng)中的.class文件讀到一個(gè)bute數(shù)組中,使用ClassLoader的defineClass方法把這個(gè)byte數(shù)組傳遞給jvm,則返回一個(gè)Class對(duì)象,通過這個(gè)Class對(duì)象可以做關(guān)于一個(gè)對(duì)象的任何事情,但defineClass方法是protected的,所以要寫一個(gè)ClassLoader的子類,也就是實(shí)現(xiàn)一個(gè)自己的ClassLoader。

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

          班門弄斧了,還請(qǐng)博主指正我的回答是否正確。  回復(fù)  更多評(píng)論   

          # re: JVM知識(shí)點(diǎn)題目 2009-05-24 01:51 ttt

          老大,給個(gè)答案啊,別變成炫耀貼了。  回復(fù)  更多評(píng)論   

          # re: JVM知識(shí)點(diǎn)題目 2011-12-31 14:33 whwang

          這題太狠了:
          3、編寫一段程序,動(dòng)態(tài)的創(chuàng)建一個(gè)接口的實(shí)現(xiàn),并加載到JVM中執(zhí)行;(可以允許用BCEL等工具)
            回復(fù)  更多評(píng)論   

          # re: JVM知識(shí)點(diǎn)題目 2012-01-02 00:23 斌斌

          將目錄里的*.class filter出來,getName一個(gè)個(gè)來  回復(fù)  更多評(píng)論   

          # re: JVM知識(shí)點(diǎn)題目 2012-08-10 17:04 jb

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

          2.3用asm 框架 writeclass  回復(fù)  更多評(píng)論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導(dǎo)航

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

          統(tǒng)計(jì)

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 桃园市| 越西县| 彰化县| 太仆寺旗| 任丘市| 金川县| 吴桥县| 大连市| 兖州市| 石景山区| 包头市| 佳木斯市| 唐河县| 南平市| 洪湖市| 古丈县| 辽宁省| 长阳| 江津市| 长春市| 陵川县| 瑞丽市| 常山县| 改则县| 肇庆市| 延边| 汝州市| 车险| 洛宁县| 水富县| 呼图壁县| 上栗县| 宜宾县| 正镶白旗| 沈丘县| 江达县| 皮山县| 高陵县| 金堂县| 来宾市| 孟州市|