1. 程式人生 > >「每日五分鐘,玩轉JVM」:指標壓縮

「每日五分鐘,玩轉JVM」:指標壓縮

64位JVM和32位JVM

最初的時候,JVM是32位的,但是隨著64位系統的興起,JVM也迎來了從32位到64位的轉換,32位的JVM對比64位的記憶體容量比較有限,但是我們使用64位虛擬機器的同時,也帶來了一個問題,64位下的JVM中的物件會比32位中的物件多佔用1.5倍的記憶體空間,這是我們不想看到的(又要馬兒跑,又要馬兒不吃草可還行?),但是機智的程式設計師不會屈服,所以在JDK 1.6的版本後,我們在64位中的JVM中可以開啟指標壓縮(UseCompressedOops)來壓縮我們物件指標的大小來幫助我們節約記憶體空間,拿JDK 8來說,這個指令是預設開啟的。

如果我想要知道我們電腦上安裝的JVM是32位的還是64位的,可以通過下面的這個命令去檢視

如果我們的系統是64位的,當我們輸入java -d32的時候會提示不支援32位的JVM,或者我們通過java -version也可以看到:

image-20190911201937600

指標壓縮

當我們啟用了-XX:+UseCompressedOops之後,我們原本的OOP(Ordinary Object Pointer,普通物件指標)就會被壓縮,當然也不是所有的物件都會被壓縮,只有 以下幾種的物件才會被壓縮

物件的全域性靜態變數(類屬性)

物件頭資訊

物件的引用型別

物件陣列型別

而以下幾種物件則不能被壓縮:

指向PermGen的Class物件指標

區域性變數

傳參

返回值

NULL指標

指標壓縮的大概原理:

  • 通過對齊,還有偏移量將64位指標壓縮成32位。

  • 零基壓縮是針對壓縮解壓動作的進一步優化。 它通過改變正常指標的隨機地址分配特性,強制堆地址從零開始分配。

image-20190911203525671

這裡需要注意:32位HotSpot VM是不支援UseCompressedOops引數的,只有64位HotSpot VM才支援。

下面是32bit和64bit下的壓縮或者不壓縮所佔的大小~

image-20190911221738200

在記憶體結構中的不同

image-20190823231212050

公眾號

相關推薦

每日分鐘JVM指標壓縮

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

每日分鐘JVM執行緒獨佔區

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

每日分鐘JVM執行緒共享區

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

每日分鐘JVM物件從哪來

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

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

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

每日分鐘 JVMGC 概覽

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

每天分鐘 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堆是被所有執行緒共享的一塊記憶體區域,在虛擬機器啟動