日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

JVM运行时数据区分析

發(fā)布時(shí)間:2025/1/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM运行时数据区分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

#1.概述

整個(gè)JVM構(gòu)成??,由三部分組成:類加載器機(jī)制運(yùn)?時(shí)數(shù)據(jù)區(qū)、執(zhí)?引擎

#2.JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)的規(guī)范

我們來(lái)聊聊這個(gè)規(guī)范怎么理解,目前運(yùn)行數(shù)據(jù)區(qū)共分為了方法區(qū)、堆、虛擬機(jī)棧、本地方法棧、程序計(jì)數(shù)器共5大模塊。

就拿方法區(qū)來(lái)說(shuō),、?法區(qū)是Java虛擬機(jī)規(guī)范中的定義,是?種規(guī)范,?永久代和元空間是 HotSpot 虛擬機(jī)不同版本的兩種實(shí)現(xiàn)。下面我們會(huì)詳細(xì)說(shuō)明為什么。

#2.1.JVM運(yùn)?時(shí)數(shù)據(jù)按照線程使?情況和職責(zé)分成兩?類

#2.1.1.線程獨(dú)享

不需要垃圾回收 職責(zé):程序執(zhí)?區(qū)域 虛擬機(jī)棧、本地?法棧、程序計(jì)數(shù)器

#2.1.2.線程共享

垃圾回收、存儲(chǔ)類的靜態(tài)數(shù)據(jù)和對(duì)象數(shù)據(jù) 職責(zé):數(shù)據(jù)存儲(chǔ)區(qū)域 堆和?法區(qū)

概括地說(shuō)來(lái),JVM初始運(yùn)行的時(shí)候都會(huì)分配好Method Area(方法區(qū))Heap(堆),而JVM 每遇到一個(gè)線程,就為其分配一個(gè)Program Counter Register(程序計(jì)數(shù)器),?VM Stack(虛擬機(jī)棧)和Native Method Stack?(本地方法棧),當(dāng)線程終止時(shí),三者(虛擬機(jī)棧,本地方法棧和程序計(jì)數(shù)器)所占用的內(nèi)存空間也會(huì)被釋放掉。這也是為什么我把內(nèi)存區(qū)域分為線程共享和非線程共享的原因,非線程共享的那三個(gè)區(qū)域的生命周期與所屬線程相同,而線程共享的區(qū)域與JAVA程序運(yùn)行的生命周期相同,所以這也是系統(tǒng)垃圾回收的場(chǎng)所只發(fā)生在線程共享的區(qū)域(實(shí)際上對(duì)大部分虛擬機(jī)來(lái)說(shuō)知發(fā)生在Heap上)的原因。

#2.2.JVM的運(yùn)?時(shí)數(shù)據(jù)區(qū)的使?順序

線程共享的兩塊運(yùn)?時(shí)數(shù)據(jù)區(qū),是在JVM啟動(dòng)的時(shí)候,就已經(jīng)按照參數(shù)設(shè)置進(jìn)?內(nèi)存分配了。另外也就是說(shuō),線程獨(dú)享的三塊運(yùn)?時(shí)數(shù)據(jù)區(qū),不是隨著JVM啟動(dòng)?分配內(nèi)存的。

這里要注意一下,這里說(shuō)的運(yùn)行時(shí)數(shù)據(jù)區(qū)就是指方法區(qū)和堆兩塊。在整個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū)虛擬機(jī)棧和本地方法棧、程序計(jì)數(shù)器這三塊沒(méi)有數(shù)據(jù)的存儲(chǔ)的嗎?

#2.3.JVM啟動(dòng)的時(shí)候,干了什么東西?

#2.4.程序執(zhí)行的時(shí)候,JVM又干了什么東西?

#3.Hotspot運(yùn)?時(shí)數(shù)據(jù)區(qū)

jdk1.7之前,HotSpot虛擬機(jī)對(duì)于?法區(qū)的實(shí)現(xiàn)稱之為永久代Permanent Generation 。 jdk1.8之后,HotSpot虛擬機(jī)對(duì)于?法區(qū)的實(shí)現(xiàn)稱之為元空間Meta Space ?法區(qū)是Java虛擬機(jī)規(guī)范中的定義,是?種規(guī)范,?永久代和元空間是 HotSpot 虛擬機(jī)不同版本的兩種實(shí)現(xiàn)。

#3.1.不同 JDK版本方法區(qū)和堆存儲(chǔ)數(shù)據(jù)的變化

首先在真實(shí)機(jī)器上JVM運(yùn)行時(shí),JVM里的堆和方法區(qū)都是需要占據(jù)真實(shí)機(jī)器的內(nèi)存的。因此上面那個(gè)圖可以理解最外面那層代表就是機(jī)器內(nèi)存。

參考:JVM與Linux的內(nèi)存關(guān)系詳解:JVM 與 Linux 的內(nèi)存關(guān)系詳解 - 知乎

