Java Memory Allocation 記憶體分配是指將程序和服務分配給虛擬記憶體空間的過程,JVM 將記憶體分為 Stack 記憶體和 Heap 記憶體,以最大潛力執行應用程序,每次宣告一個新的變數或物件時,都會分配專門用於此類操作的記憶體, Memory Allocation Learn Java 增加了範例及執行時記憶體拋出的例外,透過單元測試來驗證產出結果。
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。
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 來驗證產出結果。
GC Overhead Limit Exceeded 超過 GC 回收上限,表示 Java 程序花費 98% 以上的時間執行 GC,但只恢復了不到 2% 的記憶體,且執行連續重複了 5 次,就會產生 Java OutOfMemoryError 的錯誤,模擬建立一個物件,將其加入到一個 List 中,大小限制為 1000 個,重複建立過程,直到 JVM 拋出錯誤, Java 147 增加了範例,並透過 JUnit 4 來驗證產出結果。
Unable To Create New Native Thread 無法建立新的執行緒,因為每個執行都需要佔用一定的記憶體空間,當 JVM 向底層 OS 請求建立一個新的執行緒時,如果沒有足夠的資源分配就會拋出此錯誤,模擬無窮迴圈建立執行緒,直到 JVM 拋出錯誤, Java 147 增加了範例,並透過 JUnit 4 來驗證產出結果。
Java Heap Space 用於存儲物件實例,只要不斷地建立物件,隨著物件數量的增加,總容量超過堆的最大容量限制後,就會產生 Java OutOfMemoryError 的錯誤,模擬建立一個大小 100MB 的 byte 陣列,將其加入到一個 List 中,然後重複建立和加入過程,直到 JVM 拋出錯誤, Java 147 增加了範例,並透過 JUnit 4 來驗證產出結果。