设为首页 加入收藏

TOP

Java中的对象有多大?
2014-11-23 22:59:21 来源: 作者: 【 】 浏览:15
Tags:Java 对象

习惯了C与语言中精确计算一个结构体,一段数组的所占空间,在使用Java时就有些心里没底。虽然知道Integer比int要大,到底大多少?知道String比char[]要大,到底大多少?我甚至一度认为这是与JVM的GC相关的动态数字。 看了几篇针对性的文章,并做实验,有了明确的认识。




归纳成以下几个数字化的结论


关于String,先看一下String的定义


public final class String
implements java.io.Serializable, Comparable, CharSequence
{
/** The value is used for character storage. */
private final char value[];


/** The offset is the first index of the storage that is used. */
private final int offset;


/** The count is the number of characters in the String. */
private final int count;


/** Cache the hash code for the string */
private int hash; // Default to 0


一个空的String所占用的字节数, 共计40bytes。一个字符都没写,40bytes先用去了。 如果写入10个char,那就是占用40+10*2=60bytes。也由此可见,写入char的长度多大,越可以摊薄每一个char所占用的空间,毕竟这个40bytes的启动成本太重了。



举例,在实际工作中,经常遇到一些错误的实践,或者说省事儿的实践,就是在进行类型定义时,一切皆String。虽然性能优化不是最初该考虑的事情,但有时很快就会遇到不断调大Xmx,直至崩溃的场景。这里做一个实验,并通过JProfile来观察内存的使用情况。



String数组


String[] number_array = new String[ARRAY_SIZE];
for(int i=0; i number_array[i] = new String(i+"");
}


Integer数组


Integer[] number_array = new Integer[ARRAY_SIZE];
for(int i=0; i number_array[i] = new Integer(i);
}


int数组


int[] number_array = new int[ARRAY_SIZE];
for(int i=0; i number_array[i] = i;
}


效果
定义ARRAY_SIZE=8M
String数组: 494MB,平均每个String的空间约为66字节,符合预期。
Integer数组: 134MB,平均每个Integer的空间约为17字节,符合预期。
int数组: 40MB,(由于其内部实现为多段不连续的int[],因此加入多个array的空间成本),平均每个int的空间约为5字节,符合预期。
494MB vs 40MB, 12倍左右的差距,非常明显的改善。虽然我们在定义如同HashMap的类型时,无法直接使用int,退一步讲,对于ID类型的Key,使用Integer也要比String有明显的空间压缩。记住,一个空的String占40字节!


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言中 ##和#的作用 下一篇C++中static关键字总结

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: