女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一文讀懂JVM是什么

冬至配餃子 ? 來源:極術社區 ? 作者:betterFighter ? 2022-07-28 15:36 ? 次閱讀

前言

由于先前也遇到過一些性能問題,OOM算是其中的一大類了。因此也對jvm產生了一些興趣。自己對jvm略做了些研究。后續繼續補充。

從oom引申出去

既然說到oom,首先需要知道oom的原因是什么。為啥會oom嘞?
oom的定義是outofmemory。當內存想為對象分配內存的時候,發現內存不足以去分配內存,或者gc的時候發現沒有可以被回收的對象或回收后的內存也不足以為對象分配內存。

因此拋出這個java異常。

oom
可以分為以下四類

1.堆溢出:java堆

2.棧溢出:虛擬機棧和本地方法棧

3.方法區內存溢出:方法區和內存時常量池

4.本機直接內存溢出

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

運行時數據區

先上圖

poYBAGLiO6-AYRh8AABaoIqp-Dk913.png

程序計數器:當前線程所執行的字節碼的行號指示器。

java虛擬機的多線程是通過輪流切換線程,并為線程分配執行時間片去運行來執行的。每個線程都有一個自己的程序計數器。我覺得這個可以這么理解:當一個線程在運行的時候,每執行一步程序計數器都會有個記錄,記錄當前執行到哪一步了。如果線程被切換后又切換回來,那么通過程序計數器就能知道執行到哪一步了,然后繼續向下執行。

虛擬機棧:每個線程都會有一個虛擬機棧。虛擬機棧描述的是java方法執行的內存模型。因為線程執行的過程就是執行線程里的一個個方法,而每個方法都會創建對應自己的棧幀。

棧幀里存的內容如下:

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

操作數棧:大多數指令都要從這里彈出數據,執行運算,然后把結果壓回操作數棧

動態鏈接

方法出口

64位的long和都double類型數據占用2個局部變量空間,其他數據類型占用一個,也就是每個局部變量空間為32位。

在這個地方,如果線程請求的深度大于虛擬機允許的深度,會拋出StackOverflowError.因為jvm分配給虛擬機棧的內存是有限的,而每個方法都會有對應的棧幀壓入到棧中,如果調用方法過多,那么棧滿了自然也就溢出了。(可能的場景:死循環代碼,大量遞歸調用,那排查問題的時候也可以由此有一個思路)。可以通過調整-Xss去調整棧大小。

大部分java虛擬機允許動態擴展,但如果擴展的時候也申請不到足夠內存時,就會報OOM了。

本地方法棧:和虛擬機發揮作用相似。區別:虛擬機棧為虛擬機執行java方法服務,本地方法棧為虛擬機使用的Native方法服務。Native Method就是一個java調用非java代碼的接口,Native方法的實現由非java語言實現。讀者不用糾結,略作了解即可。

:堆是所有線程共享的一塊內存,作用是存放對象實例。堆可以分為新生代和老年代。新生代里還可細分為Eden,From survivor,To survivor等空間。后面講述GC過程時會說到。

方法區:也是所有線程共享的一塊內存,存放被虛擬機加載的類信息,常量,靜態變量,編譯器編譯后的代碼。也就是常說的永久代。

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

運行時常量池:方法區的一部分。存放編譯期生成的各種字面量和符號引用。字面量就是指這個量本身。比如字面量2,就是指2.

運行時常量池有一個重要特性就是動態性。常量不一定只有編譯期才能產生,運行期間也可能將新的常量放入常量池。詳情可見String類的

intern()方法。

直接內存:它不是虛擬機運行時數據區的一部分,但也頻繁的被使用。直接內存不會受到java堆大小的限制,但是會受到本機總內存的限制。

GC過程

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

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

新生代GC過程

新生代里可細分為Eden,From survivor,To survivor等空間。當我們需要給對象分配內存的時候,首先我們會在Eden區為對象分配內存,當Eden區內存不足時,會發生minor gc,此時會把仍然存活的對象放到From survivor,并給對象標記存活次數1;然后當Eden區再次被用完后,對Eden區和From survivor區篩選出存活的對象,放到To survivor區,清空Eden區和From survivor區,存活次數加1,之前存活的就是2了。

