成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試被問:OOM 類型有哪些?怎么答?

開發
OOM 的根本原因是 JVM 內存區域不足 或 資源耗盡,需結合錯誤類型分析具體內存區域(堆、元空間、直接內存等)。

面試官:OOM類型有哪些?

你:就是老年代放不下了嘛!

面試官:等消息吧!

OOM(Out Of Memory) 錯誤有多種類型,每種類型對應不同的內存區域或觸發場景。以下是常見的 OOM 類型及其產生原因:

1. java.lang.OutOfMemoryError: Java heap space

觸發原因:堆內存(存放對象實例)不足,無法分配新對象。

典型場景:

  • 內存泄漏:對象被無意長期引用(如靜態集合、未關閉的資源),無法被 GC 回收。
  • 堆大小不足:JVM 堆參數(-Xmx)設置過小,或程序需要處理的數據量超出預期。
  • 大對象分配:一次性申請超大對象(如大數組)。

示例:

// 不斷向集合中添加對象導致堆溢出
List<Object> list = new ArrayList<>();
while (true) {
    list.add(new Object());
}

解決方案:

  • 檢查內存泄漏(使用 jmap + MAT 分析堆轉儲)。
  • 調整堆大小(-Xmx 和 -Xms)。
  • 優化代碼邏輯,減少對象生命周期。

2. java.lang.OutOfMemoryError: Metaspace(Java 8+)或 PermGen space(Java 7-)

觸發原因:元空間(Metaspace)或永久代(PermGen)內存不足,用于存儲類元數據、方法信息等。

典型場景:

  • 動態生成大量類(如使用 CGLib、反射、動態代理)。
  • 類加載器未正確釋放(如頻繁部署的 Web 應用導致舊類未卸載)。

示例:

// 使用 CGLib 動態生成大量代理類
Enhancer enhancer = new Enhancer();
while (true) {
    enhancer.setSuperclass(OOM.class);
    enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> proxy.invokeSuper(obj, args)));
    enhancer.create();
}

解決方案:

  • 調整元空間大小(-XX:MaxMetaspaceSize)。
  • 檢查類加載器泄漏或動態類生成邏輯。

3. java.lang.OutOfMemoryError: Direct buffer memory

觸發原因:直接內存(Direct Memory,通過 ByteBuffer.allocateDirect() 分配)耗盡。

典型場景:

  • 頻繁申請直接內存但未及時釋放(需依賴 System.gc() 或 Cleaner 機制)。
  • JVM 直接內存參數(-XX:MaxDirectMemorySize)設置過小。

示例:

// 不斷申請直接內存
List<ByteBuffer> buffers = new ArrayList<>();
while (true) {
    buffers.add(ByteBuffer.allocateDirect(1024 * 1024)); // 1MB
}

解決方案:

  • 檢查直接內存使用代碼,確保及時釋放。
  • 調整 -XX:MaxDirectMemorySize。

4. java.lang.OutOfMemoryError: Unable to create new native thread

觸發原因:操作系統限制線程數量,無法創建新線程。

典型場景:

  • 線程數超過系統限制(如 Linux 的 ulimit -u)。
  • 每個線程的棧內存(-Xss)設置過大,導致總內存占用超出。

示例:

// 無限創建線程
while (true) {
    new Thread(() -> {
        try { Thread.sleep(1000000); } catch (InterruptedException e) {}
    }).start();
}

解決方案:

  • 減少線程數(使用線程池)。
  • 調整 -Xss 減小線程棧大小。
  • 修改系統線程數限制。

5. java.lang.OutOfMemoryError: Requested array size exceeds VM limit

  • 觸發原因:嘗試分配超過 JVM 限制的數組(通常接近 Integer.MAX_VALUE)。
  • 典型場景:錯誤計算數組長度,如 new int[Integer.MAX_VALUE]。

解決方案:檢查數組長度計算邏輯,使用合理的數據結構。

6. java.lang.OutOfMemoryError: GC Overhead limit exceeded

觸發原因:GC 頻繁執行但回收效率極低(如 98% 時間用于 GC,僅回收 2% 內存)。

典型場景:堆內存幾乎被占滿,且存在大量無法回收的對象(內存泄漏)。

解決方案:檢查內存泄漏或優化 GC 策略(如調整堆大小、更換垃圾回收器)。

7. java.lang.OutOfMemoryError: CodeCache(JIT 編譯代碼緩存溢出)

觸發原因:JIT 編譯器生成的本地代碼占滿代碼緩存區。

典型場景:高頻動態編譯大量方法(如復雜的熱點代碼)。

解決方案:

  • 調整代碼緩存大小(-XX:ReservedCodeCacheSize)。
  • 關閉分層編譯(-XX:-TieredCompilation)。

總結

OOM 的根本原因是 JVM 內存區域不足 或 資源耗盡,需結合錯誤類型分析具體內存區域(堆、元空間、直接內存等)。

排查時可通過以下步驟:

  • 確定 OOM 類型(通過錯誤日志)。
  • 使用工具分析(如 jstat、jmap、VisualVM、MAT)。
  • 調整 JVM 參數或優化代碼邏輯。
責任編輯:趙寧寧 來源: 程序員小富
相關推薦

2021-04-13 10:41:25

Redis內存數據庫

2021-02-05 12:34:33

線程池系統

2009-12-02 15:02:17

路由器怎么安裝

2024-01-05 14:20:55

MySQL索引優化器

2024-03-06 08:00:56

javaAQS原生

2012-02-24 10:28:32

2022-04-01 08:37:07

SpringAPI前端

2010-05-28 15:47:16

雙絞線

2012-10-31 09:41:47

WAN優化SSLHTTPS

2014-12-15 11:16:34

vCenter SRM

2024-02-01 08:08:53

Spring過濾器類型Gateway

2023-12-18 08:03:56

并發編程Java

2023-11-06 11:13:58

Bean占位符標記

2011-11-03 09:29:32

2011-08-05 11:06:33

VMware vSph虛擬化

2022-06-29 16:59:21

Vue3Vue2面試

2022-03-21 14:09:19

面試C語言代碼

2021-05-27 07:14:52

ZooKeeper節點類型

2016-12-12 14:55:01

AndroidAndroid Vie

2011-12-08 09:47:08

虛擬化應用虛擬化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产综合久久久久久 | 久久久久久国产 | 久久精品一级 | 四虎影院在线观看免费视频 | 黄色男女网站 | 久久久精品影院 | 欧美一区在线视频 | 欧美亚洲视频在线观看 | 久久夜视频 | 精品视频www| 日韩欧美国产一区二区 | 中文字幕在线观看精品 | 久久久久久国产精品免费免费男同 | 国产黄a一级| 超碰在线97国产 | 久久久青草婷婷精品综合日韩 | 九九av| www.国产一区| 97久久精品午夜一区二区 | 精品少妇一区二区三区日产乱码 | 久久久久久亚洲国产精品 | 九九亚洲 | 免费成人在线网站 | 精品久久网 | 一区二区三区在线免费 | 精品国产黄色片 | 欧美一区二区三区一在线观看 | 精品国产伦一区二区三区观看方式 | 亚洲一页 | 一区二区影院 | 91在线播| 日本成年免费网站 | 欧美日韩亚洲国产 | 中文字幕在线视频一区二区三区 | 亚洲一区二区三区免费 | 青青草久久 | 羞羞色网站 | 国产精品一区一区三区 | 都市激情亚洲 | 国精产品一区一区三区免费完 | 久久一区二区三区电影 |