int i = 3;这个3是存储在栈中还是常量池?
最近在网上看到以下内容:
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用。
int a = 3;
int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。
关于栈与常量池有点晕。请大家帮忙解答。
最近在网上看到以下内容:
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用。
int a = 3;
int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。
关于栈与常量池有点晕。请大家帮忙解答。
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
3. 堆:存放所有new出来的对象。
4. 静态域:存放静态成员(static定义的)
5. 常量池:存放字符串常量和基本类型常量(public static final)。
6. 非RAM存储:硬盘等永久存储空间由此可见int a=3这个3是存放在栈中的!
java 里面的内存分别大致可以分为: 栈区,堆区,数据区(字符串,静态等数据),文本区(也就是放代码的地方)!
class A{
public int i = 3;
public void aa(){}
}
lz 看这里
CONSTANT_Utf8,CONSTANT_Integer,CONSTANT_Float,CONSTANT_Long.......
所以常量池中有基本数据类型的一席之地。所以我想是不是编译成class文件时将出现的基本数据类型全放在常量池中了。当执行方法时会把出现在方法中的基本数据类型复制到java栈。继续研究《深入JAVA虚拟机第二版》。听说可以通过CE或者OD这两款内存探测工具查看Java中变量的地址....继续.... 最近有点忙....