java permgen_Java 8:从PermGen到元空间

java 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现在正在使用本机内存来表示类元数据,这称为Metaspace。 类似于Oracle JRockit和IBM JVM的 。 好消息是,它不再意味着java.lang.OutOfMemoryError:PermGen空间问题,也不再需要您调整和监视此内存空间……不是那么快。 虽然此更改默认情况下是不可见的,但接下来我们将向您显示,您仍然需要担心类元数据的内存占用。 还请记住,此新功能不能神奇地消除类和类加载器的内存泄漏。 您将需要使用其他方法并通过学习新的命名约定来跟踪这些问题。 我建议您阅读PermGen删除摘要和Jon对此主题的评论 。

综上所述:

PermGen空间状况

  • 此内存空间已完全删除。
  • PermSize和MaxPermSize JVM参数将被忽略,如果在启动时出现警告,则会发出警告。

元空间内存分配模型

  • 现在,类元数据的大多数分配都是从本机内存中分配的。
  • 用来描述类元数据的分类器已被删除。

元空间容量

  • 默认情况下,类元数据分配受可用本机内存量限制(容量将取决于您使用32位JVM还是使用64位以及JVM虚拟操作系统)。
  • 一个新的标志(MaxMetaspaceSize)可用,允许您限制用于类元数据的本机内存量。 如果您未指定此标志,则Metaspace将在运行时根据应用程序需求动态调整大小。

元空间垃圾收集

  • 一旦类元数据使用量达到“ MaxMetaspaceSize”,就会触发死类和类加载器的垃圾收集。
  • 为了限制此类垃圾收集的频率或延迟,显然将需要对Metaspace进行适当的监视和调整。 过多的Metaspace垃圾回收可能是类的征兆,类加载器的内存泄漏或应用程序的大小不足。

Java堆空间影响

  • 一些其他数据已移至Java堆空间。 这意味着在将来的JDK 8升级之后,您可能会发现Java堆空间的增加。

元空间监控

  • HotSpot 1.8详细GC日志输出中提供了元空间用法。
  • 根据我们对b75的测试,此时Jstat和JVisualVM尚未更新,并且仍然存在旧的PermGen空间引用。

现在有足够的理论,让我们通过泄漏的Java程序来了解这个新的内存空间在起作用……

PermGen与Metaspace运行时比较

为了更好地理解新的Metaspace内存空间的运行时行为,我们创建了一个泄漏Java程序的类元数据。 您可以在此处下载源代码。

将测试以下方案:

  • 使用JDK 1.7运行Java程序,以监视和耗尽设置为128 MB的PermGen内存空间。
  • 使用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中可以看到,PermGen耗尽是在加载大约30K +类之后达到的。 我们还可以从程序和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

java permgen

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350222.shtml

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

相关文章

总结

写在前面 课程名称:软件工程原理及方法 课程链接:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业要求:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/3393 团队名称:求莫名堂 请…

Pytorch GRU(详解GRU+torch.nn.GRU()实现)

pytorch GRU 目录 pytorch GRU 一、GRU简介1 二、GRU简介2 三、pytorch GRU 3.1 定义GRU ()

同步装饰器来替换线程安全类

您知道什么是线程安全吗? 如果没有,下面是一个简单的示例。 所有类都必须是线程安全的,对吗? 并不是的。 其中一些必须是线程安全的? 又错了。 我认为它们都不必是线程安全的,而它们都必须提供同步的装饰器…

creo减速器建模实例_3.16减速器箱体附件建模

本节内容主要介绍了减速器箱体附件建模,视频时长24分32秒。本节主要通过阵列,拉伸,孔等命令完成创建,操作时注意孔的类型的选择,以及定位基准的选择,学习时要掌握其减速器附件的设计。简要操作步骤&#xf…

回文数

问题 A: 回文数 时间限制: 1 Sec 内存限制: 32 MB提交: 1705 解决: 512[提交][状态][讨论版]题目描述 我们把从左往右和从右往左念起来相同的数字叫做回文数。例如,75457就是一个回文数。当然某个数用某个进制表示不是回文数,但是用别的进制表示可能就…

Pytorch RNN(详解RNN+torch.nn.RNN()实现)

目录 一、RNN简介 二、RNN简介2 三、pytorch RNN 3.1 定义RNN()

git ssh创建分支_【ssh简单版git-server 1】自建git-server

环境:centos和ubuntu系统都可以CentOS release 6.7git version 1.7.1git-server 192.168.50.108git-client 192.168.50.112备注:基于linux系统下做ssh模式的gitserver,需要ssh免密钥,因为git用户是禁止登录的,clone时没…

