chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文讀懂JVM是什么

冬至配餃子 ? 來(lái)源:極術(shù)社區(qū) ? 作者:betterFighter ? 2022-07-28 15:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

由于先前也遇到過(guò)一些性能問(wèn)題,OOM算是其中的一大類(lèi)了。因此也對(duì)jvm產(chǎn)生了一些興趣。自己對(duì)jvm略做了些研究。后續(xù)繼續(xù)補(bǔ)充。

從oom引申出去

既然說(shuō)到oom,首先需要知道oom的原因是什么。為啥會(huì)oom嘞?
oom的定義是outofmemory。當(dāng)內(nèi)存想為對(duì)象分配內(nèi)存的時(shí)候,發(fā)現(xiàn)內(nèi)存不足以去分配內(nèi)存,或者gc的時(shí)候發(fā)現(xiàn)沒(méi)有可以被回收的對(duì)象或回收后的內(nèi)存也不足以為對(duì)象分配內(nèi)存。

因此拋出這個(gè)java異常。

oom
可以分為以下四類(lèi)

1.堆溢出:java堆

2.棧溢出:虛擬機(jī)棧和本地方法棧

3.方法區(qū)內(nèi)存溢出:方法區(qū)和內(nèi)存時(shí)常量池

4.本機(jī)直接內(nèi)存溢出

因此,需要先了解堆,棧,方法區(qū)都是些啥

運(yùn)行時(shí)數(shù)據(jù)區(qū)

先上圖

poYBAGLiO6-AYRh8AABaoIqp-Dk913.png

程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。

java虛擬機(jī)的多線程是通過(guò)輪流切換線程,并為線程分配執(zhí)行時(shí)間片去運(yùn)行來(lái)執(zhí)行的。每個(gè)線程都有一個(gè)自己的程序計(jì)數(shù)器。我覺(jué)得這個(gè)可以這么理解:當(dāng)一個(gè)線程在運(yùn)行的時(shí)候,每執(zhí)行一步程序計(jì)數(shù)器都會(huì)有個(gè)記錄,記錄當(dāng)前執(zhí)行到哪一步了。如果線程被切換后又切換回來(lái),那么通過(guò)程序計(jì)數(shù)器就能知道執(zhí)行到哪一步了,然后繼續(xù)向下執(zhí)行。

虛擬機(jī)棧:每個(gè)線程都會(huì)有一個(gè)虛擬機(jī)棧。虛擬機(jī)棧描述的是java方法執(zhí)行的內(nèi)存模型。因?yàn)榫€程執(zhí)行的過(guò)程就是執(zhí)行線程里的一個(gè)個(gè)方法,而每個(gè)方法都會(huì)創(chuàng)建對(duì)應(yīng)自己的棧幀。

棧幀里存的內(nèi)容如下:

局部變量表:存放了各種編譯期可知基本數(shù)據(jù)類(lèi)型,對(duì)象引用(引用指針或句柄)

操作數(shù)棧:大多數(shù)指令都要從這里彈出數(shù)據(jù),執(zhí)行運(yùn)算,然后把結(jié)果壓回操作數(shù)棧

動(dòng)態(tài)鏈接

方法出口

64位的long和都double類(lèi)型數(shù)據(jù)占用2個(gè)局部變量空間,其他數(shù)據(jù)類(lèi)型占用一個(gè),也就是每個(gè)局部變量空間為32位。

在這個(gè)地方,如果線程請(qǐng)求的深度大于虛擬機(jī)允許的深度,會(huì)拋出StackOverflowError.因?yàn)閖vm分配給虛擬機(jī)棧的內(nèi)存是有限的,而每個(gè)方法都會(huì)有對(duì)應(yīng)的棧幀壓入到棧中,如果調(diào)用方法過(guò)多,那么棧滿(mǎn)了自然也就溢出了。(可能的場(chǎng)景:死循環(huán)代碼,大量遞歸調(diào)用,那排查問(wèn)題的時(shí)候也可以由此有一個(gè)思路)??梢酝ㄟ^(guò)調(diào)整-Xss去調(diào)整棧大小。

大部分java虛擬機(jī)允許動(dòng)態(tài)擴(kuò)展,但如果擴(kuò)展的時(shí)候也申請(qǐng)不到足夠內(nèi)存時(shí),就會(huì)報(bào)OOM了。

本地方法棧:和虛擬機(jī)發(fā)揮作用相似。區(qū)別:虛擬機(jī)棧為虛擬機(jī)執(zhí)行java方法服務(wù),本地方法棧為虛擬機(jī)使用的Native方法服務(wù)。Native Method就是一個(gè)java調(diào)用非java代碼的接口,Native方法的實(shí)現(xiàn)由非java語(yǔ)言實(shí)現(xiàn)。讀者不用糾結(jié),略作了解即可。

:堆是所有線程共享的一塊內(nèi)存,作用是存放對(duì)象實(shí)例。堆可以分為新生代和老年代。新生代里還可細(xì)分為Eden,From survivor,To survivor等空間。后面講述GC過(guò)程時(shí)會(huì)說(shuō)到。