1.6版本的時(shí)候,方法區(qū)中永久代存儲(chǔ)的數(shù)據(jù)有類信息、運(yùn)行時(shí)常量池、靜態(tài)變量、JIT編譯之后的代碼。

在1.7版本,oracle開(kāi)始去永久代計(jì)劃,在這個(gè)版本中,方法區(qū)中永久代就只保留了類的信息、JIT編譯之后的代碼、OOM。相比1.6版本,1.7版本吧運(yùn)行時(shí)常量池(字符串常量池)放到了堆中來(lái)管理。

在1.8版本之后,真正的去除了永久代,方法區(qū)的具體實(shí)現(xiàn)變成了“元空間”,元空間保存了類信息、JIT編譯之后的代碼。

#3.2.分配JVM內(nèi)存空間

#3.2.1分配堆的大小

–Xms(堆的初始容量) -Xmx(堆的最?容量) # 如果為了提?性能,可以考慮去浪費(fèi)空間,就是將初始容量和最?容量相等

#3.2.2.分配方法區(qū)的大小

-XX:PermSize永久代的初始容量 -XX:MaxPermSize永久代的最?容量 -XX:MetaspaceSize元空間的初始??,達(dá)到該值就會(huì)觸發(fā)垃圾收集進(jìn)?類型卸載,同時(shí)GC會(huì)對(duì)該值進(jìn)?調(diào)整:如果釋放了?量的空間,就適當(dāng)降低該值;如果釋放了很少的空間,那么在不超過(guò)MaxMetaspaceSize時(shí),適當(dāng)提?該值。-XX:MaxMetaspaceSize最?空間,默認(rèn)是沒(méi)有限制的。 除了上?兩個(gè)指定??的選項(xiàng)以外,還有兩個(gè)與 GC 相關(guān)的屬性: -XX:MinMetaspaceFreeRatio在GC之后,最?的Metaspace剩余空間容量的百分?,減少為分配空間所導(dǎo)致的垃圾收集 -XX:MaxMetaspaceFreeRatio在GC之后,最?的Metaspace剩余空間容量的百分?,減少為釋放空間所導(dǎo)致的垃圾收集

#3.2.3.分配線程空間的??

-Xss:為jvm啟動(dòng)的每個(gè)線程分配的內(nèi)存??,默認(rèn)JDK1.4中是256K,JDK1.5+中是1M

#4.方法區(qū)

#4.1.?法區(qū)存儲(chǔ)內(nèi)容

類型信息,?如Class ?法信息,?如Method(?法名稱、?法參數(shù)列表、?法返回值信息) 字段信息,?如Field(字段類型,字段名稱需要特殊設(shè)置才能保存的住) Code區(qū),存儲(chǔ)的是?法執(zhí)?對(duì)應(yīng)的字節(jié)碼指令 ?法表(?法調(diào)?的時(shí)候) 在A類的main?法中去調(diào)?B類的method1?法,是根據(jù)B類的?法表去查找合適的?法,進(jìn)?調(diào)?的。 靜態(tài)變量(類變量)---JDK1.7之后,轉(zhuǎn)移到堆中存儲(chǔ) 運(yùn)?時(shí)常量池(字符串常量池)---class中的常量池加載?來(lái)---JDK1.7之后,轉(zhuǎn)移到堆中存儲(chǔ) * 字?量類型 ? ?* 雙引號(hào)引起來(lái)的字符串值,?如"kkb" ----- 會(huì)進(jìn)?字符串常量池(StringPool) ? ?* final修飾的變量 ? ?* ?final修飾的變量,?如long、double、float * 引?類型-->內(nèi)存地址 ? ?* 類的符號(hào)引? ? ?* ?法 ? ?* 字段 JIT編譯器編譯之后的代碼緩存 如果需要訪問(wèn)?法區(qū)中類的其他信息,都必須先獲得Class對(duì)象,才能取訪問(wèn)該Class對(duì)象關(guān)聯(lián)的?法信息或者字段信息。

#4.1.1.類型信息(重點(diǎn))

類型的全限定名 超類的全限定名 直接超接?的全限定名 類型標(biāo)志(該類是類類型還是接?類型) 類的訪問(wèn)描述符(public、private、default、abstract、final、static)

#4.1.2.類型的常量池

存放該類型所?到的常量的有序集合,包括直接常量(如字符串、整數(shù)、浮點(diǎn)數(shù)的常量)和對(duì)其他類 型、字段、?法的符號(hào)引?。 常量池中每?個(gè)保存的常量都有?個(gè)索引,就像數(shù)組中的字段?樣。因?yàn)槌A砍刂斜4嬷蓄愋褪?到的類型、字段、?法的字符引?,所以它也是動(dòng)態(tài)連接的主要對(duì)象(在動(dòng)態(tài)鏈接中起到核?作?)。