使用js将后台返回的数据转换成树形结构

将类似如下数据转换成树形的数据: [{ id: 1, name: 1, },{ id: 2, name: 1-1, parentId: 1 },{ id: 3, name: 1-1-1, parentId: 2 },{ id: 4, name: 1-2, parentId: 1 },{ id: 5, name: 1-2-2, parentId: 4 },{ id: 6, name: 1-1-1-1, parentId: 3 },{ id: 7, name:…

HMM及维特比算法

参考 HMM:https://blog.csdn.net/sinat_25346307/article/details/79119366 Viterbi算法:https://blog.csdn.net/shenxiaoming77/article/details/79228378 一、HMM定义 以词性标注为例说明 图1 词性标注任务1、问题:如图1所示&#xff0c…

java 大文件 处理_用Java处理大文件

java 大文件 处理我最近不得不处理一组包含历史逐笔交易的外汇市场数据的文件,并很快意识到使用传统的InputStream都无法将它们读取到内存中,因为每个文件的大小都超过4 GB。 Emacs甚至无法打开它们。 在这种特殊情况下,我可以编写一个简单的…

python项目结构目录结构采用的是_python 项目目录结构设置

python 项目目录结构设置为项目设置目录结构是为了将功能类似的文件放置在同一目录内,增强项目的可读性和可维护性。如果一个python项目功能单一,代码量很小,那就没必要设置的这么复杂。下图是一个示例项目的目录结构:1&#xff0…

HMM和CRF 条件随机场详解

转载于 https://blog.csdn.net/qq_42901761/article/details/104206799 这位大神ffffatgoose总结的很好

使用Spring Cloud Config作为外部化配置

关于连续交付 ,最重要的实践之一是只构建一次二进制文件,并在不同的环境(开发,测试,验收等)中使用该二进制文件 。 这意味着最有可能需要外部化应用程序的配置 。 对于Spring Boot应用程序,将其…

51nod1040 最大公约数之和,欧拉函数或积性函数

1040 最大公约数之和 给出一个n&#xff0c;求1-n这n个数&#xff0c;同n的最大公约数的和。比如&#xff1a;n 6时&#xff0c;1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6&#xff0c;加在一起 15 看起来很简单对吧&#xff0c;但是n<1e9&#xff0c;所以暴力是不行的…

hide show vue 动画_Vue2.x学习四:过渡动画

Vue 在插入、更新或者移除 DOM 时&#xff0c;提供多种不同方式的应用过渡效果。请注意它的应用场景并不是说我们写了一个动画之后让它一直在动&#xff0c;而是在一个模块显示或隐藏的时候去做一种特效&#xff0c;使得它的过程有过渡性&#xff0c;而不是很突兀的直接消失或显…

Pytorch cifar10离线加载二进制文件

说明直接离线加载cifar10到Pytorch 直接加载6个文件到pytorchdata_batch_1data_batch_2data_batch_3data_batch_4data_batch_5test_batchimport os import cv2 import pickle import numpy as np import matplotlib.pyplot as pltimport torchvision from torch.autograd impor…

spring cloud gateway 深入了解 - Predicate

文章来源 spring cloud gateway 通过谓词&#xff08;Predicate&#xff09;来匹配来自用户的请求 为了方便&#xff0c;使用postman测试不同的谓词的效果 路径谓词&#xff08;Predicate&#xff09;—— 最简单的谓词 配置如下spring:cloud:gateway:routes:# 匹配指定路径的路…

python漏洞检测脚本_URL重定向漏洞,python打造URL重定向漏洞检测脚本

前言&#xff1a;今天学习了重定向漏洞&#xff0c;这个漏洞比较好理解漏洞名&#xff1a;URL重定向漏洞威胁&#xff1a;低漏洞的来源&#xff1a;开发者对head头做好对应的过滤和限制例子&#xff1a;有漏洞的网站&#xff1a;http://a.com/x.php?urlhttp://a.com/login.php…

Pytorch cifar100离线加载二进制文件

说明&#xff1a;直接加载cifar100二进制文件到Pytorch 直接加载文件到pytorchmetatesttrain import os import cv2 import pickle import time import numpy as np import matplotlib.pyplot as pltimport torchvision from torch.autograd import Variable import torch.uti…

为单个Web应用程序配置多个上下文根– JBoss

有时&#xff0c;我们通过在jboss-web.xm l中定义一个来对应用程序进行更改&#xff0c;以支持利用JBoss功能的多个上下文根&#xff0c;如下所示&#xff1a; webapp / WEB-INF / jboss-web.xml&#xff1a; <?xml version"1.0" encoding"UTF-8"?&…