运行时常量池与字符串常量池_常量池是什么

运行时常量池与字符串常量池_常量池是什么文章目录1)方法区包含哪些内容?2)运行时常量池存在什么地方?3)取消永久代后,方法区的实现?4)字符串常量池和运行时常量池究竟去了哪里?4)元空间是什么?5)关于为什么移除永久代?5)补充        我们知道在JDK1.8中取消了永久代,区而代之使用了元空间来实现方法区。话虽如此,但是关于字符串常量池和运行时常量池的模棱两可的说法一直都是争论不休的。1)方法区包含哪些内容?方法区包含哪些内容,摘录自《java虚拟机规

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

        我们知道在JDK1.8中取消了永久代,区而代之使用了元空间来实现方法区。话虽如此,但是关于字符串常量池和运行时常量池的模棱两可的说法一直都是争论不休的。

1)方法区包含哪些内容?

方法区包含哪些内容,摘录自《java虚拟机规范-第8版》:
在这里插入图片描述
方法区包含:
        运行时常量池
        自动和方法数据
        构造函数和普通方法的字节码内容
        一些特殊方法
这里虽然没有说明“字符串常量池”,但是它也是方法区的一部分。

2)运行时常量池存在什么地方?

下面是《深入理解Java虚拟机》一段摘录:
在这里插入图片描述
能够看到
        运行时常量池是在方法区中
        对于运行时常量池,《Java虚拟机规范》并没有做任何细节的要求,不同提供商实现的虚拟机可以按照自己的需要来实现这个内存区域

3)取消永久代后,方法区的实现?

在这里插入图片描述

取消永久代后,使用元空间来实现方法区。
        在JDK1.8中,把JDK 7中永久代还剩余的内容(主要是类型信息)全部移到元空间中。注意这里的剩余内容:说明原来移除从永久代移出的字符串常量池,静态常量,在更换了方法区实现后,并没有顺势进入到元空间,那么它们到哪里去了呢?

4)字符串常量池和运行时常量池究竟去了哪里?

        在JDK1.8中,使用元空间代替永久代来实现方法区,但是方法区并没有改变,所谓”Your father will always be your father”,变动的只是方法区中内容的物理存放位置。正如上面所说,类型信息(元数据信息)等其他信息被移动到了元空间中;但是运行时常量池和字符串常量池被移动到了堆中。但是不论它们物理上如何存放,逻辑上还是属于方法区的。

        JDK1.8中字符串常量池和运行时常量池逻辑上属于方法区,但是实际存放在堆内存中,因此既可以说两者存放在堆中,也可以说两则存在于方法区中,这就是造成误解的地方。

        关于佐证运行常量池和字符串常量池被移动到了堆中,可以参考这个博客:https://mp.weixin.qq.com/s__biz=MzI4NDY5Mjc1Mg==&mid=2247485613&idx=1&sn=b2b1679033d24e965a3dd73dfab6dfaa&chksm=ebf6d0d2dc8159c4ae291d99e9c337b0cdb05578ecf7bb43671ad02cdbecfdf916a98ab18929&scene=27#wechat_redirect

        其实,移除永久代的工作从JDK1.7就开始了。JDK1.7中,存储在永久代的部分数据就已经转移到了Java Heap或者是 Native Heap。但永久代仍存在于JDK1.7中,并没完全移除,譬如符号引用(Symbols)转移到了native heap;字面量(interned strings)转移到了java heap;类的静态变量(class statics)转移到了java heap。我们可以通过一段程序来比较 JDK 1.6 与 JDK 1.7及 JDK 1.8 的区别,以字符串常量为例:

package com.paddx.test.memory;

import java.util.ArrayList;
import java.util.List;

public class StringOomMock { 
   
    static String  base = "string";
    public static void main(String[] args) { 
   
        List<String> list = new ArrayList<String>();
        for (int i=0;i< Integer.MAX_VALUE;i++){ 
   
            String str = base + base;
            base = str;
            list.add(str.intern());
        }
    }
}

        这段程序以2的指数级不断的生成新的字符串,这样可以比较快速的消耗内存。我们通过 JDK 1.6、JDK 1.7 和 JDK 1.8 分别运行:
