1. 程式人生 > >「每日五分鐘,玩轉JVM」:物件從哪來

「每日五分鐘,玩轉JVM」:物件從哪來

面向物件

眾所周知,Java是一門面向物件的高階程式語言,那麼現在問題來了,物件從哪來呢?有些人會說通過new關鍵字來建立一個物件,說的很好,本篇我們就來解密在new一個物件的過程中,JVM都給我們做了什麼工作。

走哪來,到哪去

一個物件的誕生必定有一個類,通常我們都是通過new關鍵字例項化一個類來獲取該類的一個物件,類在載入的過程中會經歷一系列的檢查,解析,初始化等一系列的過程,我們會在後面詳細的分步驟進行講解,這裡我們只關心物件。

下面物件就要被載入到我們的虛擬機器記憶體的堆記憶體中,載入到堆記憶體中也就意味著這個物件需要一定的空間,那麼這個空間走哪來呢?這裡JVM規範給出了兩種情況:

指標碰撞

所謂指標碰撞,前提的條件是JVM的堆記憶體是絕對工整的,中間有一個指標作為分割空閒空間和已用空間的”三八線“,指標碰撞一般發生在Eden區,跟蹤在Eden建立的最後一個物件,這個物件會被放在Eden的頂部。如果有足夠的空間,物件就會被建立在Eden,並且被放置在頂部,然後將指標向上移動(如果你玩過俄羅斯方塊,你就應該明白,說白了就是一種不可消除絕對規整的俄羅斯方塊),當俄羅斯方塊被堆滿之後,就會觸發一次Minor GC(關於GC的知識,我們在後面來講解)

打個比方來說,一個班裡有很多座位,學生必須按照順序來坐,這樣只需要知道最後一個進來的學生坐哪就知道下一個學生坐哪,以及有沒有空位~

在單執行緒的情況下,我們這樣使用是沒有什麼問題的,但是如果處於多執行緒併發的情況,就會出現分配空間失敗的情況,打個比方來說,就是把一個位置同時賣給了兩個人,這種情況勢必就會打架,這種情況下,我們可以採取兩種方法來解決這個問題:

  • 使用CAS+失敗重試保證更新操作的原子性

CAS(Compare And Swap),關鍵是3個運算元。

記憶體值V

舊的預期值A

要修改的新值B

當且僅當預期值A和記憶體值V相同時,將記憶體值V修改為B,否則什麼都不做。

  • 第二種方法,結合我們上節課說到的TLAB來實現,在分配記憶體的時候在每個執行緒上的TLAB(Thread Local Allocation Buffer)區域進行分配,這裡分配的時候可以初始化為零值,這一步操作保證了物件例項欄位在Java程式碼中不賦值就可以直接使用。

Free List

另一種情況是當堆記憶體不規整的情況下(學生不要排排坐),JVM會把沒來上課的學生(未使用的記憶體)記到小本本上,當有新學生(新的物件)來上課的時候,可以去看本本上的座點陣圖給學生安排座位~

這個JVM的小本本就叫做空閒列表(Free List)。

結語

到這裡,對於虛擬機器,物件就已經找到了自己的座位並落座,下一篇,我們來介紹一下物件中都有什麼。

公眾號

相關推薦

每日分鐘JVM物件

面向物件 眾所周知,Java是一門面向物件的高階程式語言,那麼現在問題來了,物件從哪來呢?有些人會說通過new關鍵字來建立一個物件,說的很好,本篇我們就來解密在new一個物件的過程中,JVM都給我們做了什麼工作。 走哪來,到哪去 一個物件的誕生必定有一個類,通常我們都是通過new關鍵字例項化一個類來獲取該類的

每日分鐘JVM物件記憶體佈局

概覽 一個物件根據不同情況可以被劃分成兩種情況,當物件是一個非陣列物件的時候,物件頭,例項資料,對齊填充在記憶體中三分天下,而陣列物件中在物件頭中多了一個用於描述陣列物件長度的部分 物件頭 物件頭分為兩部分,第一部分稱之為"Mark Word",第二部分是用於獲取該物件型別的型別指標,

每日分鐘JVM執行緒獨佔區

前言 如果我們對計算機組成有所瞭解,那麼我們一定會知道在計算機中有一塊兒特殊的區域,稱之為暫存器,暫存器包括了指令暫存器和程式計數器,這兩樣位於CPU中,作為程式執行的大腦來控制程式的執行和流轉。 而在JVM中,作為一種虛擬機器,JVM沒有指令暫存器,它是基於棧 + 程式計數器的體系結構來完成方法的執行,之所

每日分鐘JVM執行緒共享區

前言 上一篇中,我們瞭解了JVM中的執行緒獨佔區,這節課我們就來了解一下JVM中的執行緒共享區,JVM中的執行緒共享區是跟隨JVM啟動時一起建立的,包括堆(Heap)和方法區()兩部分,而執行緒獨佔區的程式計數器,虛擬機器棧,本地方法棧的生命週期都是跟隨執行緒的,隨執行緒的建立而誕生,隨執行緒的銷燬而銷燬。

每日分鐘 JVMGC 概覽

前言 GC(Garbage Collection)是我們在學習 JVM 的過程中不可避免的一道坎,接下來,我們就來系統的學習一下 GC。 做一件事情之前,我們一定要去知道我們為什麼要去做,這裡不僅僅指 GC,更適用我們日常的學習和生活,知其然,知其所以然,方能百戰不殆。 下面我們先去了解為什麼要有 GC,

每日分鐘JVM指標壓縮

