AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

深入理解Java虛擬機:對象實例化及直接內存詳解

來源: 責編: 時間:2024-04-10 08:37:47 161觀看
導讀前言在Java世界中,萬物皆對象。當我們談論一個對象時,其實質是指代一段具有特定屬性和行為的內存區域。在JVM的視角下,對象的存儲并非簡單的字節序列堆積,而是遵循著嚴謹的結構設計與管理規則。從創建到消亡,一個Java對象

前言

在Java世界中,萬物皆對象。當我們談論一個對象時,其實質是指代一段具有特定屬性和行為的內存區域。在JVM的視角下,對象的存儲并非簡單的字節序列堆積,而是遵循著嚴謹的結構設計與管理規則。從創建到消亡,一個Java對象在JVM中的生命歷程主要圍繞堆內存展開,而堆正是JVM內存模型中用于存儲對象實例的主要區域。afW28資訊網——每日最新資訊28at.com

本文將圍繞對象的實例化、對象內存布局、對象的訪問定位和直接內存展開介紹說明。afW28資訊網——每日最新資訊28at.com

對象實例化

圖片圖片afW28資訊網——每日最新資訊28at.com

創建對象的方式

最常見的方式new、Xxx的靜態方法,XxxBuilder/XxxFactory的靜態方法:afW28資訊網——每日最新資訊28at.com

Student student = new Student();

Class的newInstance方法:反射的方式,只能調用空參的構造器,權限必須是public:afW28資訊網——每日最新資訊28at.com

Class clazz = Class.forName("org.yian.Student");Student student = (Student) clazz.newInstance();

Constructor的newInstance(XXX):反射的方式,可以調用空參、帶參的構造器,權限沒有要求:afW28資訊網——每日最新資訊28at.com

Student.class.getConstructor().newInstance();

使用clone():不調用任何的構造器,要求當前的類需要實現Cloneable接口,實現clone():afW28資訊網——每日最新資訊28at.com

Student clone = student.clone();

使用序列化:從文件中、從網絡中獲取一個對象的二進制流:afW28資訊網——每日最新資訊28at.com

public class Student implements Serializable {    private String name;    private Integer age;     public String getName() {        return name;    }     public void setName(String name) {        this.name = name;    }     public Integer getAge() {        return age;    }     public void setAge(Integer age) {        this.age = age;    }     public void say() {        System.out.println("hello i'm yian!"+this.age);    }      public static void main(String[] args) throws Exception {         Student student = new Student();        student.setAge(10);        String filePath = "com";        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));        oos.writeObject(student);        oos.close();        System.out.println("序列化完成!");         ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));        Student student1 = (Student) ois.readObject();        ois.close();        student1.say();        System.out.println("反序列化完成!");     }}

第三方庫 Objenesis:afW28資訊網——每日最新資訊28at.com

Objenesis objenesis = new ObjenesisStd();ObjectInstantiator<Student> instantiator = objenesis.getInstantiatorOf(Student.class);Student st = instantiator.newInstance();

創建對象的步驟

字節碼分析對象創建

javap -v -p Student.class:afW28資訊網——每日最新資訊28at.com

圖片圖片afW28資訊網——每日最新資訊28at.com

  • new:會首先檢查這個Class有沒有加載,即加載、鏈接、初始化?并按照編譯中的大小信息分配空間,進行創建對象 ,并對其臨時初始化
  • dup:第一句new會在操作數棧中生成一個指向該對象的引用,dup指令會將這個引用再復制一遍,放到操作數棧的棧頂,上面那個引用是作為一個句柄指向方法區的對應方法。
  • invokespecial :進行真實初始化,為其賦實際的初始值【即調用構造器方法<init>】

注意:afW28資訊網——每日最新資訊28at.com

<init>與<clinit>的區別:前者是一個類的構造器在字節碼中對應的方法,后者習慣被稱為類構造器方法,他會在類加載的初始化階段對類的靜態部分進行初始化【如靜態代碼塊,靜態成員變量等】afW28資訊網——每日最新資訊28at.com

JVM創建對象的步驟

1.判斷對象對應的類是否加載、鏈接、初始化afW28資訊網——每日最新資訊28at.com

虛擬機遇到一條new指令,首先去檢查這個指令的參數能否在Metaspace的常量池中定位到一個類的符號引用,并且檢查這個符號引用代表的類是否已經被加載,解析和初始化(即判斷類元信息是否存在)afW28資訊網——每日最新資訊28at.com