在这里插入图片描述
在这里插入图片描述
        从上述结果可以看出,JDK 1.6下,会出现“PermGen Space”的内存溢出,而在 JDK 1.7和 JDK 1.8 中,会出现堆内存溢出,并且 JDK 1.8中 PermSize 和 MaxPermGen 已经无效。因此,可以大致验证 JDK 1.7 和 1.8 将字符串常量由永久代转移到堆中

4)元空间是什么?

        元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制,但可以通过以下参数来指定元空间的大小:

        -XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。

        -XX:MaxMetaspaceSize,最大空间,默认是没有限制的。

除了上面两个指定大小的选项以外,还有两个与 GC 相关的属性:

        -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集.

        -XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集

        现在我们在 JDK 8下重新运行一下代码段 4,不过这次不再指定 PermSize 和 MaxPermSize。而是指定 MetaSpaceSize 和 MaxMetaSpaceSize的大小。输出结果如下:

在这里插入图片描述

5)关于为什么移除永久代?

        字符串存在永久代中,容易出现性能问题和内存溢出。
        类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。
        永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。
        Oracle 可能会将HotSpot 与 JRockit 合二为一。

5)补充

某种程度上说,该图也是正确的:来源:
https://www.zhihu.com/question/300075241/answer/519570351
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164777.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • map平均准确率_拓扑排序怎么排

    map平均准确率_拓扑排序怎么排给定一张 N 个点 M 条边的有向无环图,分别统计从每个点出发能够到达的点的数量。输入格式第一行两个整数 N,M,接下来 M 行每行两个整数 x,y,表示从 x 到 y 的一条有向边。输出格式输出共 N 行,表示每个点能够到达的点的数量。数据范围1≤N,M≤30000输入样例:10 103 82 32 55 95 92 33 94 82 104 9输出样例:1633211111#include<bits/stdc++.h>using

    2022年8月9日
    6
  • idea怎么查看自己填写的激活码【在线注册码/序列号/破解码】

    idea怎么查看自己填写的激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    66
  • 网站404页面怎么做

    网站404页面怎么做网站404页面怎么做?谈及网站404页面,诸多站长在网站运营的过程中,难以避免404页面的出现。404页面意味着网站存在死链接,当搜索引擎蜘蛛爬取此类网址的时候,应当反馈404状态吗,告知此URL网址已经失效,搜索引擎蜘蛛便会回馈到数据中心,从中清除数据。而在页面的前端,应该对访客予以信息提示,告知内容的已经不存在,优化相关搜索内容,尽可能避免降低访客体验度,由此可见,网站404页面的制作应当以两种出发点进行,即对于搜索引擎蜘蛛状态吗的正确回馈和对前端界面及内容设计出发。404网页正确设置网

    2022年7月27日
    4
  • PNG文件格式具体解释

    PNG文件格式具体解释

    2021年12月8日
    63
  • 二叉查找树实现原理分析

    二叉查找树实现原理分析

    2022年3月2日
    60
  • 罗技键盘k380打不了字_罗技k380键盘配对成功后无法使用

    罗技键盘k380打不了字_罗技k380键盘配对成功后无法使用mac连接成功罗技k380键盘,但是发现数字键上面的字符对不上,很多字符以及标点符号都打不出来,是什么原因导致的呢?问题分析首先,分析一下,到底是什么原因导致的?可以连接其他设备试一试,比如我发现k380键盘在我的ipad上是可以正常使用的。那么就排除了键盘本身存在问题,坏了等猜测。如果不是键盘本身出了问题,那么我们就要去分析问题究竟出现在哪里?联系了客服,加上自己对键盘配对过程的回顾,大致判定问题出现在最开始的匹配的时候,选错了【键盘类型】。解决问题-重设【键盘类型】步骤如下:【系统偏好设置

    2022年10月9日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号