方法區(qū):也是所有線程共享的一塊內(nèi)存,存放被虛擬機(jī)加載的類(lèi)信息,常量,靜態(tài)變量,編譯器編譯后的代碼。也就是常說(shuō)的永久代。

永久代的大小可以用-XX:MaxPermSize去設(shè)置。

運(yùn)行時(shí)常量池:方法區(qū)的一部分。存放編譯期生成的各種字面量和符號(hào)引用。字面量就是指這個(gè)量本身。比如字面量2,就是指2.

運(yùn)行時(shí)常量池有一個(gè)重要特性就是動(dòng)態(tài)性。常量不一定只有編譯期才能產(chǎn)生,運(yùn)行期間也可能將新的常量放入常量池。詳情可見(jiàn)String類(lèi)的

intern()方法。

直接內(nèi)存:它不是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分,但也頻繁的被使用。直接內(nèi)存不會(huì)受到j(luò)ava堆大小的限制,但是會(huì)受到本機(jī)總內(nèi)存的限制。

GC過(guò)程

GC分為新生代GC(minor gc)和老年代GC(full gc)。新生代GC的頻率遠(yuǎn)遠(yuǎn)高于老年代。而且

新生代GC的速度會(huì)比老年代的GC速度快10倍以上。根源在于新生代和老年代使用的GC算法不同。讀者們可以去仔細(xì)思考下(答案文中有,哈哈)。新生代/老年代大小默認(rèn)為1:2。

新生代GC過(guò)程

新生代里可細(xì)分為Eden,From survivor,To survivor等空間。當(dāng)我們需要給對(duì)象分配內(nèi)存的時(shí)候,首先我們會(huì)在Eden區(qū)為對(duì)象分配內(nèi)存,當(dāng)Eden區(qū)內(nèi)存不足時(shí),會(huì)發(fā)生minor gc,此時(shí)會(huì)把仍然存活的對(duì)象放到From survivor,并給對(duì)象標(biāo)記存活次數(shù)1;然后當(dāng)Eden區(qū)再次被用完后,對(duì)Eden區(qū)和From survivor區(qū)篩選出存活的對(duì)象,放到To survivor區(qū),清空Eden區(qū)和From survivor區(qū),存活次數(shù)加1,之前存活的就是2了。

以此類(lèi)推,默認(rèn)是當(dāng)存活次數(shù)到達(dá)15次(可配置)的時(shí)候,把這個(gè)對(duì)象存入老年代中。同時(shí)也可以看到,F(xiàn)rom survivor,To survivor區(qū)始終有一個(gè)是空置的。所以新生代使用的只有9/10的空間。
然而大家可以思考一下。Eden區(qū)和survivor區(qū)的大小為8:1,那么發(fā)生minor gc后如果存活的對(duì)象
的大小比survivor區(qū)還要大。這個(gè)時(shí)候會(huì)怎么處理?

這里需要引入一個(gè)叫“內(nèi)存分配擔(dān)保機(jī)制”的概念。就是當(dāng)存活的對(duì)象連survivor區(qū)都放不下的時(shí)候,這部分放不下的對(duì)象會(huì)直接進(jìn)入老年代。老年代是擔(dān)保人。老年代進(jìn)行擔(dān)保,前提是老年代還有剩余空間。但是每次存活下來(lái)的對(duì)象大小是不確定的。所以只好取之前每次存儲(chǔ)到老年代的對(duì)象大小的平均值。如果大于平均值,那么直接full gc。但是為了避免頻繁full gc,仍然會(huì)開(kāi)啟handlepromotionfailure配置。如下圖

poYBAGLiO9SAQQccAAAYbuaIYlY922.png

老年代GC過(guò)程

老年代采用了標(biāo)記整理,標(biāo)記清楚的算法。老年代會(huì)把仍然存活的對(duì)象都整理統(tǒng)一放到一邊。整理完成后就會(huì)清楚掉邊界外的對(duì)象。這樣就避免了產(chǎn)生大量的內(nèi)存碎片的問(wèn)題。但是整理算法相較于新生代采用的復(fù)制算法,復(fù)雜程度肯定更高。這也導(dǎo)致了full gc的速度要遠(yuǎn)遠(yuǎn)慢于minor gc。


