1. 程式人生 > >「每日五分鐘,玩轉JVM」:執行緒共享區

「每日五分鐘,玩轉JVM」:執行緒共享區

前言

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

堆(Heap)

堆記憶體作為JVM管理的記憶體中最大的一塊,用於存放我們的物件例項,我們經常會把JVM的記憶體簡單的分為堆記憶體和棧記憶體,這樣說雖然有些片面,但是也有這麼說的道理,這兩塊兒一個作為執行程式的,一個作為存放物件的,是JVM中最為重要的兩塊兒記憶體。所以,我們的垃圾收集一般是針對的用於存放物件的堆記憶體,所以堆記憶體有時候也會被稱為GC堆。

從記憶體分配的角度上來說,堆記憶體中包含了新生代記憶體和老年代記憶體,而年輕代又分為Eden和Survivor區。Survivor區由From Survivor和To Survivor組成。Eden區佔大容量,Survivor兩個區佔小容量,預設比例是8:1:1,而且JVM 每次只會使用 Eden 和其中的一塊 Survivor 區域來為物件服務,所以無論什麼時候,總是有一塊 Survivor 區域是空閒著的。

這樣設計的原因是為了更方便的進行垃圾收集,我們會在後面垃圾收集的章節中去詳細的講解。

TLAB

TLAB的全稱是Thread Local Allocation Buffer,即執行緒本地分配快取區,這是一個處於堆記憶體中執行緒私有的記憶體分配區域,預設情況下這個區域就是開啟的,當然我們也可以在啟動時配置XX:+UseTLAB

去開啟該區域,這個區域所佔空間非常的小,預設情況下只佔Eden區域的1%,我們也可以通過也XX:TLABWasteTargetPercent設定TLAB空間所佔用Eden空間的百分比大小。

方法區

方法區儲存虛擬機器載入的類資訊常量靜態變數,即時編譯器編譯後的程式碼等資料,在Java虛擬機器的規範中,把方法區認為是堆記憶體的邏輯部分,但是實際上他們是完全隔離的。

在JDK 8 之前,方法區被稱為(或者可以說是被實現為)持久代,永久代(Perman Gen),而在 JDK 8 之後,取消了永久代的概念,取而代之的實現是元空間(MetaSpace),原本位於永久代中的執行時常量池和靜態變數都儲存到了堆中,而其餘的內容則是移到了元空間。

元空間的本質和永久代類似,都是對JVM規範中方法區的實現,它們之間最大的區別在於:元空間並不在虛擬機器中,而是使用本地記憶體。因此,預設情況下,元空間的大小僅受本地記憶體限制,但可以通過以下引數來指定元空間的大小:-XX:MetaspaceSize-XX:MaxMetaspaceSize

所以我們前幾年JDK7盛行的時候OOM錯誤訊息是這樣的:

java.lang.OutOfMemoryError:PermGen space

而在近幾年JDK8的使用中遇到的OOM是這樣的:

java.lang.OutOfMemoryError:Metaspace

執行時常量池

執行時常量池位於元空間中,用於儲存編譯期生成的各種字面量和符號引用,而這裡需要注意一點:字串常量池從JDK 7 之後就移到了堆記憶體中去管理,但是執行時常量是仍然位於方法區基於JDK 8 的新實現——元空間中。

網上有部分聲音說執行時常量池在JDK8移到了堆記憶體中,其實這種說法是錯誤的,真正移到堆記憶體的是字串常量池,並且是在JDK7的更新中就已經移到了堆中。

更詳細的關於常量池的資訊我們會在類結構中去學習。

後話

每天五分鐘,跟Vi玩轉JVM!

下篇解密一個物件的誕生!

公眾號

本文首發於公眾號,掃碼關注即可獲取最新文章

相關推薦

每日分鐘JVM執行共享

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

每日分鐘JVM執行獨佔

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

每日分鐘JVM物件從哪來

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

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

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

每日分鐘 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物件訪問定位

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

jvm記憶體區域----執行共享

一、堆的含義     jvm堆的區域主要是用來存放物件的例項,它的空間大小是JVM記憶體區域中佔比重最大的,也是jvm最大的記憶體管理模組,最重要的是,這個區域是垃圾收集器主要管理的區域,這意味著我們在考慮垃圾回收優化的時候,首先就要想到堆中的區域。 二、方法區   &nb

深入理解JVM(一)執行時資料

深入理解JVM(一):執行時資料區 執行時資料區 JVM在執行java程式的過程中,會把記憶體分為幾個不同的資料區域,如上圖所示。 程式計數器 雖然圖片中程式計數器所佔的面積比較大,但實際上程式計數器所佔的記憶體非常小,也是唯一一塊在所有JVM中都沒有規定OOM的區

關於JVM記憶體(執行共享與非執行共享

大多數 JVM 將記憶體區域劃分為 Method Area(Non-Heap)(方法區) ,Heap(堆) , Program Counter Register(程式計數器) , VM Stack(虛擬機器棧,也有翻譯成JAVA 方法棧的),Native M

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