应该不只吧,String是一个对象,应该还需要一些额外的内存吧

解决方案 »

  1.   

    在java中,固定的类型占用固定的内存
      

  2.   

    我想不只是 4bytes
    因为一个String 最起码要存储自己的长度,不然每次调用 StringObject.length() 都要临时计算,不是效率很底?
      

  3.   

    肯定不止4Byte,具体多少和String的实现方式有关。
      

  4.   

    首先搞清楚java是怎么保存数据的,
    基本类型保存在堆栈中,而用new生成的对象保存在堆中,string对象不属于主类型,相当于一个主类型数组。由于系统自动进行范围检查,所以,针对每个数组,以及在运行期间对索引的校验,都会造成少量的内存开销。所以,应该不止4Byte。
      

  5.   

    0 byte因为"bb"是常量,不在堆中分配。
    public class StrMem
    {
    public static void main(String [] args)
    {
    Runtime r=Runtime.getRuntime();
    long freem=r.freeMemory();
    String a="bb";
    long strm=freem-r.freeMemory();
    System.out.println("str allocated "+strm+"bytes");

    }
    }
      

  6.   

    看来大家都挺重视基础知识么,好呀其中"bb"分配在一个特殊的区域叫做constant_pool,
    这是因为如果有 
    char[] c1= "bb";
    char[] c2= "bb";
    为了避免分配内存的浪费,这两个immutable constant
    放在constant_pool里共享,(其实学过汇编或者编译原理
    的人都知道,有个数据段,有个ds寄存器,一个道理),
    所以如果是char[] c1 = "bb";
    这条语句的话,内存中有4Byte的bb在constant_pool,
    (当然还有reference c1所占的内存)
    但如果是对于String就不同了,对于String aa = "bb";
    刚才没讲,其实编译器会把"bb"这里变成String("bb")
    用javap看看就是这样;
     0 ldc #2 <String "bb">
     2 astore_1

    String的构造函数如下
        public String(char value[]) {
    this.count = value.length;
    this.value = new char[count];
    System.arraycopy(value, 0, this.value, 0, count);
        }
    String利用了一个char[] value,用System.arraycopy()复制值,
    所以他另存了一份value。此外String还有offset,count,hash,
    btcConverter等等很多成员,Java没有sizeof,我也不能知到具体
    占多少内存,但好像要多一些。本人愚见。
      

  7.   

    在一个对象在JVM中第一次初始话的时候,为对象实例分配的内存空间比较多,几百到几千字节都有,因为要为所有的方法,静态变量等等分配内存,后来该类对象实例化的时候,就比较少了,我考察一下应该之为该类对象的所有非静态变量和父对象的所有非静态变量分配(因为同时需要构造一个父类对象),以及在构造函数中分配的变量,而且分配的粒度是8字节。比如对Object对象就是8字节。对
    class A{
    }是8字节;
    class A{
    byte i=9;
    }是16字节;
    class A{
    byte i=9;
    byte j=9;
    byte k=9;
    byte m=9;
    byte l=9;
    byte n=9;
    byte o=9;
    byte p=9;

    }是16字节;
    class A{
    byte i=9;
    byte j=9;
    byte k=9;
    byte m=9;
    byte l=9;
    byte n=9;
    byte o=9;
    byte p=9;
    byte q=9;

    }是24字节;
    而一个空的String 对象(用String a=new String();生成),是40个字节大小同
    class B {
        private char value[];
        private int offset;
        private int count;
        private int hash = 0;
        public B(){value=new char[0];}
    }一样。这样我们可以算算。
    3个int变量和一个数组ref变量value是16字节加上Object 对象的8字节加
    new char[0];16字节(可以测出来)。共是40字节。就是这样的了。
    String a=new String("bb");
    也是40个字节
    以上只是针对SUN的JDK1。4实现而言,对其他只有参考价值
      

  8.   

    另外在JAVA运行时栈和常数池不能计算为内存,运行时栈叫做寄存器似乎更加合适。
      

  9.   

    对于数组应该是预先分配12个字节的数组头用于记录数组的信息,然后按照元素的大小和数目分配,如
    byte b[]=new byte[0]; //16字节
    byte b[]=new byte[1];//16字节
    byte b[]=new byte[4];//16字节
    byte b[]=new byte[5];//24字节