程式設計師每日一題-虛擬機棧和堆的秘密?

2020-12-19 菜魚玩三國

每日一題,進步一點。

上題,搞起

關於堆和棧,下列說法錯誤的是

A 每個被調用的方法都會在虛擬機棧創建一個棧幀

B 每個棧幀中包括局部變量表、操作數棧、動態連結、方法返回地址

C 方法區可以指向堆區,堆區不可以指向方法區

D 堆區的對象裡面僅僅存放了自身的實例數據

答案:CD

解析

首先,我們了解一下虛擬機棧,顧名思義,它是一個棧的數據結構,裡面存放的是一個個棧幀,什麼叫棧幀?

每個棧幀對應一個被調用的方法,可以理解為一個方法的運行空間,看一下棧幀的內部結構,結合以下代碼

public static void main(String[] args) {

calc(10,3);

}

public static int calc(int op1,int op2){

int result=op1+op2;

return result;}

虛擬機棧

首先來看每個區域的定義:

局部變量表(Local Variables):方法中定義的局部變量以及方法的參數存放在這張表中 局部變量表中的變量不可直接使用,如需要使用的話,必須通過相關指令將其加載至操作數棧中作為操作數使用

操作數棧(Operand Stack):以壓棧和出棧的方式存儲操作數的

動態連結(Dynamic Linking):每個棧幀都包含一個指向運行時常量池中該棧幀所屬方法的引用,持有這個引用是為了支持方法調用過程中的動態連結。

方法返回地址(Return Address):當一個方法開始執行後,只有兩種方式可以退出,一種是遇到方法返回的字節碼指令;一種是遇見異常,並且 這個異常沒有在方法體內得到處理

結合上面的程序,作為局部變量的result,op1,op2,是放在局部變量表中的,執行運算時,會把常量池中的10和3拿過來放到操作數棧中進行相加,然後再賦值給result,最終把result返回出去,或者發生異常,跳出這個方法。

堆、棧、方法區的相互引用

棧指向堆如果在棧幀中有一個變量,類型為引用類型,比如Object obj=new Object(),這時候就是典型的棧中元素指向堆中的 對象。

2. 方法區指向堆

方法區中會存放靜態變量,常量等數據。如果是下面這種情況,就是典型的方法區中元素指向堆中的對象

private static Object obj=new Object();

3.堆指向方法區

堆指向方法區,是不是很難理解,我們想一想下面這個問題

方法區中會包含類的信息,堆中會有對象,那怎麼知道對象是哪個類創建的呢?

我們堆中的對象,不僅僅記錄對象本身的屬性信息,還有其他我們看不見的東西,一張圖說明一切

一個Java對象在內存中包括3個部分:對象頭、實例數據和對齊填充

其中對象頭中間的Class Pointer就是指向了方法區的元數據地址。

對象頭中還有一個重要的區域,Mark Word,對象鎖的狀態,分代年齡,都在這兒。

實例數據,就不用說了,對象的成員變量的值都在這兒,我們最為熟知的部分。

對齊填充,做個了解,對齊填充並不是必然存在的,也沒有特別的含義,它僅僅起著佔位符的作用。由於HotSpot VM的自動內存管理系統要求對象起始地址必須是8位元組的整數倍,換句話說就是對象的大小必須是8位元組的整數倍。對象頭正好是8位元組的倍數(1倍或者2倍),因此當對象實例數據部分沒有對齊的話,就需要通過對齊填充來補全

拓展

堆可以指向棧嗎?

