常量池perm(持久代)方法区栈

Posted 2016java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常量池perm(持久代)方法区栈相关的知识,希望对你有一定的参考价值。

 

 

常量池、perm(持久代)、方法区、栈

常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。

除了包含代码中所定义的各种基本类型(如:int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如:

    #类和接口的全限定名
    #字段的名称的描述符
    #方法和名称的描述符

虚拟机必须为每个被装载的类型维护一个常量池。
常量池就是该类型所用到常量的一个有序集合,包括直接常量(string,integer和floating常量)和对其他类型,字段和方法的符号引用。

对于String常量,它的值在常量池中的。
而JVM中的常量池在内存当中是以表的形式存在的,对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,
注意:该表只存储文字字符串值,不存储符号引用。

$$在程序执行的时候,常量池会储存在Method Area,而不是堆中

 

 

 

JVM构成:
类装载子系统
运行时数据区 
    方法区
    堆(heap)
    Java栈(stack)
    PC寄存器
    本地方法栈
执行引擎

 

方法区和持久代的关系:

方法区物理上存在于堆里,而且是在堆的持久代里面;
但在逻辑上,方法区和堆是独立的。

一般说堆的持久代就是说方法区,因为一旦JVM把方法区(类信息,常量池,静态字段,方法)加载进内存以后,这些内存一般是不会被回收的了。

以上是关于常量池perm(持久代)方法区栈的主要内容,如果未能解决你的问题,请参考以下文章

jvm 常量池

JVM 方法区

对于JVM中方法区,永久代,元空间以及字符串常量池的迁移和string.intern方法

诡异的JVM永久代溢出

JVM基础和内存区域剖析

JVM内存分区和各分区溢出测试