Java中的对象大小

时间:2012-12-27 15:38:38

标签: java object

假设我有:

Class A{
   int a;
}

A obj = new A();

那么obj的大小是多少?它是否与int大小相同,就像在C?

中一样

如果我能弄清楚这一点,那么我可以在不使用数据库的情况下将大型HashMap保留在RAM中。

提前致谢。

修改

其实我有:

HashMap<Long, List<T>> map;

class T{
   private int a;
   private int b;
   private int c;
   // constructor, getters and setters
}

地图的大小可能会增加到10000000个密钥,对于每个密钥,我将有100-1000的大小列表。

整个地图会留在堆里吗?

编辑2

当我用大约70000个密钥加载地图时,当我将其序列化为文件时,文件大约为18 MB,那么我的地图堆中的大小是18 MB吗?

4 个答案:

答案 0 :(得分:7)

它可能依赖于JVM,但实际上,对于32位JVM,对象= 8-byte header + fields。标题包含Id +对类的引用。

字段大小取决于字段类型,引用 - 8个字节,布尔值 - 1个字节等

除了对象对齐到8个字节。那是你的A需要16个字节。最小大小= 8个字节,没有字段。

更多http://www.javamex.com/tutorials/memory/object_memory_usage.shtml

如果使用Oracle JVM,则可以使用sun.misc.Unsafe逐字节地调查对象结构。

答案 1 :(得分:0)

没有。它永远不会与C中的大小相同,因为在堆上创建了一个对象,而在Stack上创建了一个引用变量。因此,它的大小不会相同。

答案 2 :(得分:0)

它将是Object的大小加上int的大小,因为你的私有成员。

“我可以在没有使用数据库的情况下将大型HashMap保存在RAM中”只需要处理persistentce:序列化和反序列化,并且作为对象流它就是很多。

答案 3 :(得分:0)

64位系统与31位系统不同

64 bit system is different to 31 bit system