Java 8:從PermGen到元空間

您可能已經知道,現在可以下載JDK 8 Early Access 。 這使Java開發人員可以嘗試Java 8的一些新語言和運行時功能。這些功能之一是完全刪除自Oracle自JDK 7發行以來就宣布的Permanent Generation(PermGen)空間。例如,自JDK 7起,它已從PermGen空間中刪除。JDK8版本完成了其退役工作。 本文將分享我們到目前為止在PermGen后繼者Metaspace上找到的信息。 當執行Java程序“泄漏”類元數據對象時,我們還將比較HotSpot 1.7與HotSpot 1.8(b75)的運行時行為。 Java 8正式發布后,有關Metaspace的最終規范,調整標志和文檔應可用。

元空間:

新的存儲空間誕生了

現在,JDK 8 HotSpot JVM使用本機內存來表示類元數據,這稱為元空間。 類似于Oracle JRockit和IBM JVM的 。 好消息是,它不再意味著java.lang.OutOfMemoryError:PermGen空間問題,也不再需要調整和監視此內存空間……不是那么快。 雖然此更改默認情況下是不可見的,但接下來我們將向您顯示,您仍然需要擔心類元數據的內存占用。 還請記住,此新功能不能神奇地消除類和類加載器的內存泄漏。 您將需要使用其他方法并通過學習新的命名約定來跟蹤這些問題。 我建議您閱讀PermGen刪除摘要和Jon對此主題的評論 。

綜上所述:

PermGen空間狀況

  • 此內存空間已完全刪除。
  • PermSize和MaxPermSize JVM參數將被忽略,如果在啟動時出現警告,則會發出警告。

元空間內存分配模型

  • 現在,類元數據的大多數分配都是在本機內存之外分配的。
  • 用來描述類元數據的分類器已被刪除。

元空間容量

  • 默認情況下,類元數據分配受可用本機內存量限制(容量將取決于您是否使用32位JVM與64位以及操作系統虛擬內存的可用性)。
  • 一個新的標志(MaxMetaspaceSize)可用,允許您限制用于類元數據的本機內存量。 如果不指定此標志,則Metaspace將在運行時根據應用程序需求動態調整大小。

元空間垃圾收集

  • 一旦類元數據使用量達到“ MaxMetaspaceSize”,就會觸發死類和類加載器的垃圾收集。
  • 為了限制此類垃圾收集的頻率或延遲,顯然將需要對Metaspace進行適當的監視和調整。 過多的Metaspace垃圾回收可能是類的征兆,類裝入器的內存泄漏或應用程序的大小不足。

Java堆空間影響

  • 一些其他數據已移至Java堆空間。 這意味著在將來的JDK 8升級之后,您可能會發現Java堆空間的增加。

元空間監控

  • HotSpot 1.8詳細GC日志輸出中提供了元空間用法。
  • 根據我們對b75的測試,此時Jstat和JVisualVM尚未更新,并且仍然存在舊的PermGen空間引用。

現在有足夠的理論,讓我們通過泄漏的Java程序來了解這種新的內存空間在起作用……

PermGen與Metaspace運行時比較

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

將測試以下方案:

  • 為了監視和耗盡設置為128 MB的PermGen內存空間,請使用JDK 1.7運行Java程序。
  • 使用JDK 1.8(b75)運行Java程序,以便監視新Metaspace內存空間的動態增加和垃圾回收。
  • 使用JDK 1.8(b75)運行Java程序,以通過將MaxMetaspaceSize值設置為128 MB來模擬元空間的耗盡。

JDK 1.7 @ 64位– PermGen耗盡

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

從JVisualVM可以看到,在加載大約30K +類后,達到了PermGen耗盡。 我們還可以從程序和GC輸出中看到這種消耗。

Class metadata leak simulatorAuthor: Pierre-Hugues Charbonneauhttp://javaeesupportpatterns.blogspot.comERROR: java.lang.OutOfMemoryError: PermGen space

現在,讓我們使用HotSpot JDK 1.8 JRE執行該程序。

JDK 1.8 @ 64位– Metaspace動態調整大小

  • 具有50K配置的迭代的Java程序
  • Java堆空間為1024 MB
  • Java Metaspace空間:無界(默認)

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

JDK 1.8 @ 64位–元空間耗盡

  • 具有50K配置的迭代的Java程序
  • Java堆空間為1024 MB
  • Java元空間空間:128 MB(-XX:MaxMetaspaceSize = 128m)