如果沒有,那么在雙親委派模式下,使用當前類加載器以ClassLoader + 包名 + 類名為key進行查找對應的.class文件;afW28資訊網——每日最新資訊28at.com

  • 如果沒有找到文件,則拋出ClassNotFoundException異常
  • 如果找到,則進行類加載,并生成對應的Class對象

2.為對象分配內存afW28資訊網——每日最新資訊28at.com

首先計算對象占用空間的大小,接著在堆中劃分一塊內存給新對象。如果實例成員變量是引用變量,僅分配引用變量空間即可,即4個字節大小afW28資訊網——每日最新資訊28at.com

如果內存規整:虛擬機將采用的是指針碰撞法(Bump The Point)來為對象分配內存。afW28資訊網——每日最新資訊28at.com

  • 所有用過的內存在一邊,空閑的內存放另外一邊,中間放著一個指針作為分界點的指示器,分配內存就僅僅是把指針指向空閑那邊挪動一段與對象大小相等的距離罷了。如果垃圾收集器選擇的是Serial、ParNew這種基于壓縮算法的,虛擬機采用這種分配方式。一般使用帶Compact(整理)過程的收集器時,使用指針碰撞

如果內存不規整:虛擬機需要維護一個空閑列表(Free List)來為對象分配內存afW28資訊網——每日最新資訊28at.com

  • 已使用的內存和未使用的內存相互交錯,那么虛擬機將采用的是空閑列表來為對象分配內存。意思是虛擬機維護了一個列表,記錄上那些內存塊是可用的,再分配的時候從列表中找到一塊足夠大的空間劃分給對象實例,并更新列表上的內容

選擇哪種分配方式由Java堆是否規整所決定,而Java堆是否規整又由所采用的垃圾收集器是否帶有壓縮整理功能決定。afW28資訊網——每日最新資訊28at.com

3.處理并發問題afW28資訊網——每日最新資訊28at.com

  • 采用CAS失敗重試、區域加鎖保證更新的原子性
  • 每個線程預先分配一塊TLAB:通過設置-XX:+UseTLAB參數來設定

4.初始化分配到的內存afW28資訊網——每日最新資訊28at.com

所有屬性設置默認值,保證對象實例字段在不賦值時可以直接使用afW28資訊網——每日最新資訊28at.com

5.設置對象的對象頭afW28資訊網——每日最新資訊28at.com

  • Mark Word:存儲對象自身的運行時元數據,如哈希碼(HashCode)、GC分代年齡、鎖狀態標志、偏向線程ID等。這些信息直接影響對象的內存管理、線程同步以及方法調用等操作
  • 類型指針:指向方法區中的類型信息,如類的元數據、方法表、常量池等。通過類型指針,JVM能夠快速定位到對象所屬類的詳細定義,實現方法調度、字段訪問等操作

6.執行init方法進行初始化afW28資訊網——每日最新資訊28at.com

在Java程序的視角看來,初始化才正式開始。初始化成員變量,執行實例化代碼塊,調用類的構造方法,并把堆內對象的首地址賦值給引用變量afW28資訊網——每日最新資訊28at.com

對象初始化初始化順序為:默認 -> 顯式或靜態代碼塊 -> 構造方法 -> setterafW28資訊網——每日最新資訊28at.com

對象內存布局

圖片圖片afW28資訊網——每日最新資訊28at.com

對象頭

對象頭包含了兩部分,分別是運行時元數據和類型指針。如果是數組,還需要記錄數組的長度。afW28資訊網——每日最新資訊28at.com

運行時元數據:afW28資訊網——每日最新資訊28at.com

  • 哈希值(HashCode)
  • GC分代年齡
  • 鎖狀態標志
  • 線程持有的鎖
  • 偏向線程ID
  • 偏向時間戳

類型指針:afW28資訊網——每日最新資訊28at.com

  • 指向類元數據InstanceKlass,確定該對象所屬的類型

實例數據

它是對象真正存儲的有效信息,包括程序代碼中定義的各種類型的字段(包括從父類繼承下來的和本身擁有的字段)afW28資訊網——每日最新資訊28at.com

  • 相同寬度的字段總是被分配在一起
  • 父類中定義的變量會出現在子類之前
  • 如果CompactFields參數為true(默認為true):子類的窄變量可能插入到父類變量的空隙

對齊填充

不是必須的,也沒有特別的含義,僅僅起到占位符的作用afW28資訊網——每日最新資訊28at.com

小結:

public class Customer{    int id = 1001;    String name;    Account acct;    {        name = "匿名客戶";    }    public Customer() {        acct = new Account();    }}public class CustomerTest{    public static void main(string[] args){        Customer cust = new Customer();    }}

