面試題--Java基礎

1、什麼是線程局部變量
線程局部變量是侷限於線程內部的變量,屬於一個線程自身獨有,不參與到多個線程的共享。Java提供了 ThreadLocal 類來支持線程局部變量,這是一種實現線程安全的方式。另外,在管理環境下(如 web 服務器)使用線程局部變量的時候要特別小心,在這種情況下,工作線程的生命週期比任何應用變量的生命週期都要長。任何線程局部變量一旦在工作完成後沒有釋放,應用就存在內存泄露的風險。

2、Java對象的sleep方法和wait方法的區別
兩者都是用來暫停當前運行的線程,本質上的區別是 sleep 方法在暫停線程時,不會釋放已持有的鎖,而 wait 方法意味着條件等待,會釋放掉持有的鎖。
對於線程的狀態,sleep 暫停時線程狀態爲:TIME_WAITING,wait暫停時狀態爲:WAITING

3、什麼是不可變對象,Java 中如何創建一個不可變對象
不可變對象指對象一旦被創建,對象的狀態就不能再被改變。任何修改都會創建一個新的對象,如 JDK 內置的 final 類 String,Integer 及其他包裝類等。創建一個不可變對象可參照 String 類。

4、Java中可以強制轉換Int類型到Byte類型,若該值大於Byte類型的範圍,將會出現什麼現象
Java中 int 是32位,Byte 是8位;所以在超出 Byte 類型範圍後的強制轉換,Int 類型的高24位將會被丟棄,Byte 類型值域是 -128 到 127。

5、a = a + b 和 a += b 的區別
+= 隱式的將加操作的結果類型 強制轉換爲 持有結果的類型。如果兩個整型相加,如byte、short或int,首先會將它們提升到int類型,然後在執行加法操作。如果加法操作的結果比 a 的最大值要大,則 a + b 會出現編譯錯誤,但是 a += b 則沒問題,如下:

byte a = 127;
byte b = 127;
b = a + b;    // error : cannot convert from int to byte
b += a;       // ok

6、3 * 0.1 == 0.3 將會返回什麼
false,因爲有些浮點數不能被精確的表達出來。
3 * 0.1 = 0.30000000000000004

7、Serial 與 Parallel GC 之間的不同之處
Serial 與 Parallel 在GC執行期間都會觸發 stop-the-world。
Serial 是 JVM 最基本的、發展歷史最悠久的垃圾收集器,曾經在 JDK 1.3 之間是新生代收集的唯一選擇。它是一個單線程的收集器,使用複製算法,最重要的是它在進行垃圾收集時,必須暫停其他所有的工作線程,直到它收集結束。雖然Serial缺點如此明顯,但也有着優於其他收集器的地方:簡單而高效;時至今日,從 Serial 到 CMS 再到 G1,Serial 依然是 JVM 運行在 Client 模式下的默認新生代收集器。
Parallel 全名是 Parallel Scavenge,它也是一個新生代收集器,它和 Serial 一樣也是使用複製算法的收集器,且是一個併發的多線程收集器。該收集器的關注點與其他收集器不同,CMS等收集器的關注點是儘可能的縮短垃圾收集的時間,而 Parallel Scavenge 的特點是“吞吐量優先”:

吞吐量 = 運行用戶代碼時間 / (運行用戶代碼時間 + 垃圾收集時間)

例如:若虛擬機總運行時間爲 100 分鐘,其中垃圾收集時間花掉 1 分鐘,則吞吐量爲 99 %。

8、32 位 和 64 位的 JVM 中,Int 類型的長度是多少
Int 類型長度不變,都是 32 位 / 4 個字節。

9、Java 中 WeakReference 與 SoftReference 的區別
WeakReference 與 SoftReference 都有利於提高 GC 的回收效率優化內存,區別是 WeakReference 一旦失去最後一個強引用,就會被 GC 回收;而 SoftReference 雖然在失去最後一個強引用時,也會被 GC 回收,但是 SoftReference 延遲到內存不足的時候纔會被回收。
附上 SoftReference 的緩存應用,能夠在緩存內容過大時避免出現 OutOfMemory 問題

    // create object
    Operation opr = new Operation();

    // do something
    opr.doSomething();

    // cache it
    SoftReference<Operation> soft = new SoftReference<>(opr);

    // release opr
    opr = null;

    // ...

    // next time
    if (soft == null) // GC reclaimed it, reload object
        soft = new SoftReference<>(new Operation());

    // get object
    Operation nextOpr = soft.get();

    // continue do something
    nextOpr.doSomething();

10、JVM 選項 -XX:+UseCompressedOops 有什麼作用?爲什麼要使用?
當你將你的應用從 32 位的 JVM 遷移到 64 位的 JVM 時,由於對象的指針從 32 位增加到了 64 位,因此堆內存會突然增加,差不多要翻倍。這也會對 CPU 緩存(容量比內存小很多)的數據產生不利的影響。因爲,遷移到 64 位的 JVM 主要動機在於可以指定最大堆大小,通過壓縮 OOP 可以節省一定的內存。通過 -XX:+UseCompressedOops 選項,JVM 會使用 32 位的 OOP,而不是 64 位的 OOP。

轉載 HippoSystem

參考 《深入理解 Java 虛擬機》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章