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.mzph.cn/news/370094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浏览器缓存问题原理以及解决方案

浏览器缓存问题: 简单来说,浏览器缓存就是把一个已经请求过的Web资源(如html页面,图片,js,数据等)拷贝一份副本储存在浏览器中。缓存会根据进来的请求保存输出内容的副本。当下一个请求来到的时…

Scikit-Learn机器学习入门

现在最常用的数据分析的编程语言为R和Python。每种语言都有自己的特点,Python因为Scikit-Learn库赢得了优势。Scikit-Learn有完整的文档,并实现很多机器学习算法,而每种算法使用的接口几乎相同,可以非常快的测试其它学习算法。 Pa…

Apache Camel入门

在先前的博文中,我们了解了企业集成模式(EIP)。 现在,在这篇文章中,我们将研究实现这些模式的Apache Camel框架。 关于骆驼: Apache Camel是一个开放源代码项目,已有将近5年的历史,…

android studio smssdk,SMSSDK for Android 配置

1.集成之前先要申请Mob的appkey与appsecret2.在Mob官网下载最新SDK,解压后会看到以下目录结构:SMSSDK下存放的是短信SDK的全部内容。3.在android studio中加入SMS的第三方库AS版本的SMSSDK目录下包含以下内容:MobCommons.jar:Mob …

JavaScript总结(3)

第3章 获取用户的输入 <script>10 intAprompt("请输入第一个数字","");11 intBprompt("请输入第二个数字",27);默认是2712 document.write("你输入的第一个数字是"intA);13 document.write("<…

android listview 开发,android开发之ListView实现

今天又初步学习了一下ListView控件,看看效果如下:LisViewActivity.java源码:package com.jinhoward.UI_listview;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.os.Bundl…

Less 的用法

1. node.js node.js是一个前端的框架 自带一个包管理工具npm node.js 的安装 官网:http://nodejs.cn/ 在命令行检验是否安装成功 切换到项目目录,初始化了一个package.json文件 安装与卸载jQuery包(例子) 安装 卸载 安装淘宝…

浅谈springboot整合ganymed-ssh2远程访问linux

环境介绍 技术栈 springbootmybatis-plusmysqlganymed-ssh2 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 SSH(远程连接工具)连接原理:ssh服务是一个守护进程(demon),系统后台监听客户…

android pick file,LFilePicker---文件选择利器,各种样式有它就够了

LFilePicker在 Android 开发中如果需要选择某个文件,可以直接调取系统的文件管理器进行选择,但是无法保证各个厂商的手机界面一致,而且解析Uri 还比较繁琐,如果还需要多选呢?需要文件类型过滤呢?老板说界面…

在JVM之下–类加载器

在许多开发人员中,类加载器是Java语言的底层,并且经常被忽略。 在ZeroTurnaround上 ,我们的开发人员必须生活,呼吸,饮食,喝酒,并且几乎与类加载器保持亲密关系,才能生产JRebel技术&a…

matplotlib绘制饼状图

源自http://blog.csdn.net/skyli114/article/details/77508430?ticketST-41707-PzNbUDGt6R5KYl3TkWDg-passport.csdn.net pyplot使用plt.pie()来绘制饼图 1 import matplotlib.pyplot as plt 2 labels frogs, hogs, dogs, logs 3 sizes 15, 20, 45, 10 # [15,20,45,10…

自适应宽度元素单行文本省略用法探究

单行文本省略是现代网页设计中非常常用的技术,几乎每个站点都会用到。单行文本省略适用于显示摘要信息的场景,如列表标题、文章摘要等。在响应式开发中,自适应宽度元素单行文本省略容易失效不起作用,对网页开发这造成困扰。因此&a…

P3390 【模板】矩阵快速幂

题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n1行,每行n个数,第i1行第j个数表示矩阵第i行第j列的元素 输出格式: 输出A^k 共n行,每行n个数&…

c#精彩编程200例百度云_永安市教育局被授予“人工智能编程教育试验区”

11月28日,“第二届人工智能与机器人教育大会青少年人工智能与编程教育主题论坛”在厦门召开。永安市教育局被中国教育发展战略学会人工智能与机器人教育专委会授予“人工智能编程教育试验区”牌匾,巴溪湾小学、西门小学、三中、一中附属学校、实验小学等…

Spring Data JPA和分页

让我们从支持分页的经典JPA方法开始。 考虑一个简单的域类–一个具有名字,姓氏的“成员”。 为了支持在成员列表上进行分页,JPA方法是支持一种查找器,该查找器将获取第一个结果(firstResult)的偏移量和要检索的结果&am…

Windows环境下安装、卸载Apache

安装Apache 服务 打开 Apcahe的目录 ,打开bin目录, 如:E:\wamp\Apache24\bin ,打开目录,Shift键 鼠标右键 , 点击 在此处打开命令窗口或者W快捷键直接到此处, 也可以Window键r,输入…

css清浮动

我们在平常做项目的时候,float这个css属性经常会用到。元素浮动会让元素脱离文档流,从而不能撑开父级的内容。今天我将展示常见的清除浮动的方法。 什么是浮动 浮动元素脱离文档流并且向左或者向右移动,直到浮动元素的边缘碰到父级框或者另…

DirectX11 学习笔记7 - 支持自由移动的摄像机

如今将又一次制定一个camera摄像机。能够自由移动。比方前进 后退,上游 下潜。 各个方向渲染之类的。 首先设置按键。 这个时候须要在 XWindow.h 里面 bool XWindow::frame() {//推断是否按下ESC键if(x_input->isKeyDown(VK_ESCAPE))return false;//假设A,S,D,W,…

腾讯吃鸡 android,腾讯吃鸡手游《光荣使命》正式上线:安卓/iOS不限号测试

IT之家11月29日消息 今天下午,腾讯首款百人战术竞技手游《光荣使命》在安卓、iOS双平台正式上线,开启全面测试。(官网下载:点此链接,双平台已开放下载。)该游戏采用第三人称射击视角,玩家化身参与“使命行动”军事演习…

lazada铺货模式的选品_lazada小白的运营难点→铺货与精细化运营的优劣势详解

lazada是铺货还是精细化经营第一种铺货铺货作为平台早期都是比较受欢迎的,平台的蛮荒期,成长期当中,铺货的商家是非常受欢迎的,因为平台需要更多SKU产品,去吸引买家,铺货这个时候是最好的也是能最快的成长起…