1.什麼是JVM運行時的內存? (摘取自 【深入理解java虛擬機】)
java虛擬機在執行java程序的過程中會把它所管理的內存劃分爲若干個不同的數據區域。這些區域都有各自的用途,以及創建和銷燬的時間,有的區域隨着虛擬機進程的啓動而存在,有些區域則依賴用戶線程的啓動和結束而建立和銷燬。
2.運行時內存都有那些?
線程共享:
1.堆:
java堆是java虛擬機所管理的內存中最大的一塊,在java虛擬機啓動的時候創建,此區域的唯一目的就是創建對象實 例,幾乎所有對象實例都在這裏分配內存。因此這裏也經常發生GC
2.方法區
存放已被虛擬機加載的類的信息,常量,靜態變量,即時編譯器編譯後的代碼等數據,這裏很少發生gc,這裏gc主要針 對是類的卸載,方法區的常量池 。
常量池:方法區裏的運行時常量池,存放靜態編譯器間產生字面量和符合引用,動態編譯期間產生的的常量也有可能放在這裏例如String.intern();
線程獨有:
3.java棧(虛擬機棧)
爲方法服務,每次方法的調用都會產生一個新的棧振,用戶存放局部變量,操作數棧,動態鏈接,方法返回地址,生命 週期和線程一樣,
幀棧: 每個幀棧都包括一個指向運行時的所屬方法的引用,持有這個引用,是因爲要支持方法調用過程中的動態鏈接,動態 鏈接是將常量池中的符號引用在運行期間轉換爲直接引用。
局部變量: 局部變量表裏面存儲的是基本數據類型,方法返回地址和對象的引用(對象指針,這個對象的引用可能是個句柄(當 一個對象引用例如數據庫或者操作系統內存塊或對象會使用句柄))
操作數棧: 操作數棧的作用是用來存儲運算結果以及運算操作數,它不同於局部變量表通過索引來訪問, 而是通過入棧和出棧的方式來訪問
4.本地方法棧
類似java虛擬機棧,不過是爲本地方法服務的
5.程序計算器
當前線程所執行的字節碼行號指示器,字節碼解釋器工作時就是通過改變這個計算器的值來選取下一條需要執行的字節碼指令{分支,循環,跳轉,異常處理,線程恢復等基礎功能都需要依賴這個計算器來完成}(僅僅是概念模型,各種虛擬機可能通過更高效的方式去實現)
一個對象在內存中怎麼存放的?
對象的引用是放在棧,對象實例以及成員變量【非靜態的】放在堆,元數據放在方法區(元數據:(描述這個類的信息(Class實例)
3.棧-詳細認識
4.方法區-詳細認識