Java OutOfMemoryError Direct Buffer Memory – Java 147

Java OutOfMemoryError Direct Buffer Memory,當使用 NIO 的時候經常需要使用 ByteBuffer 來讀取或寫入數據,這是一種基於 Channel (通道) 和 Buffer (緩衝區)的 I/O 方式,它可以使用 Native 函數庫直接分配堆外內存,然後通過一個存儲在 Java 堆裡面的 DirectByteBuffer 對像作為這塊內存的引用進行操作,這樣在一些場景就避免了 Java 堆和 Native 中來回複製數據,所以性能會有所提高, Java 允許應用程序通過 Direct ByteBuffer 直接訪問堆外內存,許多高性能程序通過 Direct ByteBuffer 結合內存映射文件(Memory Mapped File)實現高速 IO。

Continue ReadingJava OutOfMemoryError Direct Buffer Memory – Java 147

Java OutOfMemoryError Requested Array Size Exceeds VM Limit – Java 147

Requested Array Size Exceeds VM Limit 建立 Array 時,超過 VM 陣列大小上限,JVM 會在分配的資料結構上,會執行一項檢查,確定是否可以 Addressable 尋址,可分配大小為 2,147,483,645,及 Integer.MAX_VALUE-2 的陣列,若增加一點點長度,如: Integer.MAX_VALUE-1 就會拋出此錯誤, Java 147 增加了範例,並透過 JUnit 4 來驗證產出結果。

Continue ReadingJava OutOfMemoryError Requested Array Size Exceeds VM Limit – Java 147

Java OutOfMemoryError GC Overhead Limit Exceeded – Java 147

GC Overhead Limit Exceeded 超過 GC 回收上限,表示 Java 程序花費 98% 以上的時間執行 GC,但只恢復了不到 2% 的記憶體,且執行連續重複了 5 次,就會產生 Java OutOfMemoryError 的錯誤,模擬建立一個物件,將其加入到一個 List 中,大小限制為 1000 個,重複建立過程,直到 JVM 拋出錯誤, Java 147 增加了範例,並透過 JUnit 4 來驗證產出結果。

Continue ReadingJava OutOfMemoryError GC Overhead Limit Exceeded – Java 147

Java OutOfMemoryError Unable To Create New Native Thread – Java 147

Unable To Create New Native Thread 無法建立新的執行緒,因為每個執行都需要佔用一定的記憶體空間,當 JVM 向底層 OS 請求建立一個新的執行緒時,如果沒有足夠的資源分配就會拋出此錯誤,模擬無窮迴圈建立執行緒,直到 JVM 拋出錯誤, Java 147 增加了範例,並透過 JUnit 4 來驗證產出結果。

Continue ReadingJava OutOfMemoryError Unable To Create New Native Thread – Java 147

Java OutOfMemoryError Java Heap Space – Java 147

Java Heap Space 用於存儲物件實例,只要不斷地建立物件,隨著物件數量的增加,總容量超過堆的最大容量限制後,就會產生 Java OutOfMemoryError 的錯誤,模擬建立一個大小 100MB 的 byte 陣列,將其加入到一個 List 中,然後重複建立和加入過程,直到 JVM 拋出錯誤, Java 147 增加了範例,並透過 JUnit 4 來驗證產出結果。

Continue ReadingJava OutOfMemoryError Java Heap Space – Java 147