最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8新特性之再見Permgen_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年06月08日 14:01:06   投稿:mrr  
這篇文章主要介紹了Java8新特性之再見Permgen的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧

很多開發(fā)者都在其系統(tǒng)中見過“java.lang.OutOfMemoryError: PermGen space”這一問題。這往往是由類加載器相關(guān)的內(nèi)存泄漏以及新類加載器的創(chuàng)建導(dǎo)致的,通常出現(xiàn)于代碼熱部署時(shí)。相對(duì)于正式產(chǎn)品,該問題在開發(fā)機(jī)上出現(xiàn)的頻率更高,在產(chǎn)品中最常見的“問題”是默認(rèn)值太低了。常用的解決方法是將其設(shè)置為256MB或更高。

PermGen space簡單介紹

PermGen space的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域,說說為什么會(huì)內(nèi)存益出:這一部分用于存放Class和Meta的信息,Class在被 Load的時(shí)候被放入PermGen space區(qū)域,它和和存放Instance的Heap區(qū)域不同,所以如果你的APP會(huì)LOAD很多CLASS的話,就很可能出現(xiàn)PermGen space錯(cuò)誤。這種錯(cuò)誤常見在web服務(wù)器對(duì)JSP進(jìn)行pre compile的時(shí)候。

JVM 種類有很多,比如 Oralce-Sun Hotspot, Oralce JRockit, IBM J9, Taobao JVM(淘寶好樣的?。┑鹊取.?dāng)然武林盟主是Hotspot了,這個(gè)毫無爭議。需要注意的是,PermGen space是Oracle-Sun Hotspot才有,JRockit以及J9是沒有這個(gè)區(qū)域。

元空間(MetaSpace)一種新的內(nèi)存空間誕生

JDK8 HotSpot JVM 將移除永久區(qū),使用本地內(nèi)存來存儲(chǔ)類元數(shù)據(jù)信息并稱之為:元空間(Metaspace);這與Oracle JRockit 和IBM JVM's很相似,如下圖所示

這意味著不會(huì)再有java.lang.OutOfMemoryError: PermGen問題,也不再需要你進(jìn)行調(diào)優(yōu)及監(jiān)控內(nèi)存空間的使用……但請(qǐng)等等,這么說還為時(shí)過早。在默認(rèn)情況下,這些改變是透明的,接下來我們的展示將使你知道仍然要關(guān)注類元數(shù)據(jù)內(nèi)存的占用。請(qǐng)一定要牢記,這個(gè)新特性也不能神奇地消除類和類加載器導(dǎo)致的內(nèi)存泄漏。

java8中metaspace總結(jié)如下:

PermGen 空間的狀況

這部分內(nèi)存空間將全部移除。

JVM的參數(shù):PermSize 和 MaxPermSize 會(huì)被忽略并給出警告(如果在啟用時(shí)設(shè)置了這兩個(gè)參數(shù))。

Metaspace 內(nèi)存分配模型

大部分類元數(shù)據(jù)都在本地內(nèi)存中分配。

用于描述類元數(shù)據(jù)的“klasses”已經(jīng)被移除。

Metaspace 容量

默認(rèn)情況下,類元數(shù)據(jù)只受可用的本地內(nèi)存限制(容量取決于是32位或是64位操作系統(tǒng)的可用虛擬內(nèi)存大?。?。

新參數(shù)(MaxMetaspaceSize)用于限制本地內(nèi)存分配給類元數(shù)據(jù)的大小。如果沒有指定這個(gè)參數(shù),元空間會(huì)在運(yùn)行時(shí)根據(jù)需要?jiǎng)討B(tài)調(diào)整。

Metaspace 垃圾回收

對(duì)于僵死的類及類加載器的垃圾回收將在元數(shù)據(jù)使用達(dá)到“MaxMetaspaceSize”參數(shù)的設(shè)定值時(shí)進(jìn)行。

適時(shí)地監(jiān)控和調(diào)整元空間對(duì)于減小垃圾回收頻率和減少延時(shí)是很有必要的。持續(xù)的元空間垃圾回收說明,可能存在類、類加載器導(dǎo)致的內(nèi)存泄漏或是大小設(shè)置不合適。

