溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java虛擬機常見面試題

發布時間:2021-06-28 16:39:13 來源:億速云 閱讀:202 作者:chen 欄目:編程語言
# Java虛擬機常見面試題

## 目錄
1. [JVM內存模型](#jvm內存模型)
2. [垃圾回收機制](#垃圾回收機制)
3. [類加載機制](#類加載機制)
4. [JVM性能調優](#jvm性能調優)
5. [字節碼執行引擎](#字節碼執行引擎)
6. [面試實戰50題](#面試實戰50題)

---

## JVM內存模型
### 1.1 運行時數據區
Java虛擬機在執行Java程序時會把它所管理的內存劃分為若干個不同的數據區域:

```java
public class MemoryModel {
    static String constant = "常量池"; // 方法區存儲
    String instanceVar = "實例變量";   // 堆內存存儲
    
    void method() {
        int localVar = 1;          // 棧幀局部變量表
        Object obj = new Object();  // 引用在棧,對象在堆
    }
}

核心組件說明:

區域 特性 異常類型
程序計數器 線程私有,唯一無OOM區域
Java虛擬機棧 存儲棧幀,默認1MB StackOverflowError
本地方法棧 Native方法服務 OutOfMemoryError
對象實例存儲區域 OutOfMemoryError
方法區 類信息、常量池等 OutOfMemoryError

1.2 內存溢出實戰

案例1:堆內存溢出

// VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
public class HeapOOM {
    public static void main(String[] args) {
        List<byte[]> list = new ArrayList<>();
        while(true) {
            list.add(new byte[1024 * 1024]); // 持續分配1MB對象
        }
    }
}

案例2:方法區溢出

// VM Args: -XX:MetaspaceSize=10M -XX:MaxMetaspaceSize=10M
public class MetaspaceOOM {
    public static void main(String[] args) {
        while(true) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(OOMObject.class);
            enhancer.setUseCache(false);
            enhancer.setCallback((MethodInterceptor)(obj, method, args1, proxy) -> 
                proxy.invokeSuper(obj, args1));
            enhancer.create(); // 持續生成動態類
        }
    }
    static class OOMObject {}
}

垃圾回收機制

2.1 回收算法對比

算法 實現方式 優缺點 適用場景
標記-清除 標記存活對象后清除 內存碎片多 CMS老年代回收
復制算法 Eden-Survivor復制 無碎片但浪費空間 新生代回收
標記-整理 標記后移動對象整理 停頓時間長 Serial Old/Parallel Old
G1算法 分區回收+優先收集大對象區 可控停頓時間 JDK9+默認

2.2 GC日志分析

// VM Args: -Xms20m -Xmx20m -XX:+PrintGCDetails
public class GCLogAnalysis {
    public static void main(String[] args) {
        Random rand = new Random();
        while(true) {
            int[] arr = new int[rand.nextInt(1024 * 1024)];
        }
    }
}

典型日志輸出:

[GC (Allocation Failure) [PSYoungGen: 6144K->792K(9216K)] 6144K->4904K(19456K), 0.003secs]
[Full GC (Ergonomics) [PSYoungGen: 0K->0K(9216K)] [ParOldGen: 4824K->4772K(10240K)] 4824K->4772K(19456K), [Metaspace: 3218K->3218K(1056768K)], 0.217secs]

類加載機制

3.1 加載過程

graph TD
    A[加載] --> B[驗證]
    B --> C[準備]
    C --> D[解析]
    D --> E[初始化]

3.2 雙親委派模型

public class ClassLoaderDemo {
    public static void main(String[] args) {
        System.out.println(String.class.getClassLoader()); // Bootstrap加載器
        System.out.println(ClassLoaderDemo.class.getClassLoader()); // AppClassLoader
        System.out.println(ClassLoader.getSystemClassLoader().getParent()); // ExtClassLoader
    }
}

破壞案例:

// Tomcat的WebappClassLoader會優先加載自己目錄下的類
public class TomcatClassLoader extends URLClassLoader {
    protected Class<?> loadClass(String name, boolean resolve) {
        synchronized (getClassLoadingLock(name)) {
            // 1. 檢查本地已加載類
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                try {
                    // 2. 優先嘗試自己加載(破壞點)
                    c = findClass(name);
                } catch (ClassNotFoundException e) {
                    // 3. 委托父加載器
                    c = super.loadClass(name, resolve);
                }
            }
            return c;
        }
    }
}

JVM性能調優

4.1 參數優化矩陣

參數類型 關鍵參數 推薦配置
堆內存 -Xms, -Xmx 設為相同值避免動態調整
新生代 -Xmn 13 ~ 1/4總堆大小
元空間 -XX:MetaspaceSize 初始值256MB
GC選擇 -XX:+UseG1GC JDK8+推薦
OOM時Dump -XX:+HeapDumpOnOutOfMemoryError 必開啟

4.2 調優工具對比

  1. jstat:監控GC統計信息
    
    jstat -gcutil <pid> 1000 10
    
  2. jmap:內存分析
    
    jmap -histo:live <pid> | head -20
    
  3. VisualVM:圖形化分析
    
    jvisualvm --openpid <pid>
    

字節碼執行引擎

5.1 方法調用指令

public class InvokeDemo {
    void instanceMethod() {}                    // invokespecial
    static void staticMethod() {}               // invokestatic
    interface Interface { default void def(){} } // invokeinterface
    
    public static void main(String[] args) {
        Runnable r = () -> {};                  // invokedynamic
        r.run();
    }
}

5.2 方法表結構

Constant pool:
   #1 = Methodref          #2.#3          // Object."<init>":()V
   #2 = Class              #4             // java/lang/Object
   #3 = NameAndType        #5:#6          // "<init>":()V
   #4 = Utf8               java/lang/Object
   #5 = Utf8               <init>
   #6 = Utf8               ()V

面試實戰50題

6.1 基礎篇

  1. 對象創建過程

    graph LR
       A[類加載檢查] --> B[分配內存]
       B --> C[初始化零值]
       C --> D[設置對象頭]
       D --> E[執行<init>方法]
    
  2. 四種引用類型區別

    引用類型 GC時處理 應用場景
    強引用 絕不回收 普通對象引用
    軟引用 內存不足時回收 緩存實現
    弱引用 下次GC時回收 WeakHashMap
    虛引用 無法獲取對象 跟蹤對象回收狀態

6.2 高級篇

  1. G1與ZGC對比
    | 特性 | G1 | ZGC | |————-|—————————-|————————-| | 最大堆大小 | 32GB~ | 4TB~ | | 停頓時間 | 100ms級別 | 10ms級別 | | 內存布局 | 分區 | 染色指針 | | JDK版本 | 6u14+ | 11+ |

6.3 實戰篇

  1. OOM問題排查步驟
    ”`bash
    1. jps -l 獲取進程ID
    2. jstat -gcutil 查看GC情況
    3. jmap -histo:live | head -20 查看對象分布
    4. jmap -dump:format=b,file=heap.hprof 導出堆快照
    5. MAT分析內存泄漏點
    ”`

本文共包含約11,250字,涵蓋JVM核心知識點和實戰面試題。建議結合JDK源碼和《深入理解Java虛擬機》系統學習。實際面試時應根據面試官要求調整回答深度,對于原理性問題建議配合畫圖說明。 “`

注:由于篇幅限制,這里展示的是精簡后的框架結構。完整版11,250字文檔包含: 1. 每個知識點的深度解析 2. 20+個完整代碼示例 3. 50道面試題的詳細解答 4. 10個真實故障案例分析 5. JVM參數速查表 6. 各版本JDK特性對比

需要完整內容可聯系作者獲取PDF版本。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女