#4.1.3.字段信息(該類聲明的所有字段)(重點(diǎn))

字段修飾符(public、protect、private、default) 字段的類型 字段名稱

#4.1.4.?法信息(重點(diǎn))

?法信息中包含類的所有?法,每個(gè)?法包含以下信息

?法修飾符 ?法返回類型 ?法名 ?法參數(shù)個(gè)數(shù)、類型、順序等 ?法字節(jié)碼 操作數(shù)棧和該?法在棧幀中的局部變量區(qū)?? 異常表

#4.1.5.類變量(靜態(tài)變量)(重點(diǎn))

指該類所有對(duì)象共享的變量,即使沒(méi)有任何實(shí)例對(duì)象時(shí),也可以訪問(wèn)的類變量。它們與類進(jìn)?綁定。

#4.1.6.指向類加載器的引?

每?個(gè)被JVM加載的類型,都保存這個(gè)類加載器的引?,類加載器動(dòng)態(tài)鏈接時(shí)會(huì)?到。

#4.1.7.指向Class實(shí)例的引?

類加載的過(guò)程中,虛擬機(jī)會(huì)創(chuàng)建該類型的Class實(shí)例,?法區(qū)中必須保存對(duì)該對(duì)象的引?。通過(guò) Class.forName(String className)來(lái)查找獲得該實(shí)例的引?,然后創(chuàng)建該類的對(duì)象。

#4.1.8.?法表(重點(diǎn))

為了提?訪問(wèn)效率,JVM可能會(huì)對(duì)每個(gè)裝載的?抽象類,都創(chuàng)建?個(gè)數(shù)組,數(shù)組的每個(gè)元素是實(shí)例可能 調(diào)?的?法的直接引?,包括?類中繼承過(guò)來(lái)的?法。這個(gè)表在抽象類或者接?中是沒(méi)有的。

#4.1.9.運(yùn)?時(shí)常量池(Runtime Constant Pool)

class?件中除了有類的版本、字段、?法、接?等描述信息外,還有?項(xiàng)信息是常量池,?于存放編譯器?成的各種字?常量和符號(hào)引?,這部分內(nèi)容被類加載后進(jìn)??法區(qū)的運(yùn)?時(shí)常量池中存放。 運(yùn)?時(shí)常量池相對(duì)于class?件常量池的另外?個(gè)特征具有動(dòng)態(tài)性,可以在運(yùn)?期間將新的常量放?池中 (典型的如String類的intern()?法)。

#5.?法區(qū)、永久代和元空間區(qū)別

?法區(qū)是抽象出來(lái)的概念。 ?永久代元空間是?法區(qū)的具體實(shí)現(xiàn)。 永久代和元空間的區(qū)別是什么? 1.JDK1.8之前使?的?法區(qū)實(shí)現(xiàn)是永久代、JDK1.8及以后使?的?法區(qū)實(shí)現(xiàn)是元空間。 2.永久代所使?的內(nèi)存區(qū)域是JVM進(jìn)程所使?的區(qū)域,它的??受整個(gè)JVM的??所限制。元空間所使?的內(nèi)存區(qū)域是物理內(nèi)存區(qū)域。那么元空間的使???只會(huì)受物理內(nèi)存??的限制。 3.永久代存儲(chǔ)的信息基本上就是上??法區(qū)存儲(chǔ)內(nèi)容中的數(shù)據(jù)。元空間只存儲(chǔ)類的元信息,?靜態(tài)變量和運(yùn)?時(shí)常量池都挪到堆中。 為什么要使?元空間來(lái)替換永久代? 1.Oracle收購(gòu)了Java,?收購(gòu)之前的Sun使?的JVMHotspot,?法區(qū)的實(shí)現(xiàn)是永久代,?Oracle?身也有?個(gè)JVM的實(shí)現(xiàn),是JRockit,它的?法區(qū)就是元空間。收購(gòu)之后,打算合?為?。 2.運(yùn)?時(shí)常量池如果在JVM的內(nèi)存中的話,如果使?不當(dāng),很容易出現(xiàn)內(nèi)存溢出,因?yàn)橛谰么峙涞??,?較?。

#5.1.永久代和元空間存儲(chǔ)位置和存儲(chǔ)內(nèi)容的區(qū)別

存儲(chǔ)位置不同,永久代是占據(jù)JVM進(jìn)程內(nèi)存空間的,?元空間屬于本地內(nèi)存; 存儲(chǔ)內(nèi)容不同,元空間存儲(chǔ)類的元信息,[靜態(tài)變量][常量池]等并?堆中。相當(dāng)于永久代的數(shù)據(jù)被分到了堆和元空間中。

微信掃一掃:關(guān)注我個(gè)人訂閱號(hào)“猿小飛”,更多精彩文章在這里及時(shí)發(fā)布:

?

總結(jié)

以上是生活随笔為你收集整理的JVM运行时数据区分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。