迄今为止看到的对常量池和字符串最为透彻的解释,赞一个! 常量池(constant_pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据.它包括了关于类.方法.接口等中的常量,也包括字符串常量和符号引用.运行时常量池是方法区的一部分. 在Class文件结构中,最头的4个字节用于存储魔数Magic Number,用于确定一个文件是否能被JVM接受,再接着4个字节用于存储版本号,前2个字节存储次版本号,后2个存储主版本号,再接着是用于存放常量的常量池,由于常量的数量是不固定的…
面试题:String a = "ab"; String b = "a" + "b"; a == b 是否相等 面试考察点 考察目的: 考察对JVM基础知识的理解,涉及到常量池.JVM运行时数据区等. 考察范围: 工作2到5年. 背景知识 要回答这个问题,需要搞明白两个最基本的问题 String a="ab",在JVM中发生了什么? String b="a"+"b",底层是如何实现? JV…
常量池(constant_pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据.它包括了关于类.方法.接口等中的常量,也包括字符串常量和符号引用.运行时常量池是方法区的一部分. 在Class文件结构中,最头的4个字节用于存储魔数Magic Number,用于确定一个文件是否能被JVM接受,再接着4个字节用于存储版本号,前2个字节存储次版本号,后2个存储主版本号,再接着是用于存放常量的常量池,由于常量的数量是不固定的,所以常量池的入口放置一个U2类型的数据(constan…
在jvm规范中,每个类型都有自己的常量池.常量池是某类型所用常量的一个有序集合,包括直接常量(基本类型,String)和对其他类型.字段.方法的符号引用.之所以是符号引用而不是像c语言那样,编译时直接指定其他类型,是因为java是动态绑定的,只有在运行时根据某些规则才能确定具体依赖的类型实例,这正是java实现多态的基础. 为了对常量池有更具体的认识,下面引用几个例子: 1,常量池中对象和堆中的对象 public class Test2 { public static void main(Str…
最近正好在研究这个问题,题主问题本身是有问题的,在JDK7中HotSpot的常量池是放在Java Heap中,并非题目中的native memory中.在JDK6中是放在Perm Space.题主可以用JDK6和JDK7分别试一下.说一下题主的那段代码,要一分为二,JDK6/JDK7及以上JDK6:上面也说了,JDK6的字符串常量是存在Perm Space中,所以把Perm Space 设的小一点-(XX:MaxPermSize=10M)可以很快抛异常,具体的异常就是“java.lang.Out…
常量池: 即class文件常量池,是class文件的一部分,用于保存编译时确定的数据. 保存的内容如下图: D:\java\test\out\production\test>javap -verbose mainTest Classfile /D:/java/test/out/production/test/mainTest.class Last modified 2019年4月22日; size bytes MD5 checksum 08699c6d713bc8967a8daea381ce23…
运行时常量池概述 Java运行时常量池中主要存放两大类常量:字面量和符号引用.字面量比较接近于Java语言层面的常量概念,如文本字符串.声明为final的常量值等. 而符号引用则属于编译原理方面的概念,包括了下面三类常量: - 类和接口的全限定名(包名+类名) - 字段的名称和描述符 - 方法的名称和描述符 运行时常量池位置 运行时常量池在JDK1.6及之前版本的JVM中是方法区的一部分,而在HotSpot虚拟机中方法区放在了"永久代(Permanent Generation)".所以…
在Java的内存分配中,总共3种常量池: 转发链接:https://blog.csdn.net/zm13007310400/article/details/77534349 1.字符串常量池(String Constant Pool): 1.1:字符串常量池在Java内存区域的哪个位置? 在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区)中: 在JDK7.0版本,字符串常量池被移到了堆中了.至于为什么移到堆内,大概是由于方法区的内存空间太小了. JDK8以后也还是放在…
在Java的内存分配中,总共3种常量池: ref:https://blog.csdn.net/zm13007310400/article/details/77534349 1.字符串常量池(String Constant Pool): 1.1:字符串常量池在Java内存区域的哪个位置? 在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区)中: 在JDK7.0版本,字符串常量池被移到了堆中了.至于为什么移到堆内,大概是由于方法区的内存空间太小了. JDK8以后也还是放在了…
深入理解Class---常量池 一.概念 1.jvm生命周期 启动:当启动一个java程序时,一个jvm实例就诞生了,任何一个拥有main方法的class都可以作为jvm实例运行的起点. 运行:main()函数作为程序初始线程起点,其它线程由该线程启动,包括守护线程(daemon)和non-daemon(普通线程).守护线程是JVM自己使用的线程比如GC线程就是个守护线程,只要这个jvm实例还有普通线程执行,就不会停止,但是可以用exit()强制终止程序. 消亡:所有非守护线程退出时,JVM实例…