1. 程式人生 > >深入理解JVM學習筆記(十七、物件的訪問定位)

深入理解JVM學習筆記(十七、物件的訪問定位)

        之前我們理解java棧堆時可能會說棧中儲存指標,指向堆中的物件地址。其實這種說法是不嚴謹的,其一是java中沒有指標的概念,其二是棧中不一定儲存物件的地址,也可能是其他地址。那麼問題來了,物件是如何進行訪問定位的呢。

        虛擬機器棧是 java方法執行的記憶體模型:每個方法在執行的同時都會建立一個棧幀(Stack Frame)用於儲存區域性變量表、運算元棧、動態連結、方法出口等資訊。

        區域性變量表存放了編譯期可知的各種基本資料型別(long,boolean,int,byte,short,long,double,float)、returnAddress型別(指向了一條位元組碼指令的地址)和物件引用(reference型別,它不代表物件本身,可能是一個指向物件起始地址的引用指標,也可能指向一個物件代表的控制代碼或其他與此物件相關的位置)。

其實java就是通過 棧幀中區域性變量表所儲存的物件引用 來對 堆記憶體中的物件例項進行訪問或操作的!簡單點理解就是 棧幀中有個物件引用的指標, 通過各種方法指向了堆記憶體中的物件例項。

而這各種方法中,主流的有2種:控制代碼、直接指標。

一、控制代碼

        java堆中劃分出一塊記憶體作為控制代碼池,reference中儲存的是物件的控制代碼地址,而控制代碼中包含了物件例項資料與型別資料各自的具體地址資訊。

        使用控制代碼方式最大的好處就是reference中儲存的是穩定的控制代碼地址,在物件被移動(垃圾收集時移動物件是非常普遍的行為)時只會改變控制代碼中的例項資料指標,而reference本身不需要被修改。

二、直接指標

        reference直接指向了物件型別資料,那麼java堆物件分佈中就必須考慮如何放置訪問型別資料的相關資訊,

reference儲存的直接就時物件地址。

        直接訪問物件方式的好處就是,減少一次指標定位的時間開銷,由於物件的訪問是非常頻繁的,因此這類開銷積少成多也是一項非常的執行成本。

相關推薦

深入理解JVM學習筆記(物件訪問定位)

        之前我們理解java棧堆時可能會說棧中儲存指標,指向堆中的物件地址。其實這種說法是不嚴謹的,其一是java中沒有指標的概念,其二是棧中不一定儲存物件的地址,也可能是其他地址。那麼問題來了,物件是如何進行訪問定位的呢。         虛擬機器棧是 java方

深入理解JVM學習筆記(物件的建立)

下圖是JAVA虛擬機器物件的建立過程: 現在我們就以下幾點說明物件的建立: 1、給物件分配記憶體 給物件分配記憶體有指標碰撞和空閒列表兩種方式。具體描述如下圖所示。按時 2、執行緒安全性問題         無論是指標碰撞還是空閒列表,在高併發情況下都有可能存線

深入理解JVM學習筆記(JVM 垃圾回收機制---如何判斷物件是否為垃圾【引用計數法】)

一、引用計數法         引用計數演算法作為垃圾收集器最早的演算法,有其優勢,也有其劣勢,雖然現在的JVM都不再採用引用計數演算法進行垃圾回收【例如Sun的Java hotspot採用了火車演算法進行垃圾回收】,但這種演算法也並未被淘汰,在著名的單程序高併發快取Red

深入理解JVM學習筆記(二JVM 記憶體分配----大物件直接分配到老年代)

