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

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

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

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

虚拟机必须为每个被装载的类型维护一个常量池。

常量池就是该类型所用到常量的一个有序集合,包括直接常量(string,integer和floating常量)和对其他类型,字段和方法的符号引用。

对于String常量,它的值在常量池中的。

而JVM中的常量池在内存当中是以表的形式存在的,对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,

注意:该表只存储文字字符串值,不存储符号引用。

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

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

方法区和持久代的关系:

方法区物理上存在于堆里,而且是在堆的持久代里面;

但在逻辑上,方法区和堆是独立的。

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

时间: 2024-10-11 11:12:38

常量池、perm(持久代)、方法区、栈的相关文章

HotSpot Java虚拟机中的“方法区”“持久代”“元数据区”的关系?

Sun/Oracle JDK的HotSpot VM中,直到JDK7都有“持久代”(Permanent Generation,简称PermGen).也称为方法区.Oracle JDK8的HotSpot VM去掉“持久代”,以“元数据区”(Metaspace)替代之. Oracle是在JDK7的时候宣布移除PermGen内存区域,但是知道JDK8才最终移除. 在JDK7之前,所谓的Permanet Generation内存区域其实包含了两个部分: 方法区 Internded String 方法区主要

jvm内存模型中-栈,方法区,程序计数器是线程安全的

文章转自  https://www.cnblogs.com/myna/p/7567889.html 引文 JDK7及之前版本的方法区(Method Area)和Java堆一样,是各个线程共享的内存区域,用于存储已经被虚拟机加载的类信息.常量.静态常量.即时编译器编译后的代码等数据.虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但它有另外一个名字叫Non-Heap(非堆).根据Java虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常. 细分 方法

Java JVM:内存溢出(栈溢出,堆溢出,持久代溢出以及 nable to create native thread)

转载自https://github.com/pzxwhc/MineKnowContainer/issues/25 包括:1. 栈溢出(StackOverflowError)2. 堆溢出(OutOfMemoryError:java heap space)3. 永久代溢出(OutOfMemoryError: PermGen space)4. OutOfMemoryError:unable to create native thread Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序

java虚拟机学习-触摸java常量池(13)

java虚拟机学习-深入理解JVM(1) java虚拟机学习-慢慢琢磨JVM(2) java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制 java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3) java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4) java虚拟机学习-JVM调优总结(5) java虚拟机学习-JVM调优总结(6) java虚拟机学习-JVM调优总结-基本垃圾回收算法(7) java虚拟机学习-JVM调优总结-垃圾回收面临的

触摸java常量池

转:http://www.cnblogs.com/dreamroute/p/5946272.html java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,小菜早就对常量池有所耳闻,这次好好总结一下. 理论 小菜先拙劣的表达一下jvm虚拟内存分布:      程序计数器是jvm执行程序的流水线,存放一些跳转指令,这个太高深,小菜不懂.      本地方法栈是jvm调用操作系统方法所使用的栈.      虚拟机栈是jvm执行java代码所使用的栈.      方法区存放了一些常量.静

06 java中常量以及常量池

1.举例说明 变量 常量 字面量 1 int a=10; 2 float b=1.234f; 3 String c="abc"; 4 final long d=10L; a,b,c为变量,d为常量 两者都是左值:10,1.234f,"abc",10L都是字面量: 2.常量池: 常量池专门用来用来存放常量的内存区域,常量池分为:静态常量池和运行时常量池: 静态常量池:*.class文件中的常量池,class文件中的常量池不仅仅包含字符串,数值字面量,还包含类.方法的信

Java核心知识点-JVM结构之常量池

触摸java常量池 java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,小菜早就对常量池有所耳闻,这次好好总结一下. 理论 小菜先拙劣的表达一下jvm虚拟内存分布: 程序计数器是jvm执行程序的流水线,存放一些跳转指令,这个太高深,小菜不懂. 本地方法栈是jvm调用操作系统方法所使用的栈. 虚拟机栈是jvm执行java代码所使用的栈. 方法区存放了一些常量.静态变量.类信息等,可以理解成class文件在内存中的存放位置. 虚拟机堆是jvm执行java代码所使用的堆. Java中的

Java常量池详解

转自:http://www.cnblogs.com/iyangyuan/p/4631696.html jvm虚拟内存分布图: 程序计数器:JVM执行程序的流水线. 本地方法栈:JVM调用操作系统方法所使用的栈. 虚拟机栈:JVM执行Java代码所使用的栈. 方法区:存放一些常量.静态变量.类信息等:可以理解为class文件在内存中的存放位置. 虚拟机堆:JVM执行Java代码所使用的堆. Java中的常量池实际上分为两种形态: 静态常量池:即*.class文件中的常量池,class文件中的常量池

基本数据类型的常量池与String类型常量池解析

抛出样例: Integer a1  = new Integer(123);        Integer a2  = new Integer(123);        System.out.println(a1 == a2);   //false  因为只要遇到new关键词,肯定会在堆里面重新分配空间给实例对象,所以两个地址肯定不同                a1  = 123;        a2  = 123;        System.out.println(a1 == a2);