64位JVM和32位JVM 最初的時候,JVM是32位的,但是隨著64位系統的興起,JVM也迎來了從32位到64位的轉換,32位的JVM對比64位的記憶體容量比較有限,但是我們使用64位虛擬機器的同時,也帶來了一個問題,64位下的JVM中的物件會比32位中的物件多佔用1.5倍的記憶體空間,這是我們不想看到的

每天分鐘 JVM物件訪問定位

### 前言 在「物件記憶體佈局」一節中,我們瞭解到物件頭中包含了一個叫做**型別指標**的東西,即物件指向它的類元資料的指標,虛擬機器通過這個指標來確定這個物件是哪個類的例項。但是,並不是所有的虛擬機器都是這麼去做的。不同的虛擬機器關於這點有不同的實現,目前主流的方式可以分為**控制代碼**和**直接指標

ThinkPHP分頁用異步分頁類!

sse replace xpage private 替換 string 設置 nbsp urlencode 具體為什麽用異步來做分頁我就不多說了! 用異步來做分頁,主要還是看分頁類怎麽玩! 方便管理,還是把Ajax分頁作為一個工具來使用: 同樣新建工具類: 多次嘗試,最終

忘記Ghost!利用Win10自帶功能系統備份&恢復 -- 關於恢復的深度思考

如果 mage 不能啟動 技術 硬盤 blog 引導 系統版本 bsp 上一篇文章講了,系統可以正常啟動,如何從D盤恢復系統到C盤的情況。 如果系統不能啟動,要怎麽去恢復系統,恢復後會是什麽結果? 先說明系統結構: 系統版本:Windows 10 (1709) 硬盤1(

【程序員的吃雞大法】利用OCR文字識別+百度算法搜索沖頂大會、百萬英雄、芝士超人等答題贏獎金遊戲

amp lec ios 結果 round 去百度 方式 英雄 oid 【先上一張效果圖】: 一、原理: 其實原理很簡單: 1.手機投屏到電腦; 2.截取投屏畫面的題目部分,進行識別,得到題目和三個答案; 3.將答案按照一定的算法,進行搜索,得出推薦答案; 4.添加了一

zookeeper-1.操作與應用場景-《每日分鐘搞定大數據》

分享 似的 每日 文件 實現 多個 tasks 回復 task Zookeeper作為一個分布式協調系統提供了一項基本服務:分布式鎖服務,分布式鎖是分布式協調技術實現的核心內容。像配置管理、任務分發、組服務、分布式消息隊列、分布式通知/協調等,這些應用實際上都是基於這項

啟程 - 《每日分鐘搞定大數據》

alt 系列 梳理 分享 視頻 了解 href http 不定 ??想了很久,準備開始寫一系列的文章,記錄這些年來的所得所想,感覺內容比較多不知從哪裏開始,畫了個思維導圖確定了大的方向,內容會不斷添加。細節的東西我會邊寫邊定,大家也可以給我一些建議,我會根據寫的內容實時更

YARN-異常大全-《每日分鐘搞定大數據》

管理 cat love guarantee 解決 code 出現 shu sources #問題描述:NodeManager1 cpu負載飆高,進程還在但是不再向ResourceManager發送心跳,不斷重復下文2的動作。心跳停止一段時間後會重連上RM但是cpu仍然很高,

一篇文章搞懂DataSet、DataFrame、RDD-《每日分鐘搞定大數據》

implicit 操作數 frame 大數據 函數 for 臨時 變量 ade 1. 三者共性: 1、RDD、DataFrame、Dataset全都是spark平臺下的分布式彈性數據集,為處理超大型數據提供便利 2、三者都有惰性機制,執行trainform操作時不會立即執

你願意給我分鐘讓我帶你掌握正則表示式嗎?爬蟲必會知識點!

今天小編給大家分享的是Python正則表示式的簡單應用和示例演示,將前面學習的Python正則表示式做一個概括。       進群:548377875  即可獲取大量的零基礎學習資料以及從零基礎到專案實戰的PDF一套哦! &nb

zookeeper-操作與應用場景-《每日分鐘搞定大資料》

Zookeeper作為一個分散式協調系統提供了一項基本服務:分散式鎖服務,分散式鎖是分散式協調技術實現的核心內容。像配置管理、任務分發、組服務、分散式訊息佇列、分散式通知/協調等,這些應用實際上都是基於這項基礎服務由使用者自己摸索出來的。 1.Zookeeper在大資

Android圖片載入框架最全解析(四)Glide的回撥與監聽(筆記)

參考原文:Android圖片載入框架最全解析(四),玩轉Glide的回撥與監聽 回撥的原始碼實現 的Target物件傳入到GenericRequest當中,而Glide在圖片載入完成之後又會回撥GenericRequest的onResourceReady()方法,onReso

10個密信(MeSince)使用技巧郵件加密!

密信(MeSince)加密郵件客戶端不僅提供郵件收發及加解密等郵件核心功能,同時在多個方面提供創新功能、提升使用者體驗。以下10個密信(MeSince)使用技巧,帶您玩轉郵件加密!   下載安裝 密信(MeSince)加密郵件客戶端,支援iOS、安卓、Windows版

jvm系列 02】物件探祕

注意:本文描述的內容是基於HotSpot虛擬機器。 物件的建立 物件建立流程圖 物件建立流程 虛擬機器遇到一條new指令 檢查該指令引數在常量池中能否定位到對應類的符號引用 檢查該類是否被載入、解析和初始化,如果沒有必須先執行載入過程

jvm系列 01】Java虛擬機器的基本結構

Java虛擬機器架構圖 Java虛擬機器基本結構思維導圖 類載入子系統 類載入子系統負責從檔案系統或者網路中載入Class資訊,載入的類資訊存放於一塊稱為方法區的記憶體空間。 Java堆 Java堆是被所有執行緒共享的一塊記憶體區域,在虛擬機器啟動