一、驗證 首先我們編寫如下程式 package com.zjt.test.jvm008; public class Main { public static void main(String[]

深入理解JVM學習筆記(二JVM 記憶體分配----優先分配到eden&空間分配擔保)

一、優先分配到eden 我們寫一個程式來驗證物件優先分配到eden,原始碼如下: package com.zjt.test.jvm008; public class Main { public static void main(String[] args) { b

深入理解JVM學習筆記(二JVM 垃圾回收機制---如何回收垃圾---回收策略【複製演算法】)

        上一節我們講到了標記-清除演算法因為需要進行兩次記憶體掃描導致效率不高,那麼這一節我們介紹一種複製演算法,比較好的解決了這個問題。        講複製演算法前,我們先回顧一下JVM的記憶體結構。JVM記憶體大體分為兩大塊,分別為執行緒共享區、執行緒獨佔區。

深入理解JVM學習筆記(三JVM 記憶體分配----逃逸分析與棧上分配)

一、概念 我們之前提到過,JVM堆已經不是物件記憶體分配的唯一選擇。 棧上分配就是java虛擬機器提供的一種優化技術,基本思想是對於那些執行緒私有的物件(指的是不可能被其他執行緒訪問的物件),可以將它們打散分配在棧上,而不是分配在堆上。分配在棧上的好處是可以在函式呼叫結束

深入理解JVM學習筆記(一總覽)

1、JVM歷史2、JVM記憶體結構3、JVM垃圾回收機制4、JVM效能監控工具5、JVM效能調優案例時間6、JVM類檔案結構7、JVM類載入機制8、JVM位元組碼執行引擎9、JVM虛擬機器編譯及其執行時

深入理解JVM學習筆記(五JAVA發展歷史)

一、JDK Version 1.0 開發代號為Oak(橡樹),於1996-01-23發行       其提出了“Write Once,Run Anywhere”的口號二、JDK Version 1.1於1997-02-19發行。引入的新特性包括:引入JDBC(Java Dat

學習筆記

文本編輯工具vimvim介紹vim是vi的升級版,相較於vi,會顯示顏色。如果系統沒有vim工具,需要安裝:# yum install -y vim-enhancedvim顏色顯示和移動光標輸入# vim /etc/passwd然後將/etc/passwd放到/tmp/下,輸入# cp /etc/passwd

深入理解JVM閱讀筆記-內存溢出小結

list 小結 sof () add 表示 內存 保存 區域 JAVA系統除了程序計數器和虛擬機內存之外的其它幾個內存區域都有發生OutOfMemory(OOM)的可能。堆,棧,方法區,靜態常量池,直接內存,都是可能的。 1.Java堆溢出 Java堆用於存儲對象實例,只要

Java學習九天總結

常用類及一些常用方法 常用類 系統相關的兩個類 1.System(代表了系統執行平臺) System.currentTimeMillis()是獲得系統當前時間的函式 返回的是系統當前時間和1970-01-01午夜時間的差值得毫秒值 System.nanoTim

深入理解JVM讀書筆記二:虛擬機器類載入機制

一、概述      虛擬機器把描述類的資料從class檔案載入到記憶體,並對資料進行校驗、轉換解析和初始化。最終形成可以被虛擬機器最直接使用的java型別的過程就是虛擬機器的類載入機制。      與那些在編譯時需要進行連線工作的語

深入理解JVM讀書筆記二:垃圾收集器與記憶體分配策略

一、判斷物件死亡的兩種常用演算法:                在堆裡面存放著java世界中幾乎所有的例項物件,垃圾收集器在堆進行回收前,第一件事情就是要確定哪些物件還存活著,哪些已經死去。 1、引

ElasticSearch學習筆記 文件更新及版本控制

文件更新 在 Elasticsearch 中文件是 不可改變 的,不能修改它們。相反,如果想要更新現有的文件,需要 重建索引。但是我們不需要自己來完成操作,Update API 會幫我們完成。 例如我們新插入一條紀錄 PUT /website/blog/1 {

資料科學和人工智慧技術筆記 聚類

十七、聚類 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 凝聚聚類 # 載入庫 from sklearn import datasets from sklearn.preprocessing import Stan

fs4412開發板學習筆記()

# madplay 123.mp3 WM8960 Playback: ASoC: unmatched rate symmetry: 8000 - 44100 output: ioctl(SNDCTL_DSP_SPEED): Invalid argument

Go語言學習筆記()之命令列引數

24.1命令列引數 os.Args命令列引數的切片 1: func main() { 2: name := "Alice" 3: fmt.Println("Good Morning", name) 4: // 說明使用者傳入了引數 5: if len(os.Args) >

java之jvm學習筆記(策略和保護域)

                       前面一節,我們做了一個簡單的實驗,來說明什麼是策略檔案,在文章的最後,也順帶的講了一下什麼是策略,還有策略的作用。                        為了引出另外一個很重要的概念ProtectionDomain(保

EF6學習筆記:快照追蹤與代理追蹤性能測試

ble src play nbsp png 它的 close 延遲加載 tar 要專業系統地學習EF推薦《你必須掌握的Entity Framework 6.x與Core 2.0》。這本書作者(汪鵬,Jeffcky)的博客:https://www.cnblogs.com/Cr