圖片圖片afW28資訊網——每日最新資訊28at.com

對象的訪問定位

圖片圖片afW28資訊網——每日最新資訊28at.com

JVM是如何通過棧幀中的對象引用訪問到其內部的對象實例?afW28資訊網——每日最新資訊28at.com

句柄訪問

圖片圖片afW28資訊網——每日最新資訊28at.com

reference中存儲穩定句柄地址,對象被移動(垃圾收集時移動對象很普遍)時只會改變句柄中實例數據指針即可,reference本身不需要被修改afW28資訊網——每日最新資訊28at.com

直接指針(HotSpot采用)

圖片圖片afW28資訊網——每日最新資訊28at.com

直接指針是局部變量表中的引用,直接指向堆中的實例,在對象實例中有類型指針,指向的是方法區中的對象類型數據afW28資訊網——每日最新資訊28at.com

直接內存

不是虛擬機運行時數據區的一部分,也不是《Java虛擬機規范》中定義的內存區域。直接內存是在Java堆外的、直接向系統申請的內存區間。來源于NIO,通過存在堆中的DirectByteBuffer操作Native內存。通常,訪問直接內存的速度會優于Java堆,即讀寫性能高afW28資訊網——每日最新資訊28at.com

非直接緩存區

圖片圖片afW28資訊網——每日最新資訊28at.com

使用IO讀寫文件,需要與磁盤交互,需要由用戶態切換到內核態。在內核態時,需要兩份內存存儲重復數據,效率低。afW28資訊網——每日最新資訊28at.com

直接緩存區

圖片圖片afW28資訊網——每日最新資訊28at.com

使用NIO時,操作系統劃出的直接緩存區可以被java代碼直接訪問,只有一份。NIO適合對大文件的讀寫操作。afW28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-82512-0.html深入理解Java虛擬機:對象實例化及直接內存詳解

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 讓我們從零開始詳解 Elasticsearch

下一篇: 2024 抖音歡笑中國年之編輯器技巧與實踐

標簽:
  • 熱門焦點
  • K60至尊版狂暴引擎2.0加持:超177萬跑分斬獲性能第一

    Redmi的后性能時代戰略發布會今天下午如期舉辦,在本次發布會上,Redmi公布了多項關于和聯發科的深度合作,以及新機K60 Ultra在軟件和硬件方面的特性,例如:“K60 至尊版,雙芯旗艦
  • 5月iOS設備性能榜:M1 M2依舊是榜單前五

    和上個月一樣,沒有新品發布的iOS設備性能榜的上榜設備并沒有什么更替,僅僅只有跑分變化而產生的排名變動,剛剛開始的蘋果WWDC2023,推出的產品也依舊是新款Mac Pro、新款Mac Stu
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數量是否小于或等于一個數字。例如,一個擁有三個或更多子項的grid。你可能會想,為什么需要這樣做呢?在某些情況下,一個組件或一個布局可能會
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個人開發仿造稿定設計的圖片編輯器到現在,不知不覺已過去一年時間了,期間我經歷了裁員失業、面試找工作碰壁,寒冬下一直沒有很好地履行計劃.....這些就放在日
  • “又被陳思誠騙了”

    作者|張思齊 出品|眾面(ID:ZhongMian_ZM)如今的國產懸疑電影,成了陳思誠的天下。最近大爆電影《消失的她》票房突破30億斷層奪魁暑期檔,陳思誠再度風頭無兩。你可以說陳思誠的
  • 蘋果、三星、惠普等暫停向印度出口筆記本和平板電腦

    集微網消息,據彭博社報道,在8月3日印度突然禁止在沒有許可證的情況下向印度進口電腦/平板及顯示器等產品后,蘋果、三星電子和惠普等大公司暫停向印度
  • 三星電子Q2營收60萬億韓元 存儲業務營收同比仍下滑超過50%

    7月27日消息,據外媒報道,從三星電子所發布的財報來看,他們主要利潤來源的存儲芯片業務在今年二季度仍不樂觀,營收同比仍在大幅下滑,所在的設備解決方案
  • 回歸OPPO兩年,一加贏了銷量,輸了品牌

    成為OPPO旗下主打性能的先鋒品牌后,一加屢創佳績。今年618期間,一加手機全渠道銷量同比增長362%,憑借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
  • 2022爆款:ROG魔霸6 冰川散熱系統持續護航

    喜逢開學季,各大商家開始推出自己的新產品,進行打折促銷活動。對于忠實的端游愛好者來說,能夠擁有一款夢寐以求的筆記本電腦是一件十分開心的事。但是現在的
Top