以此類推,默認是當存活次數到達15次(可配置)的時候,把這個對象存入老年代中。同時也可以看到,From survivor,To survivor區始終有一個是空置的。所以新生代使用的只有9/10的空間。
然而大家可以思考一下。Eden區和survivor區的大小為8:1,那么發生minor gc后如果存活的對象
的大小比survivor區還要大。這個時候會怎么處理?

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

poYBAGLiO9SAQQccAAAYbuaIYlY922.png

老年代GC過程

老年代采用了標記整理,標記清楚的算法。老年代會把仍然存活的對象都整理統一放到一邊。整理完成后就會清楚掉邊界外的對象。這樣就避免了產生大量的內存碎片的問題。但是整理算法相較于新生代采用的復制算法,復雜程度肯定更高。這也導致了full gc的速度要遠遠慢于minor gc。


審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    20

    文章

    2984

    瀏覽量

    106838
  • 計數器
    +關注

    關注

    32

    文章

    2284

    瀏覽量

    96024
  • 虛擬機
    +關注

    關注

    1

    文章

    962

    瀏覽量

    29023
  • 內存溢出
    +關注

    關注

    0

    文章

    10

    瀏覽量

    1319
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    讀懂什么是磁性編碼器

    磁性編碼器是種用于測量角度和線性位置的傳感器。它使用磁性信號來監測旋轉或線性位置的變化,并把這些變化轉換成數字信號。磁性編碼器可用于各種應用中,比如機器人、汽車、數控機床等領域
    的頭像 發表于 04-27 17:18 ?139次閱讀

    讀懂德明利2024年度報告

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

    讀懂ESD原理

    文件過大,大家下載附件查看全文哦!
    發表于 03-03 16:36

    讀懂:LED 驅動電路二極管挑選要點

    讀懂:LED 驅動電路二極管挑選要點
    的頭像 發表于 02-06 14:47 ?453次閱讀

    讀懂什么是「雷電4」

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

    讀懂德明利內存條產品線

    讀懂德明利內存條產品線
    的頭像 發表于 01-21 15:42 ?415次閱讀
    <b class='flag-5'>一</b>圖<b class='flag-5'>讀懂</b>德明利內存條產品線

    帶你讀懂EBSD

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

    怎樣讀懂ADC的技術手冊,哪些參數比較關鍵?

    請問下各位應該怎樣讀懂ADC的技術手冊,那些參數比較關鍵? 謝謝!
    發表于 12-18 07:26

    讀懂單燈控制器工作原理

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

    讀懂BMS電池管理系統

    、 BMS是什么? BMS是Battery Management System首字母縮寫,電池管理系統。它是配合監控儲能電池狀態的裝置,主要就是為了智能化管理及維護各個電池單元,防止電池出現過充電
    的頭像 發表于 11-01 11:18 ?5903次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讀懂</b>BMS電池管理系統

    讀懂MSA(測量系統分析)

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

    讀懂新能源汽車的功能安全

    電子發燒友網站提供《讀懂新能源汽車的功能安全.pdf》資料免費下載
    發表于 09-04 09:22 ?3次下載

    從原理聊JVM):染色標記和垃圾回收算法

    導讀 JAVA簡單易用的特性,能夠讓研發人員在不了解JVM的底層運行機制的情況下依舊能夠編寫出功能完善的代碼。 但是對JVM的理解,是個程序員普通和優秀的分水嶺。全面地了解JVM的工
    的頭像 發表于 08-20 15:25 ?464次閱讀
    從原理聊<b class='flag-5'>JVM</b>(<b class='flag-5'>一</b>):染色標記和垃圾回收算法

    聊聊JVM如何優化

    首先應該明確的是JVM調優不是常規手段,JVM的存在本身就是為了減輕開發對于內存管理的負擔,當出現性能問題的時候第時間考慮的是代碼邏輯與設計方案,以及是否達到依賴中間件的瓶頸,最后才是針對J
    的頭像 發表于 08-05 17:49 ?704次閱讀
    聊聊<b class='flag-5'>JVM</b>如何優化

    【古瑞瓦特光伏逆變器品牌】讀懂PCS儲能變流器

    【古瑞瓦特光伏逆變器品牌】讀懂PCS儲能變流器 在加快實現雙碳目標和構建新型電力系統的進程中,儲能技術正逐步成為支撐新型電力系統穩定運行、優化資源配置的關鍵技術之。其中,PCS(
    的頭像 發表于 06-14 16:39 ?1856次閱讀
    【古瑞瓦特光伏逆變器品牌】<b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讀懂</b>PCS儲能變流器