目录 常量池 Integer a= 127 与 Integer b = 127相等吗 ---- 常量池 java中存在字符串常量池,维护了所有String对象 使用String s=”zx”的时候是使用...String.valueOf(“zx”)从常量池中找了个对象返回 如果不存在则将内容放入常量池中 在使用new的时候是直接创建一个新的对象在堆中 Integer中也有常量池 其中缓存了-128到127之间的数字...如果整型字面量的值在-128 到 127 之间,那么自动装箱时不会 new 新的Integer 对象,而是直接引用Integer常量池中的 Integer 对象,超过范围 a1==b1...System.out.println(b == c); // true //如果整型字面量的值在-128到127之间, //那么自动装箱时不会new 新的Integer 对象, //而是直接引用常量池中的
今天说一说Java常量池(静态常量池与运行时常量池)[通俗易懂],希望能够帮助大家进步!!! 1、什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变!...final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。 Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。...2)而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。...3、方法区中的运行时常量池 运行时常量池是方法区的一部分。...运行时常量池相对于CLass文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入CLass文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中
Class常量池 什么是Class常量池?...运行时常量池存在于内存中,是方法区的一部分。它是Class常量池被加载到内存之后的版本。...运行时常量池相对于Class文件常量池的另一个重要特征是具备动态性,Java语言并不要求常量一定只在编译期才能产生,也就是说,并非预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可以将新的常量池放入池中...字符串常量池 字符串常量池在Java内存区域的哪个位置? 在JDK6.0及之前的版本,字符串常量池是放在Perm Gen区(也就是方法区)中; 在JDK7.0版本,字符串常量被移到了堆中。...字符串常量池是什么?
常量池 是.class文件的常量池,也可以理解为一张表,虚拟机指令根据这张常量表找到要执行的类名,方法名,参数类型,字面量等信息 运行时常量池 常量池是*.class文件中的,当该类被加载,它的常量池信息就会放入运行时常量池...,并把里面的符号地址变为真实地址 常量池只有类文件在编译的时候才会产生,而且是存储在类文件中的。...而运行时常量池是在方法区,而且可在JVM运行期间动态向运行时常量池中写入数据。...当字符串常量池中的存储比较多的字符串时,会导致hash冲突,从而每个节点形成长长的链表,导致性能下降。所以在使用字符串常量池时,一定要控制容量。...s3=s6输出true 简单介绍intern方法,可以使用intern方法,主动将串池中还没有的字符串对象放入字符串常量池 通过intern方法主动将s4的字符串放入了字符串常量池,将这个字符串对象尝试放入串池
常量池 class常量池 Java源文件编译之后得到的class文件,其中有项信息就是常量池,保存有字面量和符号引用,比如 public class JvmClass1 { final int b=...c=”java”; String d=”abcd”; String e=”java”; String f=new String(“java”); } } 运行时常量池 && 字符串常量池 class常量池被加载到内存后...,形成了运行时常量池,Jdk1.7之前位于方法区中,Jdk1.8之后是放在元空间,或者把元空间看做是新的方法区。...运行时常量池相对于class常量池的一个特点是具有动态性,Java不要求所有常量在编译器产生,可以在运行时产生常量加入常量池,例如String类的intern()。...意思是当一个字符串对象调用intern方法,如果池中已经存在值相等(通过String的equal函数比较)的字符串常量,就返回常量池中的常量,也就是堆中对应实例的引用。否则将这个字符串加入常量池。
2)运行时常量池存在什么地方? 3)取消永久代后,方法区的实现? 4)字符串常量池和运行时常量池究竟去了哪里? 4)元空间是什么? 5)关于为什么移除永久代?...话虽如此,但是关于字符串常量池和运行时常量池的模棱两可的说法一直都是争论不休的。 1)方法区包含哪些内容?...2)运行时常量池存在什么地方?...4)字符串常量池和运行时常量池究竟去了哪里?...JDK1.8中字符串常量池和运行时常量池逻辑上属于方法区,但是实际存放在堆内存中,因此既可以说两者存放在堆中,也可以说两则存在于方法区中,这就是造成误解的地方。
文章目录 1.常量 2.Java常量池 2.1. 静态常量池: 2.2....运行时常量池: 3.基本数据类型包装类常量池 4.java字符串常量池 1.常量 常量表示程序运行过程种不可改变的值,主要作用如下: 1.代表常数,便于程序的重构和修改。...java的常量池可做如下分类: 2.1. 静态常量池: 即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。...运行时常量池: 是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。 运行时常量池是方法区的一部分。...运行时常量池相对于CLass文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入CLass文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中
中就包含文件常量池(非运行时常量池),在编译期间就确定了,.class文件遵循jvm虚拟机规范....,他们的字面量不会存在于常量池。...将字节流的静态存储结构转化成方法区的运行时数据结构 class文件常量池进入运行时常量池,所有类共同使用一个运行时常量池,在进入运行时常量的过程中,多个class常量池中相同的字符串,只会在运行时常量池存在一份...class文件常量池的大部分数据会被加载到运行时常量池。 运行时常量池相比于class文件常量池具有动态性,运行时常量池的内容不全部来自于class文件常量池,可以通过代码生成的方式加入到里面。...字符串常量池 1.字符串创建的两种方式 String rumenz1="入门"; String rumenz2=new String("小站"); 入门在编译期间就已经确定,会进入字符串常量池,但是字符串常量池只会保存一个引用
Pre JVM - 深入剖析字符串常量池 JVM - 基本类型的包装类和对象池 ---- class常量池 Class常量池我们可以理解为是Class文件中的资源仓库。...Class文件中主要由两大部分 类的版本、字段、方法、接口等描述信息外, 常量池(constant pool table),用于存放编译期生成的各种字面量(Literal)和符号引用(Symbolic...这里面主要是两个东西; 字面量和符号引用 ---- 字面量 么错 就是你想的那个意思: 由字母、数字等构成的字符串或者数值常量 。...主要包括了以下三类常量: 类和接口的全限定名 字段的名称和描述符 方法的名称和描述符 刚刚上面的代码 a、b 、c、d就是字段名称,就是一种符号引用, 类的全限定名也是符号引用, 类中的方法名称,()是一种...---- 运行时常量池 class常量池现在是静态信息,只有到运行时被加载到内存后,这些符号才有对应的内存地址信息,这些常量池一旦被装入内存就变成运行时常量池,对应的符号引用在程序加载或运行时会被转变为被加载到内存区域的代码的直接引用
package com.jvm; import org.junit.Test; /** * 常量池StringTable的详解 * 可以使用该命令查看,当前类的字节码常量池信息 * javap...String s2 = "b";//放到常量池中 String s3 = "ab"; //放到常量池中 /** * 首先创建一个StringBuilder...对象 然后从常量池中获取一个"a",然后再从常量池中获取一个"b"对象 * 然后再在堆中创建一个 new String("ab") 对象 * new StringBuilder...* 会把 "a"+"b" 优化成 "ab",然后从常量池中查找 */ String s5 = "a" + "b"; //放到常量池中...会把堆中创建的 "ab" 对象放到常量池中,如果常量池中有"ab"了 , * 则不会放到常量池中,但是一定会返回常量池中的对象 * * 对比:test2和test3
前言 一直在《深入理解JVM》对常量池只有一个浅薄的了解,之前也遇到过这种题目,今天还是要挑出来进行一次全方位的了解。 常量池分类 常量池大体可以分为:静态常量池,运行时常量池。...静态常量池 存在于class文件中,比如经常使用的javap -verbose中,常量池总是在最前面把?...运行时常量池呢,就是在class文件被加载进了内存之后,常量池保存在了方法区中,通常说的常量池 值的是运行时常量池。...所以呢,讨论的都是运行时常量池 字符串常量池 最最最流行的、最典型的就是字符串了 典型范例: String a = "abc"; String b = new String("abc"); System.out.println...,通过实际的例子和绘图来熟悉了下字符串常量池和包装类的常量池的使用。
接下来就是说明常量的个数了。代表着常量池中有多少个常量,由于常量池中的常量数量不确定,所以才会有这个数据项。...这里所指的常量与JAVA代码中所说的常量有所不同,这里的常量主要包括字面量和符号引用,这两个概念很好理解。 字面量跟JAVA代码中的常量概念类似,如字符串、常量的值等等。...紧接着常量池数量之后的便是常量表了。刚刚也说了,每个表都会有一个一个字节的标志位,那么常量池数量0x002E之后一个字节便是0x0A,这个就是标志位,十进制是10,查表可知是个方法的符号引用。...11项常量和28项常量,我们这里就通过工具来看了。...找到第11项常量,查看11项常量的表结构,继续使用刚刚那样的寻找方法,一直找到标志位为1的常量项,也就是CONSTANT_Utf8_info的表结构,这样就可以得出我们最开始查看的那个表结构的一些具体信息了
JVM为了提高性能和减少内存的开销,在实例化字符串的时候进行了一些优化:使用字符串常量池。...每当我们创建字符串常量时,JVM会首先检查字符串常量池,如果该字符串已经存在常量池中,那么就直接返回常量池中的实例引用。如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中。...由于String字符串的不可变性我们可以十分肯定常量池中一定不存在两个相同的字符串(这点对理解上面至关重要)。 Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。...所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。...而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。
所以,最终的测试结论: 结论:这个常量池(特指字符串常量池而不是所有的常量池),应该还是在Java heap里面, 上面的测试只能证明:jdk1.8中 字符串常量池是在堆里面。...JAVA的三种常量池 此外,Java有三种常量池,即字符串常量池(又叫全局字符串池)、class文件常量池、运行时常量池。 1....字符串常量池(也叫全局字符串池、string pool、string literal pool) 字符串常量池 Interned Strings 2....每个类都有一个运行时常量池 3. class文件常量池(class constant pool) class常量池是在编译后每个class文件都有的,class文件中除了包含类的版本、字段、方法、接口等描述信息外...*字面量就是我们所说的常量概念,如文本字符串、被声明为final的常量值等。 按照这个分析的话, 运行时常量池和静态常量池存放在元空间中,而字符串常量池依然存放在堆中。
Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。...所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。...而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。...以上所讲仅涉及字符串常量池,实际上还有整型常量池、浮点型常量池等等,但都大同小异,只不过数值类型的常量池不可以手动添加常量,程序启动时常量池中的常量就已经确定了,比如整型常量池中的常量范围:-128~127...接下来就是常量池入口,入口处用2个字节标识常量池常量数量,本例中数值为00 1A,翻译成十进制是26,也就是有25个常量,其中第0个常量是特殊值,所以只有25个常量。
Arthas & GC日志-JVM(十八) 今 日 一 码 一、常量池 常量池主要放两大类:字面量和符号引用。 字面量就是由字母、数字等构成的字符串或者数值常量。 符号引用主要包含三类常量。...二、字符串常量池 Jkd1.6之前:有永久代,运行时常量池在永久代,运行时常量池里包含字符串常量池。 Jdk1.7:有永久代,但逐步去掉永久代,字符串常量池从运行时常量池分离到堆里。...Jdk1.8之后:无永久代,运行时常量池在元空间,字符串常量池还在堆里。...2、实际操作 String s = “zhangsan”; 这时候s指向字符串常量池的引用。使用的时候先会去字符串常量池equals比较,一样则直接返回,不一样才会放入字符串缓冲区。...这种方法会保证字符串常量池和堆都有这个对象,没有就创建,最后返回堆内存中对象引用。 先去字符串常量池创建字符串对象,再去堆里创建字符串对象“zhangsan”, 最后直接将内存中的引用返回。
Class常量池、运行时常量池、字符串常量池 class常量池 java代码经过编译之后都成了xxx.class文件,这是java引以为傲的可移植性的基石。...class文件中,在CAFEBABE、主次版本号之后就是常量池入口了,入口是一个u2类型的数据,也就是占据2个字节,用来给常量池的容量计数,假设这个u2的数字为0x0016,那么对应十进制为22,那么常量池中右...也就是说class常量池=运行时常量池,只不过是不同的表现形式而已,一个是静态的,一个是动态的,其中静态的符号引用也都在运行时被解析成了动态的直接引用。...那么运行时常量池是和类绑定的,每个类、接口有自己的运行时常量池,每一个运行时常量池的内存是在方法区进行分配的,这只是概念上的方法区,每个虚拟机有自己的实现,同一个虚拟机不同的版本也有不同的实现,以常用的...)永久代属于GC heap的一部分 在1.7字符串常量池被从方法区拿到了堆,运行时常量池还留在方法区中 在1.8中hotspot移除了永久代用元空间取代它,字符串常量池还在堆中,而运行时常量池依然在方法区也就是元空间
运行时常量池是方法区(PermGen)的一部分。 需要提前了解: 1. JVM内存模型。 2....JAVA对象在JVM中内存分配 常量池的好处 常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。 Java的自动装箱中其实就使用到了运行时常量池。...详见:Java 自动装箱与拆箱的实现原理 还有字符串常量池。 字符串进入到常量池的两种方法: 1. new String()的实例调用intern()方法。 ...Paste_Image.png 如图中,我们可以看到常量池位于方法区(PermGen),常量池中引用的字符串实例也在常量池中。...JDK1.7-JDK1.8常量池内存模型 ? Paste_Image.png 如图中,我们可以看到常量池位于方法区(PermGen),但常量池引用的字符串实例在堆中。
JVM-常量池 JVM中的常量池通常是对静态常量池、字符串常量池、运行时常量池的总称 静态常量池 存在于.class文件中,存放类的版本、字段、方法、接口的信息,同时还存放俩大常量:字面量(如字符串...、申明为final类型的值)、符号引用,这部分将在类加载后进入方法区的运行时常量池存放。...总结下就是:静态常量池即是存在于.class文件中的的常量池,即编译时期 运行时常量池 JVM在完成类的加载之后,将class文件中的常量池放入方法区(1.8元空间),其中包括静态常量池中的字面量和符号引用...运行时常量池相对于class文件常量池(即静态常量池)的另外一个特性是具备动态性,java语言并不要求常量一定只有编译器才产生,也就是并非预置入class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中...字符串常量池 静态常量池中的字符串在类加载完成后会存放字符串常量池中,JDK1.7之前,字符串常量池存在于方法区,1.7迁移到堆中。同时迁入到堆的还有静态变量。1.8方法区改朝换代为元空间
领取专属 10元无门槛券
手把手带您无忧上云