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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JVM之堆Heap体系概述

發布時間:2024/2/28 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM之堆Heap体系概述 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JVM之堆Heap


目錄:

  • JVM體系結構概覽
  • JVM之堆Heap解析
    2.1 Heap 堆
    2.2 新生區解析
    2.3 永久帶解析

  • 1. JVM體系結構概覽


    2. JVM之堆Heap解析

    2.1 Heap 堆

    • 一個JVM實例只存在一個堆內存,堆內存的大小是可以調節的。類加載器讀取了類文件后,需要把類、方法、常變量放到堆內存中,保存所有引用類型的真實信息,以方便執行器執行,堆內存分為三部分:
    1. Young Generation Space 新生區 Young/New2. Tenure generation space 養老區 Old/ Tenure3. Permanent Space 永久區 Perm

    . 堆邏輯結構圖


    注:永久帶又叫Perm區,只存在于hotspot jvm中,并且只存在于jdk7和之前的版本中,jdk8中已經徹底移除了永久帶,jdk8中引入了一個新的內存區域叫metaspace。


    2.2 新生區解析:

  • 新生區是類的誕生、成長、消亡的區域,一個類在這里產生,應用,最后被垃圾回收器收集,結束生命。
  • 新生區又分為兩部分: 伊甸區(Eden space)和幸存者區(Survivor pace) ,所有的類都是在伊甸區被new出來的。
  • 幸存區有兩個: 0區(Survivor 0 space)和1區(Survivor 1 space)。當伊甸園的空間用完時,程序又需要創建對象,JVM的垃圾回收器將對伊甸園區進行垃圾回收(Minor GC),將伊甸園區中的不再被其他對象所引用的對象進行銷毀。然后將伊甸園中的剩余對象移動到幸存 0區。若幸存 0區也滿了,再對該區進行垃圾回收,然后移動到 1 區。那如果1 區也滿了呢?再移動到養老區。若養老區也滿了,那么這個時候將產生MajorGC(FullGC),進行養老區的內存清理。
  • 若養老區執行了Full GC之后發現依然無法進行對象的保存,就會產生OOM異常“OutOfMemoryError”。
    如果出現java.lang.OutOfMemoryError: Java heap space異常,說明Java虛擬機的堆內存不夠。原因有二:
    (1)Java虛擬機的堆內存設置不夠,可以通過參數-Xms、-Xmx來調整。
    (2)代碼中創建了大量大對象,并且長時間不能被垃圾收集器收集(存在被引用)。

  • 2.3 永久帶解析:

  • 永久存儲區是一個常駐內存區域,用于存放JDK自身所攜帶的 Class,Interface 的元數據,也就是說它存儲的是運行環境必須的類信息,被裝載進此區域的數據是不會被垃圾回收器回收掉的,關閉 JVM 才會釋放此區域所占用的內存。
  • 如果出現java.lang.OutOfMemoryError: PermGen space,說明是Java虛擬機對永久代Perm內存設置不夠。一般出現這種情況,都是程序啟動需要加載大量的第三方jar包。例如:在一個Tomcat下部署了太多的應用。或者大量動態反射生成的類不斷被加載,最終導致Perm區被占滿。

  • 2.4 方法區和堆解析:

  • 實際而言,方法區(Method Area)和堆一樣,是各個線程共享的內存區域,它用于存儲虛擬機加載的:
    類信息+普通常量+靜態常量+編譯器編譯后的代碼等等,雖然JVM規范將方法區描述為堆的一個邏輯部分,但它卻還有一個別名叫做Non-Heap(非堆),目的就是要和堆分開。

  • 對于HotSpot虛擬機,很多開發者習慣將方法區稱之為“永久代(Parmanent Gen)” ,但嚴格本質上說兩者不同,或者說使用永久代來實現方法區而已,永久代是方法區(相當于是一個接口interface)的一個實現,jdk1.8的版本中,已經將原本放在永久代的字符串常量池移走。

  • 補充:RUNTIME CONSTANT POOL,運行時常量池
  • 常量池(Constant Pool)是方法區的一部分,Class文件除了有類的版本、字段、方法、接口等描述信息外,還有一項信息就是常量池,常量池用于存放編譯期間生成的各種字面量和符號引用,這部分內容將在類加載后進入方法區的運行時常量池中存放。

  • 總結

    以上是生活随笔為你收集整理的JVM之堆Heap体系概述的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。