• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Java8:從永久代PermGen到元空間Metaspace

    標簽: java  jvm虛擬機  后端編程  jvm  

    眾所周知java8的新特性之一是完全刪除了永久生成(PermGen)空間,自jdk7發布以來,Oracle就已經宣布了這一點。例如,自jdk7以來,內部字符串已經從PermGen空間中刪除。jdk8版本完成了它的退役。本文將與大家分享到目前為止我們在PermGen繼任者:Metaspace上發現的信息。我們還將比較hotspots1.7和hotspots1.8(b75)在執行Java程序“泄漏”類元數據對象時的運行時行為。一旦java8正式發布,圍繞Metaspace的最終規范、調優標志和文檔應該可以使用。

    元空間Metaspace

    一個新的記憶空間誕生了

    jdk8熱點JVM現在使用本機內存來表示類元數據,稱為Metaspace;類似于oraclejrockitIBMJVM java.lang.OutOfMemoryError:PermGen空間問題,無需再調整和監視此內存空間…不要太快。雖然這個更改在默認情況下是不可見的,但是接下來我們將向您展示您仍然需要擔心類元數據內存占用。請記住,這個新特性并不能神奇地消除類和類加載器內存泄漏。您將需要使用不同的方法并通過學習新的命名約定來跟蹤這些問題。

    總而言之:

    PermGen空間情況

    此內存空間已完全刪除。

    PermSizeMaxPermSize JVM參數將被忽略,如果在啟動時出現,則會發出警告。

    元空間內存分配模型

    類元數據的大多數分配現在都是從本機內存中分配的。

    用于描述類元數據的klasse已被刪除。

    元空間容量

    默認情況下,類元數據分配受可用本機內存量的限制(容量當然取決于是否使用32位JVM而不是64位以及操作系統虛擬內存可用性)。

    有一個新的標志可用(MaxMetaspaceSize),允許您限制用于類元數據的本機內存量。如果不指定此標志,元空間將根據運行時的應用程序需求動態調整大小。

    元空間垃圾回收

    一旦類元數據使用量達到“MaxMetaspaceSize”,就會觸發對死類和類加載器的垃圾回收。

    顯然需要對元空間進行適當的監視和調優,以限制此類垃圾收集的頻率或延遲。過多的元空間垃圾收集可能是類、類加載器內存泄漏或應用程序大小不足的癥狀。

    Java堆空間影響

    一些雜項數據已移動到Java堆空間。這意味著您可能會在未來的jdk8升級后觀察到Java堆空間的增加。

    元空間監測

    Metaspace用法可從HotSpot 1.8詳細GC日志輸出中獲得。

    根據我們對b75的測試,JstatJVisualVM還沒有更新,舊的PermGen空間引用仍然存在。

    理論足夠了,讓我們看看這個新的內存空間是如何通過我們泄漏的Java程序運行的…

    更多細節可以參考這一篇介紹:http://javakk.com/417.html

    PermGen與Metaspace運行時比較

    為了更好地理解新元空間內存空間的運行時行為,我們創建了一個類元數據泄漏Java程序。你可以在這里下載源代碼。

    將測試以下場景:

    • 使用jdk1.7運行Java程序,以監視并耗盡設置為128mb的PermGen內存空間。
    • 使用jdk1.8(b75)運行Java程序,以監視新Metaspace內存空間的動態增加和垃圾收集。
    • 使用jdk1.8(b75)運行Java程序,通過將MaxMetaspaceSize值設置為128mb來模擬元空間的消耗

    JDK 1.7@64位-永久代消耗

    • 具有50K配置迭代的Java程序
    • 1024 MB的Java堆空間
    • Java PermGen空間為128 MB(-XX:MaxPermSize=128m
      www.javakk.com

    正如您在JVisualVM中看到的,PermGen耗盡是在加載了大約30K+個類之后達到的。我們也可以從程序和GC輸出中看到這種消耗。

    Class metadata leak simulator
     
    Author: Pierre-Hugues Charbonneau
     
    http://javaeesupportpatterns.blogspot.com
     
    ERROR: java.lang.OutOfMemoryError: PermGen space
    

    在這里插入圖片描述

    現在讓我們使用hotspotsjdk1.8jre執行該程序。

    JDK 1.8@64位–元空間動態調整大小

    1. 具有50K配置迭代的Java程序
    2. 1024 MB的Java堆空間
    3. Java元空間:無邊界(默認)

    在這里插入圖片描述

    從詳細的GC輸出中可以看到,JVM元空間確實從20mb動態擴展到328mb的保留本機內存,以滿足Java程序增加的類元數據內存占用。我們還可以觀察到JVM試圖銷毀任何死類或類加載器對象時的垃圾收集事件。由于我們的Java程序正在泄漏,JVM別無選擇,只能動態擴展元空間內存空間。該程序能夠在沒有OOM事件的情況下運行其50K次迭代,并加載了50K+個類。讓我們轉到最后一個測試場景。

    JDK 1.8@64位-元空間耗盡

    1. 具有50K配置迭代的Java程序
    2. 1024 MB的Java堆空間
    3. Java元空間:128 MB(-XX:MaxMetaspaceSize=128m
      在這里插入圖片描述

    正如您在JVisualVM中看到的,元空間耗盡是在加載了大約30K+個類之后達到的;這與jdk1.7的運行非常相似。我們也可以從程序和GC輸出中看到這一點。另一個有趣的觀察是,保留的本機內存占用是指定的最大大小的兩倍。這可能表明有機會微調Metaspace resize策略(如果可能),以避免本機內存浪費。

    現在在下面找到我們從Java程序輸出中得到的異常。

    Class metadata leak simulator
     
    Author: Pierre-Hugues Charbonneau
     
    http://javaeesupportpatterns.blogspot.com
     
    ERROR: java.lang.OutOfMemoryError: Metadata space
    

    正如預期的那樣,將元空間限制在128MB,就像我們在JDK1.7的基線運行中所做的那樣,不允許我們完成程序的50K迭代。JVM拋出了一個新的OOM錯誤。上面的OOM事件是JVM在內存分配失敗后從元空間拋出的
    在這里插入圖片描述

    當前的觀察結果明確表明,為了避免諸如上一個測試場景觸發的過多的元空間GC或OOM條件等問題,需要進行適當的監控和調優。以后的文章可能會包括性能比較,以確定與此新特性相關的潛在性能改進。

    文章來源:http://javakk.com/421.html
    也歡迎大家關注我的公眾號【Java老K】獲取更多干貨

    版權聲明:本文為zxs0564335原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/zxs0564335/article/details/109322726

    智能推薦

    Metaspace 之一:Metaspace整體介紹(永久代被替換原因、元空間特點、元空間內存查看分析方法)

    文章目錄 回顧 一、元空間替換持久代 1.1、持久代 1.2、為什么移除持久代 1.3、移除持久代后,PermGen空間的狀況 二、元空間 2.1、metaspace的組成 2.2、元空間的特點 2.3、元空間的內存分配模型 理解_mark和_klass指針 指針壓縮概要 元空間和類指針壓縮空間的區別 三、元空間內存管理 四、Metaspace調優 MaxMetaspaceSize的調優 Comp...

    Java 字符串常量池到底是在PermGen方法區、是在heap堆里面、還是在Metaspace 元空間里面呢?

    要是沒有實踐過別人書本上的理論的話,就還是會說常量池在方法區里面,要是知道方法區已經隨jdk升級,被逐步干掉的話,就會看到有的文章說移動到heap堆里面了,還有極少的說移動到Metaspace里面了,產生了分歧。這個時候就需要實踐出真知了。 代碼很簡單,那本書上也大致是這個樣子。String.intern()會將字符串丟到字符串常量池里面。以此來不斷增加常量池的使用部分。 jdk1.6的測試 他當...

    MySql數據庫之審計(開啟log+設置init-connect實現無插件審計)

    目錄 一、查詢審計配置情況 二、永久開啟審計 三、臨時開啟審計 四、設置init-connect 1、創建用于存放連接日志的數據庫和表 2、授權某個用戶擁有對審計表的select和insert權限 3、設置init_connect參數 五、驗證 六、番外 注:有關MySql數據庫的其他操作請參見MySql目錄進行查找。 一、查詢審計配置情況 show global variables like '...

    相對定位與絕對定位應用

    1、子絕父相 如圖所示的導航條,是通過相對定位與絕對定位共同完成的。 在僅使用相對定位的情況下,由于相對定位在標準流中仍然占有一定的空間,會對頁面布局產生不良的影響,所以不能僅僅使用相對定位。 所以父標簽使用相對定位,而子標簽則使用絕對標簽,這樣既不會對頁面布局產生不良的影響,又可以更方便的進行布局。 2、水平居中 width: 50%,代表著把寬度變為瀏覽器當前頁面寬度的一半,不論頁面大或是小,...

    python+unittest框架生成HTML測試報告

    1、下載HTMLTestReportCN、HTMLTestReportEN、HTMLTestRunner.py文件并把他放到python安裝目錄下的Lib里 具體的文件需要修改,因為這三個都是根據python2語法進行編寫,我們需要把他轉換成python3語法 分享下已經適配python3語法的下載鏈接: https://download.csdn.net/download/weixin_4645...

    猜你喜歡

    Day06 JavaSE面向對象OOP(上) (Object-Oriented Programming)

    JavaSE 面向對象OOP(上) 一、面向對象概述 1 面向過程&面向對象區別 面向過程 第一步做什么,第二步做什么… 面向過程適合處理一些簡單的問題。 面向對象 分類的思維模式,首先分類,隨后逐個解決分類下的細節。 面向對象適合處理負責的問題,適合多人協作的問題。 以類的方式組織代碼,以對象組織封裝數據 面向對象三大特性:封裝、繼承、多態 2 方法回顧+補充 方法的定義 ...

    d3d程序調試方法——一個簡單的d3d程序

    1、安裝directx sdk 安裝包: 解壓: 2、創建C++控制臺應用程序 3、導入頭文件和源文件 注:在x86解決方案下進行調試!!!!! 4、添加包含目錄和庫目錄 配置屬性——VC++目錄 包含目錄:D:\Software Install\D3D_SDK\Include(根據自己解壓的文件夾目錄,選擇Include文件夾路徑) 庫目錄:D:\Software Ins...

    一文解析Synchronized

    1 三個窗口賣50張票 1.1 TicketWindowRunnable 1.2 測試 2 synchronized 關鍵字synchronized可以保證在同一時刻,只有一個線程可以執行某個方法或某個代碼塊。 2.1 修改TicketWindowRunnable 2.2 測試 3 查看匯編 4 synchronized應用方式 4.1 對象鎖 (1) 代碼 4.2 This鎖 4.3 This鎖...

    Centos 6.9安裝docker

      由于docker要求運行的linux內核版本為3.8以上,因此,在安裝之前,要查看一下宿主機操作系統的內核版本,否則如果是內核低于3.8,能夠成功安裝docker,但進入docker后,會自動退出。 1、下載安裝Centos 6.9 Centos 6 系列,最新版本為6.9,由于 docker 只能運行在64位系統上,因此到Centos的官網上選擇某個鏡像 下載 ...

    SSM與android端數據交互

    一.前言 最近第一次用ssm與安卓端實現了數據交互,我這里數據交互通過傳送接受JSON數據來實現的。實現了登錄注冊和對某些實體類數據的增刪改查。   二.后端的具體實現 我們實體類的數據和安卓端的實體數據名字要是相同的,不然獲取不到后端發送的JSON數據,作為后端我們不用去了解安卓端是怎么實現發送和接受JSON數據,我們只要保證實體類屬性名相同,并給他們一個后端接口(一個URL地址),也...

    精品国产乱码久久久久久蜜桃不卡