審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2992

    瀏覽量

    114745
  • 計(jì)數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2302

    瀏覽量

    97174
  • 虛擬機(jī)
    +關(guān)注

    關(guān)注

    1

    文章

    966

    瀏覽量

    29948
  • 內(nèi)存溢出
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

    1392
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    讀懂:CWDM和DWDM的核心差異

    光纖通信里的“兩兄弟”CWDM和DWDM,名字只差個(gè)字母,差別可大了去!今天講透核心差異,小易幫你快速分清~
    的頭像 發(fā)表于 09-17 18:19 ?587次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讀懂</b>:CWDM和DWDM的核心差異

    讀懂 PWM控制背光亮度原理

    關(guān)于PWM控制背光亮度原理的詳細(xì)介紹 讀懂PWM調(diào)光:為何你的屏幕亮度可隨心而變? 你是否曾好奇,手機(jī)或電腦屏幕的亮度是如何從最暗無(wú)級(jí)調(diào)整到最亮的?這背后的魔法,主要?dú)w功于項(xiàng)名為
    發(fā)表于 09-03 08:48

    讀懂光模塊

    隨著人工智能(AI)技術(shù)的飛速發(fā)展,AI數(shù)據(jù)訓(xùn)練及應(yīng)用往往涉及到海量的數(shù)據(jù)傳輸和實(shí)時(shí)交互,對(duì)算力和網(wǎng)絡(luò)的需求正呈現(xiàn)爆發(fā)式的增長(zhǎng)。
    的頭像 發(fā)表于 08-11 17:16 ?2673次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讀懂</b>光模塊

    讀懂高速信號(hào)眼圖

    眼圖是個(gè)統(tǒng)計(jì)疊加的概念,是系列數(shù)字信號(hào)在示波器上積累而顯示的圖形,通過(guò)它可以觀察出碼間串?dāng)_和噪聲對(duì)系統(tǒng)的影響,從而估計(jì)系統(tǒng)優(yōu)劣。個(gè)完整的眼圖應(yīng)該包含從“000”到“111”的所有狀態(tài)組,且
    的頭像 發(fā)表于 07-30 17:33 ?2766次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讀懂</b>高速信號(hào)眼圖

    讀懂什么是磁性編碼器

    磁性編碼器是種用于測(cè)量角度和線性位置的傳感器。它使用磁性信號(hào)來(lái)監(jiān)測(cè)旋轉(zhuǎn)或線性位置的變化,并把這些變化轉(zhuǎn)換成數(shù)字信號(hào)。磁性編碼器可用于各種應(yīng)用中,比如機(jī)器人、汽車(chē)、數(shù)控機(jī)床等領(lǐng)域
    的頭像 發(fā)表于 04-27 17:18 ?579次閱讀

    讀懂德明利2024年度報(bào)告

    讀懂德明利2024年度報(bào)告
    的頭像 發(fā)表于 04-25 22:42 ?345次閱讀
    <b class='flag-5'>一</b>圖<b class='flag-5'>讀懂</b>德明利2024年度報(bào)告

    讀懂ESD原理

    文件過(guò)大,大家下載附件查看全文哦!
    發(fā)表于 03-03 16:36

    讀懂:LED 驅(qū)動(dòng)電路二極管挑選要點(diǎn)

    讀懂:LED 驅(qū)動(dòng)電路二極管挑選要點(diǎn)
    的頭像 發(fā)表于 02-06 14:47 ?887次閱讀

    讀懂什么是「雷電4」

    Thunderbolt讀懂什么是「雷電4」目前大部分PC接口配備了USB接口、音頻接口、HDMI接口等,這些接口的功能基本覆蓋了用戶(hù)的日常使用需求。為了提供更高速、更便捷的數(shù)據(jù)傳輸和設(shè)備連接體
    的頭像 發(fā)表于 02-05 17:52 ?4967次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讀懂</b>什么是「雷電4」

    讀懂德明利內(nèi)存條產(chǎn)品線

    讀懂德明利內(nèi)存條產(chǎn)品線
    的頭像 發(fā)表于 01-21 15:42 ?1047次閱讀
    <b class='flag-5'>一</b>圖<b class='flag-5'>讀懂</b>德明利內(nèi)存條產(chǎn)品線

    帶你讀懂EBSD

    電子背散射衍射(ElectronBackscatterDiffraction,簡(jiǎn)稱(chēng)EBSD)技術(shù)是種基于掃描電子顯微鏡(SEM)的顯微分析技術(shù),它能夠提供材料微觀結(jié)構(gòu)的詳細(xì)信息,包括晶體取向
    的頭像 發(fā)表于 01-14 12:00 ?2471次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>帶你<b class='flag-5'>讀懂</b>EBSD

    怎樣讀懂ADC的技術(shù)手冊(cè),哪些參數(shù)比較關(guān)鍵?

    請(qǐng)問(wèn)下各位應(yīng)該怎樣讀懂ADC的技術(shù)手冊(cè),那些參數(shù)比較關(guān)鍵? 謝謝!
    發(fā)表于 12-18 07:26

    讀懂單燈控制器工作原理

    讀懂單燈控制器工作原理
    的頭像 發(fā)表于 11-11 13:13 ?1757次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讀懂</b>單燈控制器工作原理

    讀懂BMS電池管理系統(tǒng)

    、 BMS是什么? BMS是Battery Management System首字母縮寫(xiě),電池管理系統(tǒng)。它是配合監(jiān)控儲(chǔ)能電池狀態(tài)的裝置,主要就是為了智能化管理及維護(hù)各個(gè)電池單元,防止電池出現(xiàn)過(guò)充電
    的頭像 發(fā)表于 11-01 11:18 ?1.2w次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讀懂</b>BMS電池管理系統(tǒng)

    讀懂MSA(測(cè)量系統(tǒng)分析)

    讀懂MSA(測(cè)量系統(tǒng)分析)
    的頭像 發(fā)表于 11-01 11:08 ?1891次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讀懂</b>MSA(測(cè)量系統(tǒng)分析)