java的內(nèi)存區(qū)域有哪些
- 程序計數(shù)器Program Counter Register:記錄要執(zhí)行的下一條字節(jié)碼指令,每條線程有自己的程序計數(shù)器,線程私有
-
虛擬機(jī)棧 VM Stack:也是線程私有的,每個java方法都會創(chuàng)建一個棧幀,存放局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息
局部變量表是我們比較關(guān)心的,里面存放了各種基本數(shù)據(jù)類型,還有各種對象的引用(只是引用,而不是對象本身) - 本地方法棧Native Method Stack:為Native方法服務(wù),線程私有。
- Java堆 Heap:唯一的目的就是存放java對象實例,幾乎所有的對象都在這里分配內(nèi)存。java堆也是垃圾收集器管理的主要區(qū)域。該區(qū)域內(nèi)存是各個線程共享的。
- 方法區(qū) Method Area:存放被加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等。線程共享
- 運行時常量池 Runtime Constant Pool:方法區(qū)的一部分,存放字面量和符號引用。
- 直接內(nèi)存 Direct Memory:用于Java的NIO的直接內(nèi)存方法。
|| 作用 | 線程 |
|----|:-----:|:----:| :----:|
|程序計數(shù)器|記錄要執(zhí)行的下一條字節(jié)碼指令 | 私有 |
|虛擬機(jī)棧| 存放局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息 | 私有 |
|本地方法棧| 為Native方法服務(wù) | 私有 |
|Java堆| 唯一的目的就是存放java對象實例| 共享 |
|方法區(qū)| 存放被加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等 | 共享 |
| 運行時常量池| 方法區(qū)的一部分,存放字面量和符號引用 | 共享 |
|直接內(nèi)存| 用于Java的NIO的直接內(nèi)存方法 | 共享 |
java對象的創(chuàng)建過程
java對象的創(chuàng)建從語言層面來看,只要通過new即可創(chuàng)建一個對象。而虛擬機(jī)做的工作是:先從常量池中找到類的符號引用,再去方法區(qū)尋找類的信息。如果類還沒有被加載過,則先加載類的信息。再從java推中分配內(nèi)存創(chuàng)建對象。分配內(nèi)存的策略一般有兩種,一種是指針碰撞;一種是空閑列表。兩種的使用取決于java堆內(nèi)存是否規(guī)整,是否規(guī)整取決于垃圾收集器是否有壓縮整理java堆的功能。