jdk1.7中的常量池

在探究jdk1.7中的常量池,我们可以先看看以下的这段代码

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

    }

并设置了其中-XX:PermSize=20M -XX:MaxPermSize=20M

发现过了很长时间,也没有发生内存溢出,通过查看文档发现,在jdk1.7以后移除了永久代

在这儿之前,除了即时编译的代码存放在Native memory,其它的数据,包括类信息,常量,静态变量,常量池等均存放在永久代中,但是,这样存在一个问题,就是

容易发生内存泄露。

所以在jdk8中,彻底移除了永久代,取而代之的是元空间(metaSpace)

随后我又做了一个测试,通过设置java堆的内存大小来进行相关的测试

-Xmx20m -Xms20m -XX:-UseGCOverheadLimit

发现很快就发生了Exception in thread “main” java.lang.OutOfMemoryError: Java heap space 

方法区(method area)只是JVM规范中定义的一个概念,用于存储类信息、常量池、静态变量、JIT编译后的代码等数据,具体放在哪里,不同的实现可以放在不同的地方。而永久代Hotspot虚拟机特有的概念,是方法区的一种实现,别的JVM都没有这个东西。

在Java 6中,方法区中包含的数据,除了JIT编译生成的代码存放在native memory的CodeCache区域,其他都存放在永久代;
在Java 7中,Symbol的存储从PermGen移动到了native memory,并且把静态变量从instanceKlass末尾(位于PermGen内)移动到了java.lang.Class对象的末尾(位于普通Java heap内);
在Java 8中,永久代被彻底移除,取而代之的是另一块与堆不相连的本地内存——元空间(Metaspace),‑XX:MaxPermSize 参数失去了意义,取而代之的是-XX:MaxMetaspaceSize。

可参考:
Chapter 2. The Structure of the Java Virtual Machine
JEP 122: Remove the Permanent Generation

 

转载于:https://www.cnblogs.com/clovejava/p/8395713.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值