在上一篇《JVM知识梳理之一_JVM运行时内存区域与Java内存模型》中,提到了JVM的各种常量池,但没有展开讲述。本文就JVM的各种常量池进行一些简单的梳理。 一、常量池概述 JVM的常量池主要有以下几种: class文件常量池 运行时常量池 字符串常量池 基本类型包装类常量池 它们相互之间关系大致如下图所示: 每个class的字...
常量池是*.class文件中的,当该类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址 常量池只有类文件在编译的时候才会产生,而且是存储在类文件中的。而运行时常量池是在方法区,而且可在JVM运行期间动态向运行时常量池中写入数据。 字符串常量池(string pool) 字符串常量池里的内容是在...
创建字符串常量时,首先检查字符串常量池是否存在该字符串,如果有,则直接返回该引用实例,不存在,则实例化该字符串放入常量池中。 字符串常量池是JVM所维护的一个字符串实例的引用表,在HotSpot VM中,它是一个叫做StringTable的全局表。在字符串常量池中维护的是字符串实例的引用,底层C++实现就是一个Hashtable。这些...
1.Java 基本类型的包装类的大部分都实现了常量池技术,即 Byte、Short、Integer、Long、Character、Boolean; 2.且数值 [-128,127] 的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。 3.两种浮点数类型的包装类 Float、Double 并没有实现常量池技术。 实例: Integer i = 1;doubled2 = 1.0;/*** ...
看1.8 , 疯狂的intern, 抛出了 heap oom ,由此可以推断出 1.8中的字符串常量池 是在堆中。 如果是1.6 ,会抛出 OutOfMemoryError: PermGen space ,因为1.6中 字符串常量池在永久代中。 JVM对字符串常量池的优化 字符串的分配,和其他对象的分配一样,同样也需要耗费时间和空间,作为最基础的数据类型,大量频繁的...
而当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中,由此可知,运行时常量池也是每个类都有一个。在解析阶段,会把符号引用替换为直接引用,解析的过程会去查询字符串常量池,也就是我们上面所说的StringTable,以保证运行时常量池所引用的字符串与字符串常量池中是一致的。
学习JVM的时候经常会遇到各种常量池,不同版本的JDK它们的存储位置也不同,这篇随笔就整理下几种常见的常量池,以JDK1.8为主。先看一张存储示意图,里面涉及1.8和1.6。 常量池是存储在方法区中的,比如我们有这样一段代码: public class Demo { public static void main(String[] args) { ...
JVM的常量池主要分为两类:字面量常量池:存的是直接量,比如数字123,字符串"hello"之类的。符号引用...
在《JVM类加载机制》和《JVM内存模型》这两篇文章都对常量池和运行时常量池做了不少介绍,这篇文章再次聚焦常量池,搞清楚常量池到底都有什么。 一、静态常量池与运行时常量池 静态常量池也可以称为Class常量池,也就是每个.java文件经过编译后生成的.class文件,每个.class文件里面都包含了一个常量池,因为这个常量池...
这个常量就对应null值:所以,常量池的索引从1而非0开始。18:1*16 +8 = 24的长度,24-1 =23 所以是23个 ④ 字节码表 ⑤ 分析常量池第一个索引是4,第二个索引是20,14:1*16+4 =20 而 20 又引用了 7和 8 在JVM规范中,每个标量/字段都是有描述信息,描述信息主要的作用是描述字段的数据类型,...