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");
}是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实现而言,对其他只有参考价值
因为一个String 最起码要存储自己的长度,不然每次调用 StringObject.length() 都要临时计算,不是效率很底?
基本类型保存在堆栈中,而用new生成的对象保存在堆中,string对象不属于主类型,相当于一个主类型数组。由于系统自动进行范围检查,所以,针对每个数组,以及在运行期间对索引的校验,都会造成少量的内存开销。所以,应该不止4Byte。
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");
}
}
这是因为如果有
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,我也不能知到具体
占多少内存,但好像要多一些。本人愚见。
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实现而言,对其他只有参考价值
byte b[]=new byte[0]; //16字节
byte b[]=new byte[1];//16字节
byte b[]=new byte[4];//16字节
byte b[]=new byte[5];//24字节