從JVisualVM可以看到,在加載大約30K +類之后達到了元空間消耗; 與JDK 1.7的運行非常相似。 我們還可以從程序和GC輸出中看到這一點。 另一個有趣的發現是保留的本機內存占用空間是指定的最大大小的兩倍。 如果可能的話,這可能表明有些機會可以微調元空間重新調整大小的策略,以避免本機內存浪費。

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

Class metadata leak simulatorAuthor: Pierre-Hugues Charbonneauhttp://javaeesupportpatterns.blogspot.comERROR: java.lang.OutOfMemoryError: Metadata space

做完了!

不出所料,像我們使用JDK 1.7進行基線運行一樣,將Metaspace的上限限制為128 MB,這使我們無法完成程序的50K迭代。 JVM引發了一個新的OOM錯誤。 內存分配失敗后,JVM從元空間引發了上述OOM事件。

#metaspace.cpp

最后的話

希望您對此早期分析和使用新的Java 8 Metaspace進行試驗表示贊賞。 當前的觀察結果明確表明,將需要進行適當的監視和調整,才能避免出現諸如上一次測試場景中觸發的過多Metaspace GC或OOM條件之類的問題。 未來的文章可能會包括性能比較,以識別與此新功能相關的潛在性能改進。

參考: Java 8: Java EE支持模式和Java教程博客中的JCG合作伙伴 Pierre-Hugues Charbonneau 從PermGen到Metaspace 。

翻譯自: https://www.javacodegeeks.com/2013/02/java-8-from-permgen-to-metaspace.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370094.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370094.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370094.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oracle symonym_ORACLE SYNONYM詳解

以下內容整理自Oracle 官方文檔一 概念A synonym is an alias for any table, view,materialized view, sequence, procedure, function, package, type, Java classschema object, user-defined object type, or another synonym. Because a synonymis simply an alias, it re…

瀏覽器緩存問題原理以及解決方案

瀏覽器緩存問題: 簡單來說,瀏覽器緩存就是把一個已經請求過的Web資源(如html頁面,圖片,js,數據等)拷貝一份副本儲存在瀏覽器中。緩存會根據進來的請求保存輸出內容的副本。當下一個請求來到的時…

Scikit-Learn機器學習入門

現在最常用的數據分析的編程語言為R和Python。每種語言都有自己的特點,Python因為Scikit-Learn庫贏得了優勢。Scikit-Learn有完整的文檔,并實現很多機器學習算法,而每種算法使用的接口幾乎相同,可以非常快的測試其它學習算法。 Pa…

hdu1542 Atlantis(掃描線+線段樹+離散)矩形相交面積

題目鏈接&#xff1a;點擊打開鏈接 題目描寫敘述&#xff1a;給定一些矩形&#xff0c;求這些矩形的總面積。假設有重疊。僅僅算一次 解題思路&#xff1a;掃描線線段樹離散&#xff08;代碼從上往下掃描&#xff09; 代碼&#xff1a; #include<cstdio> #include <al…

瀏覽器滾動條 --- 自定義“衣裳”

由于種種原因&#xff0c;瀏覽器的默認滾動條“衣裳”實在是 (ˉ▽&#xffe3;&#xff5e;)~~&#xff0c;為了“美”&#xff0c;本人結合萬維網各大神給的經驗和自己的實踐&#xff0c;做了此篇總結。若有錯誤&#xff0c;請在評論里給出&#xff0c;我會及時更改。 我在電…

電腦調分辨率黑屏了怎么辦_調顯示器分辨率黑屏怎么辦

調顯示器分辨率黑屏怎么辦調顯示器分辨率黑屏解決方法&#xff1a;1&#xff0c;開機&#xff0c;當快要進入系統選項時&#xff0c;立即按f8鍵進入“高級模式”&#xff0c;因為系統選項界面顯示的時間非常短&#xff0c;可以提早按f8鍵&#xff0c;否則錯過時機就得重來。2&a…

什么是JNDI,SPI,CCI,LDAP和JCA?

JNDI代表Java命名和目錄接口 。 它是用于提供對目錄服務&#xff08;即帶有對象的服務映射名稱&#xff08;字符串&#xff09;&#xff0c;對遠程對象或簡單數據的引用&#xff09;的訪問的API。 這就是所謂的 約束力 。 綁定集稱為上下文 。 應用程序使用JNDI接口訪問資源。…

android studio gradle 學習,學習Android Studio里的Gradle

一直聽說Gradle很強大&#xff0c;只是偶爾用Android Studio創建Demo的時候看到他一次&#xff0c;今天抽個時間完整記錄一下。1.gradle位置Android Studio項目創建好之后&#xff0c;默認有3個gradle文件&#xff0c;分別位于&#xff1a;/settings.gradle/build.gradle/app/b…

