int aaa = 1024;
请问这条语句的aaa变量的名称“aaa”存放在哪里?看了帖子http://hi.baidu.com/wolf_childer/item/c9f906d2c8229613d90e44d2学习了内存分配,又看了百度百科http://baike.baidu.com/view/8680346.htm关于常量池的介绍。现在自己的理解是:
还是变量名称都以字符串的形式在常量表中呢?

解决方案 »

  1.   

    变量名放在常量表里。一个简单的类
    public class T {
    int aaa = 1024;
    }使用javap -verbose T可以看到const #5:(这个命令要在T.class所在的目录下执行)
    E:\workbench\back\bin>javap -verbose T
    Compiled from "T.java"
    public class T extends java.lang.Object
      SourceFile: "T.java"
      minor version: 0
      major version: 50
      Constant pool:
    const #1 = class        #2;     //  T
    const #2 = Asciz        T;
    const #3 = class        #4;     //  java/lang/Object
    const #4 = Asciz        java/lang/Object;
    const #5 = Asciz        aaa;
    const #6 = Asciz        I;
    const #7 = Asciz        <init>;
    const #8 = Asciz        ()V;
    const #9 = Asciz        Code;
    const #10 = Method      #3.#11; //  java/lang/Object."<init>":()V
    const #11 = NameAndType #7:#8;//  "<init>":()V
    const #12 = Field       #1.#13; //  T.aaa:I
    const #13 = NameAndType #5:#6;//  aaa:I
    const #14 = Asciz       LineNumberTable;
    const #15 = Asciz       LocalVariableTable;
    const #16 = Asciz       this;
    const #17 = Asciz       LT;;
    const #18 = Asciz       SourceFile;
    const #19 = Asciz       T.java;{
    int aaa;public T();
      Code:
       Stack=2, Locals=1, Args_size=1
       0:   aload_0
       1:   invokespecial   #10; //Method java/lang/Object."<init>":()V
       4:   aload_0
       5:   sipush  1024
       8:   putfield        #12; //Field aaa:I
       11:  return
      LineNumberTable:
       line 2: 0
       line 3: 4
       line 2: 11  LocalVariableTable:
       Start  Length  Slot  Name   Signature
       0      12      0    this       LT;
    }
      

  2.   

    变量名存放在方法的本地变量表中,debug的时候会用到。
    程序在运行中并没有用到本地变量表,这些变量的位置在编译的时候已经确定,
    比如iload_1就是将第一个本地变量放到操作栈。
      

  3.   

    程序运行时,我们最好对数据保存到什么地方做到心中有数。特别要注意的是内存的分配。有六个地方都可以保存数据:(1) 寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存 器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的 程序里找到寄存器存在的任何踪迹。(2) 堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆 栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存 方式,仅次于寄存器。创建程序时,Java 编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存 在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活 性,所以尽管有些Java 数据要保存在堆栈里——特别是对象句柄,但Java 对象并不放到其中。(3) 堆。一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同,“内存堆”或 “堆”(Heap )最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要 在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用 new 命 令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然 会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!(4) 静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间,静 态存储的数据将随时等候调用。可用 static 关键字指出一个对象的特定元素是静态的。但 Java 对象本身永 远都不会置入静态存储空间。(5) 常数存储。常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数 需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。(6) 非 RAM 存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。 其中两个最主要的例子便是“流式对象”和“固定对象”。对于流式对象,对象会变成字节流,通常会发给 另一台机器。而对于固定对象,对象保存在磁盘中。即使程序中止运行,它们仍可保持自己的状态不变。对 于这些类型的数据存储,一个特别有用的技巧就是它们能存在于其他媒体中。一旦需要,甚至能将它们恢复 成普通的、基于RAM的对象。Java 1.1提供了对Lightweight persistence的支持。未来的版本甚至可能提 供更完整的方案。int aaa = 1024;
    aaa属于有具体大小的数值,应该是存储在“堆栈”中。
    如果是static int aaa = 1024;
    那么应该是存储在“静态存储”中。
      

  4.   


    int aaa = 1024;
    继续刚才的说法,1024应该是存储在栈空间里,而基本数据类型的变量名称aaa应该存放在常量池里。
      

  5.   

    理解就行,除非对JVM虚拟机非常熟悉,据我看到的资料,不同的虚拟机会有差别,理解一个大概就可以了。除非你需要研究JVM。
      

  6.   

    基本类型的变量和数据都是放在栈中的吧,引用变量才有常量池这么一说。又或者你想问的是在class字节码中基本类型是怎么存放的?1楼回答的是这个问题。
      

  7.   

    基本数据类型变量和数据都是放到栈中;引用对象指针在栈中或常量中,值在堆中或者常量中;常量池是针对java中常量对象,一般会有修饰符:static final;
      

  8.   

    这个我是说错了,因为只有引用才会是这样,对于=我还是一概而论了,这是错的。
    对于int aaaa = 1024 ;其是存放在栈里面的,因为栈存放的是基本类型的数据和引用;aaaa也是在
    栈内存中,而且这个变量名就标识着那个存储数据的内存空间,jvm就是通过这个变量名来操作该内存空间的。
    也有人认为会涉及到常量池,我觉得没有这个可能,因为常量池是用来存储字符串常量和基本数据常量的,
    而aaaa明显不是常量,因为常量是不可变的,aaaa可以被赋予其他值,所以不是,而且很明显的标志就是
    基本数据常量会被static final修饰。