運行時數據區域
在運行時數據區內,白色部分的是線程私有的:虛擬機棧、本地方法棧、程序計數器
程序計數器:線程私有,可以看做當前線程所執行的字節碼的行號指示器。若線程正在執行一個Java方法,這個計數器記錄正在執行的虛擬機字節碼指令地址;若正在執行Native方法,則計數器爲空。
Java虛擬機棧:線程私有, 生命週期與線程相同。通常所講的“堆”內存,“棧”內存的“棧”,與虛擬機棧或是說與虛擬機棧中局部變量表是等價的。局部變量表存放了各種基本類型以及引用類型,在編譯期就可以完全確定大小。
本地方法棧:線程私有,作用與虛擬機棧相同,只不過執行的是本地方法。
Java堆:線程共享,目的是存放對象實例。通過-Xmx和-Xms可以控制堆是固定大小還是可擴展的。
方法區:線程共享,存儲已被虛擬機加載的類信息、常量、靜態變量等。
運行時常量池:方法區的一部分。Class文件中除了類的版本、字段、方法、接口等描述信息外,還有一項是常量池(Constant Pool Table),用來存放編譯期生成的各種字面量和符號引用。
相關閱讀:Java常量池理解與總結
直接內存:NIO中,引入一種基於通道(Channel)與緩衝區(Buffer)的I/O方式,它可以使用Native函數直接分配堆外內存,並且使用Java堆中的DirectByteBuffer對象作爲這塊內存的引用進行直接操作。
對象的訪問定位
- 句柄訪問
- 直接指針訪問