Java 堆內(nèi)存的影響

一些雜項(xiàng)數(shù)據(jù)已經(jīng)移到Java堆空間中。升級(jí)到JDK8之后,會(huì)發(fā)現(xiàn)Java堆 空間有所增長。

Metaspace 監(jiān)控

元空間的使用情況可以從HotSpot1.8的詳細(xì)GC日志輸出中得到。

Jstat 和 JVisualVM兩個(gè)工具,在使用b75版本進(jìn)行測(cè)試時(shí),已經(jīng)更新了,但是還是能看到老的PermGen空間的出現(xiàn)。

前面已經(jīng)從理論上充分說明,下面讓我們通過“泄漏”程序進(jìn)行新內(nèi)存空間的觀察……

PermGen vs. Metaspace 運(yùn)行時(shí)比較

    為了更好地理解Metaspace內(nèi)存空間的運(yùn)行時(shí)行為,

    將進(jìn)行以下幾種場景的測(cè)試:

1.使用JDK1.7運(yùn)行Java程序,監(jiān)控并耗盡默認(rèn)設(shè)定的85MB大小的PermGen內(nèi)存空間。

2.使用JDK1.8運(yùn)行Java程序,監(jiān)控新Metaspace內(nèi)存空間的動(dòng)態(tài)增長和垃圾回收過程。

3.使用JDK1.8運(yùn)行Java程序,模擬耗盡通過“MaxMetaspaceSize”參數(shù)設(shè)定的128MB大小的Metaspace內(nèi)存空間。

首先建立了一個(gè)模擬PermGen OOM的代碼

public class ClassA {
 public void method(String name) {
 // do nothing
 }
}

上面是一個(gè)簡單的ClassA,把他編譯成class字節(jié)碼放到D:/classes下面,測(cè)試代碼中用URLClassLoader來加載此類型上面類編譯成class

/**
 * 模擬PermGen OOM
 * 
 */
