序言
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異常。
- 運行時常量池 運行時常量池是方法區的一部分,主要用於存放編譯期生成的各種字面量和符號引用。
- 直接內存