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。
关于栈与常量池有点晕。请大家帮忙解答。

解决方案 »

  1.   

    1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
    2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
    3. 堆:存放所有new出来的对象。
    4. 静态域:存放静态成员(static定义的)
    5. 常量池:存放字符串常量和基本类型常量(public static final)。
    6. 非RAM存储:硬盘等永久存储空间由此可见int a=3这个3是存放在栈中的!
      

  2.   

    基本类型也会进常量池啊?我从来没看过 JVM 实现的书,不过我觉得它应该直接编译进代码才对。需要保留常量的应该是字符串或其它静态的对象吧?
      

  3.   

    可不可心详细的讲讲常量池机制。它的作用域,内容什么的。对于String s = new String("abc")。会自动检查常量池中是否有abc这个串吗?
      

  4.   

    可不可以详细的讲讲常量池机制。它的作用域,内容什么的。对于String s = new String("abc")。会自动检查常量池中是否有abc这个串吗?
      

  5.   

    楼主请看《深入JAVA虚拟机第二版》第五章
      

  6.   


    java 里面的内存分别大致可以分为: 栈区,堆区,数据区(字符串,静态等数据),文本区(也就是放代码的地方)!
      

  7.   

    在java字节码中,short范围以内的整数有专门的指令,在short范围以外的整数是要进入常量池的。
      

  8.   

    还没学过JVM呢,这些还不怎么懂
      

  9.   

    有没有人可以详细讲讲。我现在正在研究JVM
      

  10.   

    很明显是存放在栈中的。这些通过JVM分配的变量时存在栈中的。程序员通过new运算符分配的内存是存在堆当中的。 
      

  11.   

    要是这个int i = 3; 不是属于某个类的成员变量  则存于栈
      

  12.   

    嗯,是的。要是这个变量在某个类中 。new 个A出来的话,这个3就在堆中了
    class A{
     public int i = 3;
     public void aa(){}
    }
      

  13.   

    http://www.svn8.com/java/yy/20100418/29437.html
    lz 看这里
      

  14.   

    东西已经看到了。但在《深入JAVA虚拟机第二版》书中看在常量池中有这么几种类型
    CONSTANT_Utf8,CONSTANT_Integer,CONSTANT_Float,CONSTANT_Long.......
    所以常量池中有基本数据类型的一席之地。所以我想是不是编译成class文件时将出现的基本数据类型全放在常量池中了。当执行方法时会把出现在方法中的基本数据类型复制到java栈。继续研究《深入JAVA虚拟机第二版》。听说可以通过CE或者OD这两款内存探测工具查看Java中变量的地址....继续.... 最近有点忙....