從class到對象

一、JVM運行時數據區
運行時數據區.png
  • 程序計數器
    當前線程所執行字節碼行號指示器,唯一一個沒有OOE的區域
    線程切換后能恢復到正確的執行位置
  • 虛擬機棧
    生命周期和線程一致,描述java方法執行的內存模型:每個方法執行時都會創建一個棧幀(Stack Frame) ,用于存儲局部變量表、操作數棧、動態鏈接、方法出入口等信息。每一個方法從調用到執行完成,就對應著一個棧幀在虛擬機棧中入棧到出棧。
  • 本地方法棧
    為JVM使用到的Native方法服務。
  • java堆
    線程共享的區域,此內存區域的唯一目的就是存放對象實例。所有對象實例及數組都要在堆上分配。
    從內存回收角度:堆 = 新生代(Eden + From Survivor + To Survivor) + 老生代。
    從內存分配角度:堆中可能劃分出多個線程私有的分配緩沖器(TLAB)。
-Xmx:最大可用堆空間      -Xms:初始分配空間
-Xmn:年輕代空間          -Xss:每個線程堆棧大小
  • 方法區(也稱永久代)
    用于存放已被JVM加載的類信息、常量、靜態變量等。
    運行時常量池是方法區的一部分,對應于Class文件中的常量池

注:String.intern()
native方法,如果字符串常量池中已包含,就返回其引用,否則加入到常量池中,再返回引用。

  • 1.6中,會把首次遇到的字符串復制到永久帶,返回永久代的引用
  • 1.7后,intern方法不再復制,只是在常量池中記錄首次出現的引用。(估計這樣,由于永久代有引用,所以字符串不會被回收,變相成為一個常量,并且不占用永久代空間)
二、對象的創建

JVM遇到new指令:

  1. 首先檢查能否在常量池中定位到類的符號引用,并檢查符號引用代表的類是否已被加載,解析和初始化。
  2. 然后為對象分配內存
  3. 分配內存之后JVM會將內存空間都初始化為零值(不包括對象頭)。
  4. JVM對對象進行必要設置
    對象是哪個類的實例、類型指針(指向元數據)、對象的Hash碼、對象的GC分代年齡、鎖狀態標志、線程持有的鎖、偏向線程id、偏向時間戳等,這些信息存放在對象頭
  5. 執行<init>方法


    圖片1.png
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 從三月份找實習到現在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發崗...
    時芥藍閱讀 42,360評論 11 349
  • 這篇文章是我之前翻閱了不少的書籍以及從網絡上收集的一些資料的整理,因此不免有一些不準確的地方,同時不同JDK版本的...
    高廣超閱讀 15,697評論 3 83
  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區別 13、...
    Miley_MOJIE閱讀 3,729評論 0 11
  • 在一個方法內部定義的變量都存儲在棧中,當這個函數運行結束后,其對應的棧就會被回收,此時,在其方法體中定義的變量將不...
    Y了個J閱讀 4,438評論 1 14
  • 內存溢出和內存泄漏的區別 內存溢出:out of memory,是指程序在申請內存時,沒有足夠的內存空間供其使用,...
    Aimerwhy閱讀 755評論 0 1