㈠ java中基本数据类型int a =10,a在栈中存着,10是在常量池中存着吗
int a =10 如果是这个 那么10在栈里面
Interger a = 10 那么这个在常量池里面
a是在-128到127之间,不会去堆中创建对象,而回是直接返回IntegerCache中的值;如果值不答在上面范围内则会从堆中创建对象。= 走的是valueOf()方法,valueOf(int)会走缓存。
Interger a = new Interger(10) 这个在堆里面
㈡ 什么是JVM 运行时常量池
运行时常量池 vs 常量池
要弄清楚方法区,需要理解清楚ClassFile,因为加载内的信息都在方法区。
要弄清楚方法区的运行时常量池,需要理解清楚ClassFile中的常量池。
一个Java源文件中的类、接口,编译后产生一个字节码文件。而Java中的字节码需要数据支持,通常这种数据会很大以至于不能直接存在字节码文件,换另一种方式,可以存在常量池,这个字节码包含了指向常量池的引用。在动态链接的时候会用到运行时常量池。
栈帧
[图片上传失败...(image-b8ec8b-1600702650468)]
动态链接
Javad 方法区究竟存了什么???
㈢ Java常量池是什么有什么用 和堆、栈有关系求简单易懂的解释!
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
3. 堆:存放所有new出来的对象。
4. 静态域:存放静态成员(static定义的)
5. 常量池:存放字符串常量和基本类型常量(public static final)。
6. 非RAM存储:硬盘等永久存储空间
这里我们主要关心栈,堆和常量池,对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
㈣ Java 面试宝典:你是如何理解常量池的
本文探讨常量池在Java技术中的应用,它在类加载与运行时起到关键作用。常量池分为Class文件常量池与运行时常量池。
Class文件常量池在源代码编译成字节码文件时生成,内含字面量与符号引用,支持Java编译器收集类中所有值与引用。字面量包括八种类型,如整数、浮点数、字符串等。符号引用则包括类全路径名、方法名称与描述符等。
运行时常量池位于方法区,用于存储类中的常量、静态变量和符号引用。与Class文件常量池不同,它是动态创建的,用于在程序运行时访问常量。Java编译期间生成的静态常量池与动态创建的运行时常量池相区别。
注意,在程序运行时,可以动态生成一些常量,如String的intern()方法。此方法用于将对象的引用添加至字符串常量池,确保相同字符串共享一个实例。字符串常量池在整个JVM中只存在一份,以减少内存消耗。关于字符串常量池的应用及内部运作,可参考相关文章。
Java中的封装类常量池(Byte、Short、Integer、Long、Character、Boolean)提供了类型安全与数值操作的便利性,每个封装类内部维护着常量池,而Float与Double并未实现该特性,可能是因为浮点精度问题的影响。
通过理解常量池在Java中扮演的角色,开发人员能更加有效地利用这些机制来提升程序性能与资源管理。关注Java技术的深入研究,对于系统开发与优化大有裨益。
㈤ java中 关于常量池 栈内存 堆内存
常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。包内括了关于类,方容法,接口等中的常量,也包括字符串常量,如String s = "java"这种申明方式;当然也可扩充,执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间。
Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和
multianewarray等指令建立,不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事
先告诉编译器,因为是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。