接口耗時打印并統計

1.可以利用Tomcat的access-log日志&#xff0c;讓其打印出http請求的每次耗時。可以在 config/server.xml里Host標簽下配置tomcat訪問日志格式 <Valve className"org.apache.catalina.valves.AccessLogValve" directory"logs" prefix&quo…

js內存

js在定義變量時完成了內存的分配 js具有自動垃圾回收機制&#xff0c;垃圾回收器會每隔固定的一段時間就執行一次釋放操作&#xff0c;即找出那些不再繼續使用的值&#xff0c;釋放其占用的內存 js中最常用的是通過標記清除的算法來找到哪些對象是不再繼續使用的&#xff0c;因…

halcon 圖像差分_Halcon編程-基于紋理的mara檢測

表面瑕疵檢測是機器視覺領域非常重要的一個應用。機器視覺是集光學、機電和計算機三個領域的一門不算新的技術。但目前表面瑕疵檢測在學界主要是計算機專業或者控制專業瞄準圖像處理方向在做&#xff0c;而視覺光學系統這一塊主要是光學工程專業在做。很少有研究者把這三塊都結…

Apache Camel入門

在先前的博文中&#xff0c;我們了解了企業集成模式&#xff08;EIP&#xff09;。 現在&#xff0c;在這篇文章中&#xff0c;我們將研究實現這些模式的Apache Camel框架。 關于駱駝&#xff1a; Apache Camel是一個開放源代碼項目&#xff0c;已有將近5年的歷史&#xff0c;…

css 寫打印樣式問題

&#xff08;1&#xff09;背景顏色打印不出來問題解決方法 background樣式要加上 !important&#xff1b;color樣式要加上 !important&#xff1b;-webkit-print-color-adjust: exact;然后記得瀏覽器打印設置里面要在“打印背景圖形”前面打勾。 -webkit-print-color-adjust:…

android studio smssdk,SMSSDK for Android 配置

1.集成之前先要申請Mob的appkey與appsecret2.在Mob官網下載最新SDK&#xff0c;解壓后會看到以下目錄結構&#xff1a;SMSSDK下存放的是短信SDK的全部內容。3.在android studio中加入SMS的第三方庫AS版本的SMSSDK目錄下包含以下內容&#xff1a;MobCommons.jar&#xff1a;Mob …

linux后臺不掛斷運行 nohup命令

//后臺常在 退出終端仍然運行 nohup python pyredis.py & nohup輸出重定向到my.log nohup command > my.log 2>&1 &轉載于:https://www.cnblogs.com/plxm/p/8136833.html

Ubuntu 16.04安裝微信

微信沒有出Linux的版本&#xff0c;但是可以通過以下方式解決&#xff1a; 1、使用網頁版&#xff0c;除了沒有公眾號之后&#xff0c;一切都沒問題&#xff0c;包括傳文件等。 網頁登錄地址&#xff1a;https://wx.qq.com/ 2、使用第三方版本&#xff0c;只不過這個是桌面應用…

navision系統和sap區別_SAP那些事-實戰篇-89-淺談金稅接口方案

以前金稅接口這塊一直是銷售顧問在做&#xff0c;雖然和財務相關&#xff0c;也沒有怎么關注。這次項目把金稅接口分到了財務模塊&#xff0c;結果遇到了一些問題&#xff0c;趁此機會把這塊總結一下方案&#xff0c;供各位看官參考。方案1&#xff1a; 文本方案&#xff0c;這…

不變性的來龍去脈

因此&#xff0c;在我的第一篇文章中&#xff0c;我談到了一些構建器模式&#xff0c;并提到了一個非常強大但卻被忽視的概念&#xff1a;不變性。 什么是不可變類&#xff1f; 這只是一個其實例無法修改的類。 類屬性的每個值都在其聲明或其構造函數中設置&#xff0c;并在對…

JavaScript總結(3)

第3章 獲取用戶的輸入 &#xff1c;script&#xff1e;10 intAprompt("請輸入第一個數字","");11 intBprompt("請輸入第二個數字",27);默認是2712 document.write("你輸入的第一個數字是"intA);13 document.write("&#xff1c;…

css書寫規范

在書寫css樣式的時候總是無意中就寫亂了&#xff0c;無論是命名或者是樣式的書寫順序&#xff0c;這里做一個總結&#xff0c;提醒自己在書寫css的時候時刻注意&#xff0c;大家可以參考哈。 1. 樣式屬性順序 單個樣式規則下的屬性在書寫時&#xff0c;應按功能進行分組&…