public class OOMTest {
 public static void main(String[] args) {
  try {
   //準(zhǔn)備url
   URL url = new File("D:/classes").toURI().toURL();
   URL[] urls = {url};
   //獲取有關(guān)類型加載的JMX接口
   ClassLoadingMXBean loadingBean = ManagementFactory.getClassLoadingMXBean();
   //用于緩存類加載器
   List<ClassLoader> classLoaders = new ArrayList<ClassLoader>();
   while (true) {
    //加載類型并緩存類加載器實(shí)例
    ClassLoader classLoader = new URLClassLoader(urls);
    classLoaders.add(classLoader);
    classLoader.loadClass("ClassA");
    //顯示數(shù)量信息(共加載過的類型數(shù)目,當(dāng)前還有效的類型數(shù)目,已經(jīng)被卸載的類型數(shù)目)
    System.out.println("total: " + loadingBean.getTotalLoadedClassCount());
    System.out.println("active: " + loadingBean.getLoadedClassCount());
    System.out.println("unloaded: " + loadingBean.getUnloadedClassCount());
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

虛擬機(jī)器參數(shù)設(shè)置如下:-verbose -verbose:gc

設(shè)置-verbose參數(shù)是為了獲取類型加載和卸載的信息

設(shè)置-verbose:gc是為了獲取垃圾收集的相關(guān)信息

JDK 1.7 @64-bit – PermGen 耗盡測(cè)試

Java1.7的PermGen默認(rèn)空間為85 MB(或者可以通過-XX:MaxPermSize=XXXm指定)

可以從上面的JVisualVM的截圖看出:當(dāng)加載超過6萬個(gè)類之后,PermGen被耗盡。我們也能通過程序和GC的輸出觀察耗盡的過程。

程序輸出(摘取了部分)

......
[Loaded ClassA from file:/D:/classes/]
total: 64887
active: 64887
unloaded: 0
[GC 245041K->213978K(536768K), 0.0597188 secs]
[Full GC 213978K->211425K(644992K), 0.6456638 secs]
[GC 211425K->211425K(656448K), 0.0086696 secs]
[Full GC 211425K->211411K(731008K), 0.6924754 secs]
[GC 211411K->211411K(726528K), 0.0088992 secs]
...............
java.lang.OutOfMemoryError: PermGen space

JDK 1.8 @64-bit – Metaspace大小動(dòng)態(tài)調(diào)整測(cè)試

Java的Metaspace空間:不受限制 (默認(rèn))

從上面的截圖可以看到,JVM Metaspace進(jìn)行了動(dòng)態(tài)擴(kuò)展,本地內(nèi)存的使用由20MB增長到646MB,以滿足程序中不斷增長的類數(shù)據(jù)內(nèi)存占用需求。我們也能觀察到JVM的垃圾回收事件—試圖銷毀僵死的類或類加載器對(duì)象。但是,由于我們程序的泄漏,JVM別無選擇只能動(dòng)態(tài)擴(kuò)展Metaspace內(nèi)存空間。程序加載超過10萬個(gè)類,而沒有出現(xiàn)OOM事件。

JDK 1.8 @64-bit – Metaspace 受限測(cè)試

Java的Metaspace空間:128MB(-XX:MaxMetaspaceSize=128m)

可以從上面的JVisualVM的截圖看出:當(dāng)加載超過2萬個(gè)類之后,Metaspace被耗盡;與JDK1.7運(yùn)行時(shí)非常相似。我們也能通過程序和GC的輸出觀察耗盡的過程。另一個(gè)有趣的現(xiàn)象是,保留的原生內(nèi)存占用量是設(shè)定的最大大小兩倍之多。這可能表明,如果可能的話,可微調(diào)元空間容量大小策略,來避免本地內(nèi)存的浪費(fèi)。

從Java程序的輸出中看到如下異常。

[Loaded ClassA from file:/D:/classes/]
total: 21393
active: 21393
unloaded: 0
[GC (Metadata GC Threshold) 64306K->57010K(111616K), 0.0145502 secs]
[Full GC (Metadata GC Threshold) 57010K->56810K(122368K), 0.1068084 secs]
java.lang.OutOfMemoryError: Metaspace

在設(shè)置了MaxMetaspaceSize的情況下,該空間的內(nèi)存仍然會(huì)耗盡,進(jìn)而引發(fā)“java.lang.OutOfMemoryError: Metadata space”錯(cuò)誤。因?yàn)轭惣虞d器的泄漏仍然存在,而通常Java又不希望無限制地消耗本機(jī)內(nèi)存,因此設(shè)置一個(gè)類似于MaxPermSize的限制看起來也是合理的。

總結(jié)

1.之前不管是不是需要,JVM都會(huì)吃掉那塊空間……如果設(shè)置得太小,JVM會(huì)死掉;如果設(shè)置得太大,這塊內(nèi)存就被JVM浪費(fèi)了。理論上說,現(xiàn)在你完全可以不關(guān)注這個(gè),因?yàn)镴VM會(huì)在運(yùn)行時(shí)自動(dòng)調(diào)校為“合適的大小”;

2.提高Full GC的性能,在Full GC期間,Metadata到Metadata pointers之間不需要掃描了,別小看這幾納秒時(shí)間;

3.隱患就是如果程序存在內(nèi)存泄露,像OOMTest那樣,不停的擴(kuò)展metaspace的空間,會(huì)導(dǎo)致機(jī)器的內(nèi)存不足,所以還是要有必要的調(diào)試和監(jiān)控。

相關(guān)文章

  • Java全面解析XML格式串(JDOM解析)

    Java全面解析XML格式串(JDOM解析)

    下面小編就為大家?guī)硪黄狫ava全面解析XML格式串(JDOM解析)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • Idea啟動(dòng)SpringBoot程序報(bào)錯(cuò):Veb server failed to start. Port 8082 was already in use;端口沖突的原理與解決方案

    Idea啟動(dòng)SpringBoot程序報(bào)錯(cuò):Veb server failed to&nbs

