`

jdk1.8下模拟永久代内存溢出

    博客分类:
  • jvm
 
阅读更多

转自:https://blog.csdn.net/qq_26093341/article/details/80791899

 

相信不少小伙伴在看深入理解Java虚拟机的时候,作者给我们举例一个demo来发生PermGen space

1、通过List不断添加String.intern();

2、通过设置对应的-XX:PermSize与-XX:MaxPermSize(更快看到效果),

3、在jdk1.6的环境下会抛出OOM:PermGen space异常

public static void main(String[] args) {
    List<String> str=new ArrayList<>();
    int i=0;
    while (true){
        str.add(String.valueOf(i).intern());
    }

}

然而在jdk1.8的环境下,这段代码,会出现OOM,但不是出现PermGenSpace,而是会当堆内存不够用(-Xmx)的时候,抛出Java heap space,而且会温馨提示

ignoring option PermSize=10M; support was removed in 8.0

ignoring option MaxPermSize=10M; support was removed in 8.0

---------------------------------------------------------------------------------------------------------

首先我们看一下String.intern()方法,官方的注释是

Returns a canonical representation for the string object. A pool of strings, initially empty, is maintained privately by the class String. When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true. All literal strings and string-valued constant expressions are interned. String literals are defined in section 3.10.5 of the The Java? Language Specification.

大概意思就是,如果常量池已经存在这个string对象,那么就返回这个字符串的引用。否则将此string对象加入常量池,再返回引用

~

但是在jdk1.8中,其实已经没有永久代这一说了,取而代之的是一个叫元空间(Meta space)。而常量池放到了堆中,所以也就不会出现PermGen space了

---------------------------------------------------------------------------------------------------------

那么如果想看到metaspace的异常怎么做呢?

一个是可以把这两个值设置的足够小,那么启动就会报错了。

-XX:MetaspaceSize=3M -XX:MaxMetaspaceSize=3M

一个是可以使用jdk动态加载技术,例如cglib动态的生成大量的数据来达到

分享到:
评论

相关推荐

    mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系

    mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk...

    JDK1.8中文文档 JDK1.8中文 jkd8中文文档 JDK中文版

    JDK1.8,也被称为Java Development Kit 1.8,是Oracle公司发布的一个重要的Java开发工具集,它包含了许多用于构建和运行Java应用程序所需的组件和服务。这个版本的JDK引入了一系列创新特性,极大地提升了Java语言的...

    JDK1.8 官网版本jdk1.8

    JDK1.8,全称Java Development Kit 1.8,是Oracle公司发布的一个重要的Java开发工具包,其版本号为1.8.0_25。这个版本在Java发展历程中占据着举足轻重的地位,因为它引入了许多创新特性,极大地提升了Java开发者的...

    JDK1.8压缩包下载解压即用

    提供两种资源方式:(JDK1.8压缩包64位Windows版本)上面JDK1.8压缩包直接下载(解压一下就可以用),想自己下载的下方官网网址自行查找 官网下载地址:https://www.oracle.com/java/technologies/downloads/ JDK...

    jdk1.8-331 java开发环境 jdk1.8版本

    JDK1.8-331指的是Java开发工具包(Java Development Kit)的1.8版本的第331次更新。JDK是用于开发Java应用程序的基础工具集,提供了编译器(javac)、运行环境(Java Runtime Environment,JRE)和一些基本的类库。...

    linux jdk1.8

    linux jdk1.8linux jdk1.8linux jdk1.8linux jdk1.8linux jdk1.8linux jdk1.8linux jdk1.8linux jdk1.8linux jdk1.8linux jdk1.8linux jdk1.8linux jdk1.8linux jdk1.8linux jdk1.8linux jdk1.8linux jdk1.8linux ...

    jdk1.8免安装版本

    JDK 1.8作为其中的一个重要版本,自发布以来,以其稳定性和功能性受到了广泛的欢迎。 JDK 1.8的免安装版本,是指用户无需经历复杂的安装过程,即可直接使用JDK进行Java开发。这种版本通常包含了一个可执行的压缩包...

    jdk1.8 JDK1.8 中文 CHM

    **JDK 1.8 API 中文 CHM** 是Java开发者的重要参考资料,它包含了Java开发工具包(JDK)1.8版本的所有公共类、接口和框架的详细文档。这个CHM(Compiled HTML Help)文件是Windows平台上的帮助文档格式,用户可以...

    dubbo admin jdk1.8

    这个压缩包的使用不仅简化了部署过程,还确保了在JDK1.8下的兼容性和稳定性,这对于依赖Dubbo且希望利用管理工具优化服务运行的开发者来说非常有价值。同时,了解如何正确配置和使用Dubbo Admin,有助于提升微服务的...

    jdk1.8.031 jdk1.8

    2. JDK 1.8是Java开发工具包的一个版本,其版本号为1.8.0_31,通常简称为JDK 1.8。JDK 1.8在Java历史上是一个重要的里程碑,它引入了大量新特性,包括Lambda表达式、新的日期时间API、Streams API等。 3. JDK 1.8的...

    jdk1.8安装包windows64位.rar

    JDK 1.8是Java开发工具包的一个重要版本,它在Java历史上有着举足轻重的地位,因为它是最后一个获得长期支持的Java版本。JDK 1.8引入了许多新的功能和改进,如Lambda表达式、新的日期时间API、默认方法以及涉及性能...

    java jdk1.8 下载

    JDK 1.8还更新了Java虚拟机的性能,优化了垃圾回收机制,使得内存管理更加高效。在这个版本中,增加了对Unicode 6.2的支持,改善了对国际化和本地化的处理。并且,JDK 1.8增强了Java安全管理器和Java管理扩展(Java ...

    jdk 1.8 Mac dmg

    - **兼容性**:虽然JDK 1.8在大多数情况下与之前的版本兼容,但在某些特定场景下(如使用了默认方法的接口实现),可能会出现不兼容的情况。 - **资源管理**:随着JDK 1.8引入的新特性和API,开发者应关注如何有效地...

    JDK1.8版本免安装解压缩版

    **JDK 1.8免安装解压缩版详解** JDK(Java Development Kit)是Java编程语言的软件开发工具包,它为Java开发者提供了编译、调试和运行Java应用程序所需的所有工具。JDK 1.8是Oracle公司发布的一个重要版本,其中...

    JDK1.8 windows zip解压缩版

    JDK1.8 Windows Zip解压缩版是一款专为Windows操作系统设计的Java Development Kit(Java开发工具包)的非安装版本,它以ZIP压缩格式提供,方便用户下载后直接解压使用,无需经过传统的安装过程。这个版本特别适合...

    Mac OS jdk1.8安装包

    **Mac OS上的JDK 1.8安装指南** 在Mac OS操作系统上安装Java Development Kit (JDK) 1.8是开发Java应用程序的基础步骤。JDK不仅提供了Java编译器,还包含了运行Java程序所需的Java Runtime Environment (JRE)。本...

    jdk1.8 api 中文文档

    **标题解析:**"JDK1.8 API 中文文档" 这个标题指的是Java Development Kit (JDK) 1.8版本的API(Application Programming Interface)的中文解释文档。API是一系列预先定义的函数、类、接口和枚举,用于帮助程序员...

    jdk1.8-windows解压双击安装

    这个“jdk1.8-windows”文件很可能是JDK 1.8的Windows平台安装包,适用于在Windows操作系统上开发和运行Java程序。 在Windows系统中安装JDK 1.8的步骤如下: 1. **下载**:首先,你需要从Oracle官方网站或者可信的...

    jdk1.8版本免安装

    在这个"jdk1.8版本免安装"的压缩包中,我们可以找到JDK 1.8.0_181的具体内容,这是一个更新版本,包含了修复的漏洞和性能改进。 首先,JDK 1.8最重要的特性之一是Lambda表达式,它简化了函数式编程,使得处理集合...

    jdk1.8免安装版

    Java JDK 1.8免安装版是一款为开发者和用户提供了便捷的Java开发环境的软件包。这个版本的特点在于,它不需要传统的安装过程,也不需要手动配置环境变量,从而简化了Java开发环境的搭建,尤其适合那些希望快速启动...

Global site tag (gtag.js) - Google Analytics