class AAA{
  String s = "abc";
  public void println(){
    String s1 = "abc1";
    System.out.println(s1);
  }
}请问下大家如果我new AAA();然后调用println();
内存中堆栈是如何分配的呢?
谁能给我解析下?

解决方案 »

  1.   

    步骤: 
    1) 栈中开辟一块空间存放引用str1;
    2) String池中开辟一块空间,存放String常量"abc"; 
    3) 引用str1指向池中String常量"abc";
    4) str1所指代的地址即常量"abc"所在地址,输出为true; Java中,只要使用 new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
      

  2.   

    AAA a=new AAA();
    a在栈区
    new AAA()实体在堆中,
    这个实体内的的s,s1 引用都在堆里。凡是在堆里的对象,对象内无论是值类型还是引用类型都在堆里。s,s1变量实体在常量堆里,AAA对外暴漏一个操作接口就是那个打印方法。
      

  3.   


    那假如我只是
    String a = "aaa";
    这个过程JVM是如何操作的呢?
      

  4.   

    栈内存存放引用,也可存放基本变量(可这么理解)new关键字创建对象均在堆内存。方法在代码区,不调用,对象不存在。字符串字面值存放在常量池
      

  5.   


    那常量池在堆中还是栈中呢?
    JVM中除了堆、栈、方法区域还有什么呢?
      

  6.   

    JVM将JVM所管理的所有内存资源分为2个大的部分。
    永久存储区(Permanent Space)
    和堆空间(The Heap Space)。
    其中堆空间又分为新生区(Young (New) generation space)
    和养老区(Tenure (Old) generation space)那 刚才我问的“堆栈”是在 永久存储区呢 还是堆空间呢?
      

  7.   

    永久存储区应该是存放编译好的class信息的,代码区,static常量及static引用的(个人猜的)
      

  8.   

    应该是对空间。对象是能被动态回收的,新生区与养老区与java的垃圾回收有关,具体的google一下吧
      

  9.   


    那就是说 我们刚才讨论的 String s = "abc" 只是在JVM中的"堆空间"中的"堆栈"里么?
      

  10.   


    请问 这两张图片中的 heap 、stack 、date seg在JVM中么?
    还是在JVM的"堆空间"中?
      

  11.   

    Java heap (Xmx, Xms) 和java进程的heap是两回事情<BR>
    java进程的heap包含:<BR>
       Java Heap<BR>
       Permanent Generation<BR>
       Thread stacks<BR>
       Native code<BR>
       Directly allocated memory<BR>
       Code generation<BR>
       Garbage collection<BR>
       TCP buffers这个怎么解释?
      

  12.   

    对于String s1 = "abc";
    其中:
    s1是在栈空间中。
    abc是在数据区空间中。
    对于String s2 = new String("def");
    其中:
    s2是在栈空间中。
    def是在堆空间中
    正如13楼的图所示。
      

  13.   

    JVM内存管理机制:
    堆空间,永久存储区JAVA内存分析:
    寄存器
    堆栈(stack)
    堆(heap)
    静态存储
    常量存储
    非RAM存储Java heap (Xmx, Xms) 和java进程的heap是两回事情
    java进程的heap包含:
    Java Heap
    Permanent Generation
    Thread stacks
    Native code
    Directly allocated memory
    Code generation
    Garbage collection
    TCP buffersJava heap (Xmx, Xms) 和java进程的heap为什么说是两回事?JVM内存管理 与 JAVA内存分析 还有下面的 java进程的heap 和Java heap(Xmx,Xms)
    他们之间谁包括谁?有何区别?
      

  14.   


    public A();
      Code:
       0:   aload_0
       1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
       4:   aload_0
       5:   ldc     #2; //String abc
       7:   putfield        #3; //Field s:Ljava/lang/String;
       10:  returnpublic void println();
      Code:
       0:   ldc     #4; //String abc1
       2:   astore_1
       3:   getstatic       #5; //Field java/lang/System.out:Ljava/io/PrintStream;
       6:   aload_1
       7:   invokevirtual   #6; //Method java/io/PrintStream.println:(Ljava/lang/St
    ing;)V
       10:  return
    查下指令看看。
      

  15.   

    String a="hello"; 声明一个String类型的 变量,变量的值是hello
    String a = new String("hello");是声明一个String类型的对象,对象的内容是helloString a="hello"; a是放在内存常量区String a = new String("hello");对象是放在内存堆空间里 ,引用放在栈空间,指向堆中的对象
      

  16.   

    Java中,只要使用 new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
      

  17.   

    编程思想里面的原话,你参考下 总结一下对象的创建过程。请考虑一个名为Dog的类:
    (1) 类型为Dog的一个对象首次创建时,或者Dog类的static方法/static字段首次访问时,Java解释器必须找到Dog.class(在事先设好的类路径里搜索)。
    (2) 找到Dog.class后(它会创建一个Class对象,这将在后面学到),它的所有static初始化模块都会运行。因此,static初始化仅发生一次——在Class对象首次载入的时候。
    (3) 创建一个new Dog()时,Dog对象的构建进程首先会在内存堆(Heap)里为一个Dog对象分配足够多的存储空间。
    (4) 这种存储空间会清为零,将Dog中的所有基本类型设为它们的默认值(零用于数字,以及boolean和char的等价设定)。
    (5) 进行字段定义时发生的所有初始化都会执行。
    (6) 执行构建器。正如第6章将要讲到的那样,这实际可能要求进行相当多的操作,特别是在涉及继承的时候。