    這篇文章主要介紹了Idea啟動(dòng)SpringBoot程序報(bào)錯(cuò):Veb server failed to start. Port 8082 was already in use;端口沖突的原理與解決方案,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • MyBatis中insert操作返回主鍵的實(shí)現(xiàn)方法

    MyBatis中insert操作返回主鍵的實(shí)現(xiàn)方法

    在使用MyBatis做持久層時(shí),insert語句默認(rèn)是不返回記錄的主鍵值,而是返回插入的記錄條數(shù)。這篇文章主要介紹了MyBatis中insert操作返回主鍵的方法,需要的朋友可以參考下
    2016-09-09
  • 使用SpringMVC的@Validated注解驗(yàn)證的實(shí)現(xiàn)

    使用SpringMVC的@Validated注解驗(yàn)證的實(shí)現(xiàn)

    這篇文章主要介紹了使用SpringMVC的@Validated注解驗(yàn)證的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 詳細(xì)總結(jié)Java for循環(huán)的那些坑

    詳細(xì)總結(jié)Java for循環(huán)的那些坑

    在平常寫代碼的過程中循環(huán)是不可避免的,雖然for的語法并不復(fù)雜,但是在開發(fā)中還是會(huì)遇到一些坑,雖然大部分的坑都是自己的騷操作導(dǎo)致的.今天來總結(jié)一下for循環(huán)在開發(fā)中可能遇到的坑,不要在同樣的問題上再次犯錯(cuò).需要的朋友可以參考下
    2021-05-05
  • Java服務(wù)端服務(wù)監(jiān)控:Prometheus與Spring Boot Actuator的集成方式

    Java服務(wù)端服務(wù)監(jiān)控:Prometheus與Spring Boot Actuator的集成方式

    本文介紹了如何將Prometheus與SpringBootActuator集成,實(shí)現(xiàn)對(duì)Java服務(wù)端應(yīng)用的監(jiān)控,通過集成,可以利用Prometheus的強(qiáng)大監(jiān)控能力,及時(shí)發(fā)現(xiàn)和解決性能問題
    2024-12-12
  • 使用SpringBoot代碼詳細(xì)解釋<List>的用法

    使用SpringBoot代碼詳細(xì)解釋<List>的用法

    List是Java集合框架中的一種數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)一組有序的元素,使用List可以方便地向其中添加、刪除或者修改元素,也可以通過下標(biāo)或者迭代器遍歷其中的元素,這篇文章主要介紹了用SpringBoot代碼詳細(xì)解釋<List>的用法,需要的朋友可以參考下
    2023-09-09
  • Java線程監(jiān)聽,意外退出線程后自動(dòng)重啟的實(shí)現(xiàn)方法

    Java線程監(jiān)聽,意外退出線程后自動(dòng)重啟的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄狫ava線程監(jiān)聽,意外退出線程后自動(dòng)重啟的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • JAVA觀察者模式的的講解及代碼實(shí)現(xiàn)

    JAVA觀察者模式的的講解及代碼實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了JAVA的觀察者模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Java中的類初始化解析

    Java中的類初始化解析

    這篇文章主要介紹了Java中的類初始化解析,類的初始化是一個(gè)Java類生命周期中的其中一個(gè)階段,初始化是類加載的最后一個(gè)階段,也正是在初始化階段,才會(huì)真正開始執(zhí)行類中所寫的Java代碼,需要的朋友可以參考下
    2023-08-08

最新評(píng)論

信丰县| 蒲城县| 潍坊市| 天峻县| 宝兴县| 郎溪县| 桃源县| 子长县| 中山市| 岳西县| 凤山市| 泽州县| 蒙阴县| 兰西县| 青河县| 宁强县| 丘北县| 商城县| 莱芜市| 佛学| 临城县| 乾安县| 山阳县| 汤原县| 原平市| 福泉市| 东方市| 铁岭市| 冷水江市| 会泽县| 伊吾县| 栖霞市| 嵊州市| 万州区| 乐都县| 永定县| 黄浦区| 涞水县| 镶黄旗| 抚宁县| 台湾省|