美文网首页
p4-equals系列:jdk1.6中,JVM字符串常量池在哪里

p4-equals系列:jdk1.6中,JVM字符串常量池在哪里

作者: 沉默的小象 | 来源:发表于2021-04-28 21:30 被阅读0次
    image.png
    • 在jdk 1.6及以前,字符串常量池是属于运行时常量池的,运行时常量池属于方法区,所以可以说字符串常量池位于方法区。而方法区的实现是永久代,永久代与堆相互隔离。

    永久代和方法区的关系

        涉及到内存模型时,往往会提到永久代,那么它和方法区又是什么关系呢?《Java虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。那么,在不同的 JVM 上方法区的实现肯定是不同的了。 同时大多数用的JVM都是Sun公司的HotSpot。在HotSpot上把GC分代收集扩展至方法区,或者说使用永久代来实现方法区。因此,我们得到了结论,永久代是HotSpot的概念,方法区是Java虚拟机规范中的定义,是一种规范,而永久代是一种实现,一个是标准一个是实现。其他的虚拟机实现并没有永久带这一说法。在1.7之前在(JDK1.2 ~ JDK6)的实现中,HotSpot 使用永久代实现方法区,HotSpot 使用 GC分代来实现方法区内存回收,可以使用如下参数来调节方法区的大小:

    -XX:PermSize
    方法区初始大小
    -XX:MaxPermSize
    方法区最大大小
    超过这个值将会抛出OutOfMemoryError异常:java.lang.OutOfMemoryError: PermGen
    
    • java7中,存储在永久代的部分数据就已经转移到Java Heap或者Native memory。但永久代仍存在于JDK 1.7中,并没有完全移除,譬如符号引用(Symbols)转移到了native memory;字符串常量池(interned strings)转移到了Java heap;类的静态变量(class statics)转移到了Java heap。

    • java8中,取消永久代,方法存放于元空间(Metaspace),元空间仍然与堆不相连,但与堆共享物理内存,逻辑上可认为在堆中。

    JVM之 方法区、永久代(PermGen space)、元空间(Metaspace)三者的区别
    Java方法区、永久代、元空间、常量池详解
    JAVA 方法区与堆 java7前,java7,java8各不相同

    相关文章

      网友评论

          本文标题:p4-equals系列:jdk1.6中,JVM字符串常量池在哪里

          本文链接:https://www.haomeiwen.com/subject/xydsrltx.html