`

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压缩包64位Windows版本)上面JDK1.8压缩包直接下载(解压一下就可以用),想自己下载的下方官网网址自行查找 官网下载地址:https://www.oracle.com/java/technologies/downloads/ JDK...

    JDK1.8 官网版本jdk1.8

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

    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压缩包下载

    JDK 1.8是Java历史上的一个重要版本,它引入了许多新特性,增强了性能,并且对开发者提供了更多的便利。下面将详细讨论JDK 1.8中的关键知识点。 1. **Lambda表达式**:这是JDK 1.8最重要的更新之一,它简化了处理...

    JDK1.8 windows zip解压缩版

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

    jdk1.8版本免安装

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

    jdk1.8免安装版

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

    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)。本...

    dubbo-admin在jdk1.8环境下运行

    dubbo-admin在jdk1.8环境下运行,dubbo-admin在jdk1.8环境下运行dubbo-admin在jdk1.8环境下运行dubbo-admin在jdk1.8环境下运行dubbo-admin在jdk1.8环境下运行dubbo-admin在jdk1.8环境下运行dubbo-admin在jdk1.8环境下...

    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 ...

    java jdk1.8java jdk1.8

    java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8...

    spring对应jdk1.8的jar包

    2. **配置源兼容性**:在IDE中,可以设置项目源代码兼容性为JDK 1.7,这样可以在JDK 1.8环境下编译和运行,但不会使用1.8的新特性。 3. **调整代码**:如果无法升级Spring版本,可能需要手动修改代码以适应JDK 1.8...

    Java1.8或JDK1.8安装包

    JDK1.8安装包,正式名称为Java Development Kit 8,是Oracle公司于2014年3月发布的一款重要的Java开发工具包。作为Java语言的核心组件,JDK1.8不仅包含了Java的运行环境(JRE),还提供了编译、调试以及运行Java应用...

    Linux JDK1.8安装包

    本文将详细介绍在Linux环境下安装JDK1.8的过程。 首先,我们需要了解JDK1.8的重要性。它是Oracle公司发布的Java 8版本,包含了重要的新特性,如Lambda表达式、函数式接口、方法引用和新的日期时间API。这些特性极大...

    JDK 1.8中文API文档

    **JDK 1.8中文API文档** JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的软件包,其中包含Java运行时环境、Java编译器以及一系列的工具和类库。JDK 1.8是Java发展历程中的一个重要版本,引入...

Global site tag (gtag.js) - Google Analytics