OutOfMemoryError異常 | StackOverflowError異常 | |
程序計數器 | 無 | 無 |
Java虛擬機棧 | 若是虛擬機棧可擴展,擴展時沒法申請到足夠內存 | 線程請求的棧深度大於虛擬機所容許的深度 |
本地方法棧 | 與Java虛擬機棧相同 | 與Java虛擬機棧相同 |
Java堆 | 堆中沒有內存完成實例分配,而且堆沒法再進行擴展 | 無 |
方法區 | 方法區沒法知足內存分配需求(常量池沒法申請到內存) | 無 |
*直接內存 | 內存區域總和大於物理內存總和 | 無 |
直接內存(Direct Memory)並非虛擬機運行時數據區的一部分,也不是Java虛擬機規範中定義的內存區域,可是這部份內存也被頻繁地使用,並且也可能致使OutOfMemoryError異常出現,因此咱們放到這裏一塊兒講解。服務器
在JDK 1.4中新加入了NIO(New Input/Output)類,引入了一種基於通道(Channel)與緩衝區(Buffer)的I/O方式,它可使用Native函數庫直接分配堆外內存,而後經過一個存儲在Java堆裏面的DirectByteBuffer對象做爲這塊內存的引用進行操做。這樣能在一些場景中顯著提升性能,由於避免了在Java堆和Native堆中來回複製數據。函數
顯然,本機直接內存的分配不會受到Java堆大小的限制,可是,既然是內存,則確定仍是會受到本機總內存(包括RAM及SWAP區或者分頁文件)的大小及處理器尋址空間的限制。服務器管理員配置虛擬機參數時,通常會根據實際內存設置-Xmx等參數信息,但常常會忽略掉直接內存,使得各個內存區域的總和大於物理內存限制(包括物理上的和操做系統級的限制),從而致使動態擴展時出現OutOfMemoryError異常。性能