如:局部变量String str = “aaaaaa”;
这句话应该需要在堆和栈中各开辟一段空间,
1. “aaaaaa”保存在栈中
2.  str这个引用变量保存在堆中,保存的是“aaaaaa”在栈中的内存地址题目的意思是str在堆中所占用的大小,我答的是4个字节(window 32位操作系统,所以是4字节),结果看到个红X。
有点想不通,求解

解决方案 »

  1.   


    是否需要分开回答呢? window下是多少,linux下是多少呢?想不明
      

  2.   

    1. “aaaaaa”保存在栈中
    2. str这个引用变量保存在堆中,保存的是“aaaaaa”在栈中的内存地址
    是不是搞错了,str这个引用变量保存在堆中????应该是:str 引用是压入栈中操作,相当于对象的内存中另一种标识,在堆中开辟空间存“aaaaaa”,操作的时候根栈中的引用找到堆中的对象,堆是存储的单位,栈是运行时的单位。
      

  3.   

    window 32位操作系统,所以是4字节   ????
    java   class文件跟操作系统有关系吗?
      

  4.   

    说反啦..
    "aaaaaa"在堆
    str这个 '引用' 在栈区
      

  5.   

    引用在栈中,但是《java语言规范》和《java虚拟机规范》并貌似没有规定这个引用占的字节数,应该每个虚拟机可以有自己的实现吧,比如IBM的和sun的,32位和64位的,可以自己选择多少位吧
      

  6.   

    我记得曾经在哪看到过的,是可以有jdk实现者自由选择的
      

  7.   

    IBM 和 SUN的vm这方面是一样的,因为将引用实现为指针,就是一个机器字大小了(32位4字节,64位8字节)
      

  8.   

    java使用unicode,任何字符,均为两字节
      

  9.   

    str 这个变量应该占的是4个字节我觉得问题目的人是不是应该问的是“aaaaaa”占几个字节而不是str这个变量
      

  10.   

    String 的问题真是取之不尽,用之不竭啊!
      

  11.   

    1. “aaaaaa”保存在堆中
    2. str这个引用变量保存在栈中,保存的是“aaaaaa”在堆中的内存地址
    str在栈中占用一个整型大小的空间,为“aaaaaa”的hashcode.
      

  12.   

    C++下测试:
    #include <iostream.h>
    #include <string>
    using namespace std;
    int main()
    {
    string str;
    str = "aaaaaa";
    cout<<sizeof(string)<<endl;
    cout<<sizeof(str)<<endl;
    cout<<sizeof("aaaaaa");
    return 0;
    }
    结果: 
    16
    16
    7
    不知有没有参考意义?
      

  13.   

    (1)String str=“aaaa”;
    (2)与String str=new String("aaaa") 是有区别的。(1)在编译时在程序的数据区分配内存,做为常量使用,也就是说str中存的就是“aaaa”,而不是地址。
     (2)在运行时在堆中分配内在。1个字符占两个字节,(1)占8个;
    (2)存有是地址,占几个字节,只有虚拟机知道
      

  14.   

    在常量池中吧。
    那是不是用这个类。MemoryUsagepublic class B {
    public B() {
    String s = "aaaaaa"; 
                // 注视掉:NonHead_Use:13089776 byte 没注释为:NonHead_Use:13089840 byte

    } public static void main(String[] args) throws Exception {
    MemoryMXBean mmxb = ManagementFactory.getMemoryMXBean();
    MemoryUsage nonHead = mmxb.getNonHeapMemoryUsage();
    System.out.println("NonHead_Use:" + nonHead.getUsed()); }
    }不知道这可以不?
    别笑我。