Java內存區域與內存溢出異常(一)

序言

Java與C++之間有一堵由內存動態分配和垃圾手機技術所圍成的“高牆”,牆外面的人想進去,牆裏面的人想出來。

一、運行時數據區域

Java程序在執行時,是由jvm來控制的。Java虛擬機在執行Java程序時,會把它所管理的內存劃分爲若干個不同的數據區域。主要按照幾個區域進行劃分:
在這裏插入圖片描述

二、程序計數器

程序計數器是一塊較小的內存空間,主要記錄線程當前執行到了哪一步。由於多線程是通過輪流切換線程來調度CPU執行程序,爲了切換線程之後還能回到之前的執行位置,每一個線程都有自己獨立的程序計數器。所以說,程序計數器是“線程私有”的內存。如果線程正在執行的是Java方法,計數器記錄的是正在執行的虛擬機字節碼指令的地址;如果正在執行Native方法,計數器的值爲空。此內存區域是唯一一個在Java虛擬機規範中沒有規定任何OutOfMemoryError情況的區域。

三、Java虛擬機棧

Java虛擬機棧也是線程私有的,生命週期和線程一樣,主要用於存儲局部變量表、操作數棧、方法出口信息等。局部變量表主要存放了基本數據類型、對象引用和returnAddress類型。虛擬機棧會拋出StackOverflowError異常和OutOfMemoryError異常

四、本地方法棧

本地方法棧和虛擬機棧的作用非常相似,只不過Java虛擬機棧爲執行Java方法服務,而本地方法棧則爲執行Native方法服務。同樣也是線程私有的內存,也會拋出StackOverflowError異常和OutOfMemoryError異常

五、堆

Java堆是Java虛擬機管理的內存中最大的一塊,是被所有線程共享的一塊數據區域。堆裏面存放的對象的實例,幾乎所有的對象實例都在這裏分配內存,所以這也是垃圾收集器管理的主要區域。堆會拋出OutOfMemoryError異常

六、方法區

方法區和堆一樣,也是被所有的線程共享,主要用於存放類信息、常量、靜態變量等。方法區會拋出OutOfMemoryError異常。

  • 運行時常量池
  • 運行時常量池是方法區的一部分,主要用於存放編譯期生成的各種字面量和符號引用。
  • 直接內存
直接內存並不是虛擬機運行時數據區的一部分,也不是Java虛擬機規範中定義的內存區域,但也有可能導致OutOfMemoryError異常。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章