相關焦點

  • 程式設計師每日一題-jvm裡方法和方法區、棧區的二三事
    每日一題,進步一點。答案是D解析又是JVM相關的,那就先上一個JAVA虛擬機運行時數據區的邏輯圖JAVA虛擬機運行時數據區的邏輯圖好,對照上圖,逐項解釋A:堆區是JVM 所管理的內存中最大的一塊。線程共享,主要是存放對象實例和數組。
  • JVM(堆、方法區、棧、這些基礎您知道了嗎)
    堆(Heap-線程共享)主要存儲: New對象、數組、包括JDK1.7從方法區移過來的字符串常量和靜態變量、還有 線程分配緩衝區(TLAB)當前主流的Java虛擬機都是按照可擴展來實現的(通過參數-Xmx和-Xms設定)、如果在Java堆中沒有內存完成實例分配,並Java虛擬機將會拋出OutOfMemoryError
  • 探究Java 虛擬機棧
    前言Java 虛擬機的內存模型分為兩部分:一部分是線程共享的,包括 Java 堆和方法區;另一部分是線程私有的,包括虛擬機棧和本地方法棧,以及程序計數器這一小部分內存。今天我就 Java 虛擬機棧做一些比較淺的探究。熟悉 Java 的同學應該都知道了,JVM 是基於棧的。但是這個「棧」 具體指的是什麼?難道就是虛擬機棧?
  • 談談java的棧和堆
    先用一張圖展示一下Java堆棧的概況堆方法區:class文件信息,運行時常量池,以及編譯器編譯後的代碼堆:存儲對象,對象包含類的信息,指向方法區>棧虛擬機棧:表示Java方法執行的內存模型,每調用一個方法就會為每個方法生成一個棧幀(Stack Frame),用來存儲局部變量表、操作數棧、動態連結、方法出口等信息。
  • Java虛擬機系列一:一文搞懂 JVM 架構和運行時數據區
    接下來一段時間我會把寫博客的重點放在 JVM (Java Virtual Machine) 和 JUC (java util concurrent ) 上,對 Java 虛擬機和 Java 並發編程進行一系列的介紹,歡迎關注。了解 JVM 是對 Java 開發人員的基本要求,JVM 的相關內容自然也成了現在 Java 程式設計師面試的重要考點。
  • 深入分析Java虛擬機堆和棧及OutOfMemory異常產生原因
    Heap(堆)堆是Java虛擬機所管理內存中最大的一塊,在虛擬機啟動時創建,被所有線程共享。堆在虛擬機啟動時創建,用於存儲所有的對象實例和數組(在某些特殊情況下不是)。堆中的對象永遠不會顯式地釋放,必須由GC自動回收。
  • JVM內存分析,程式設計師進階的必經之路
    當然本人能力有限,只能說盡己之能學的越多越好,全文較長,共三千多字,這還是忽視了一些知識點的…一、Java程序開發三步驟編寫、編譯和運行,圖解如下:①編寫階段②heep:堆這是翻譯成中文後的頁面,原文都是英文,英語好的小夥伴可以直接看,不過翻譯大體上也還算是準確的:堆的線程是共享的(數據共享)堆的區域是用來存放對象和數組
  • [每日一題]131. Palindrome Partitioning
    每日一題]162.Find Peak Element[每日一題]410. Split Array Largest Sum[每日一題]209. Minimum Size Subarray Sum[每日一題]240. Search a 2D Matrix II[每日一題]74.
  • [每日一題]140. Word Break II
    Palindrome Partitioning[每日一題]139. Word Break[每日一題]357. Count Numbers with Unique Digits[每日一題]78. Subsets[每日一題]79.
  • 【每日一題】(287)障壁島
    格陵蘭島的冰山【每日一題】(192)衝越扇【每日一題】(193)高山出好茶【每日一題】(194)綠色圓形農田【每日一題】(195)珊瑚礁形態與風向關係【每日一題】>【每日一題】(226)「地冰花」【每日一題】(227)阿特拉斯山【每日一題】(228)油橄欖【每日一題】(229)雪花形態【每日一題】(230)「地穿甲現象」
  • 【每日一題】(883)「微型冷鋒」--陣風鋒
    在單體雷暴中,上升和下沉氣流的熱力性質、位置、運動特徵等,是影響雷暴形成、發展、消亡的關鍵性因素。強雷暴過境時,在其單體下方,溼冷空氣下沉到地面形成雷暴「冷堆」,並向四周流出,與低空氣流交匯而形成「微型冷鋒」,稱為陣風鋒。它是推動雷暴天氣持續發展的重要條件。圖11為強雷暴天氣時,單體雷暴的低空氣流(局部)示意圖。
  • 程式設計師吐槽:去阿里接手別人做的系統,看起來高大上,其實一堆坑
    一名程式設計師在同行圈子吐槽,阿里太多人做了一個爛產品,看起來高大上,其實一堆坑,估計是接盤了別人做的產品留了一堆坑,故而有次吐槽:真誠相告要去阿里巴巴的人,拿offer前一定要問清楚,入職要做什麼,如果去接手別人的系統,即使hr和老闆說出花來,也不能去。
  • 【每日一題】(33題)面試官:你對圖論了解多少?(三)
    (三)關注「松寶寫代碼」,精選好文,每日一題前兩期的圖論已經介紹完了,今天我們介紹第三期。今天帶來的是Overstars的圖論總結,ACM打比賽,他的方向是思維數論圖論。下文是他和他隊友四年刷圖論的總結。其實本身就是個筆記,以後方便打板子的。
  • Java 基礎知識面試題與知識點總結!(100題)
    Java 基礎知識面試題與知識點知識點:Java基礎知識JavaJava類文件結構 Java類加載過程 Java類加載器 Java雙親委派模型 自定義類加載器 程序計數器 虛擬機棧 本地方法棧 jvm-堆Java IO BIO NIO AIO面試題
  • 能讓應屆生拿到阿里 Offer 的一份面試題
    信息過載的今天,想要找一份靠譜的高頻面試題和權威的答案非常不容易,值得慶幸的是這篇文章為你匯總了大量的乾貨面試資料,下面一起來看吧。3) 本地方法棧本地方法棧(Native Method Stack)與虛擬機棧的作用是一樣的,只不過虛擬機棧是服務 Java 方法的,而本地方法棧是為虛擬機調用 Native 方法服務的。在 Java 虛擬機規範中對於本地方法棧沒有特殊的要求,虛擬機可以自由的實現它,因此在 Sun HotSpot 虛擬機直接把本地方法棧和虛擬機棧合二為一了。
  • 高三每日一題(133)
    >高三每日一題(123):先必要後充分+放縮,研究一道不等式恆成立問題高三每日一題(122):阿氏圓+等和線求向量模的最值,一道向量綜合題高三每日一題(121):坐標法是研究向量的有效手段,向量模最值一例
  • 堆和棧的區分
    不管你是學習c語言,還是學習c++,亦或是學習java,你都會遇到內存分配的問題,而對於內存分配,它其實有兩個地方,一個地方叫做堆,一個地方叫做棧,什麼時候將數據存放到堆上面,什麼時候將數據存放到棧上面,它們的區別是什麼,今天我們就來詳細講解一下。
  • 【每日一題】(245)馬拉開波湖
    )特殊的瀑布【每日一題】(190)湧潮【每日一題】(191)格陵蘭島的冰山【每日一題】(192)衝越扇【每日一題】(193)高山出好茶【每日一題】(194)綠色圓形農田【每日一題】(195)珊瑚礁形態與風向關係【每日一題】(196)植物牆【每日一題】(197)棄風限電1【每日一題】(198)棄風限電2【每日一題】(199)棄風限電
  • [每日一題]面試官問:for in和for of 的區別和原理?
    關注「松寶寫代碼」,精選好文,每日一題時間永遠是自己的每分每秒也都是為自己的將來鋪墊和增值作者:saucxs
  • 【計算機考研】每日一題-數網操組-171
    (1) 試將該序列建成小根堆。(2) 從堆頂上取下一個元素,將堆調整一次。2.[計算機網絡考研].用香農公式計算:假定信道帶寬為3100 HZ,最大信息傳輸速率為35kbit/s,那麼若想使最大信息傳輸速率增加60%。問信噪比S/N應增大到多少倍?如果在上述計算出的基礎上將信噪比S/N再增大到10倍,試問最大信息傳輸速率能否再增加20%?