3

假设我有:

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

4 回答 4

7

It may depend on JVM, but in practice, for 32-bit JVM, an object = 8-byte header + fields. Header consist of Id + reference to class.

Fields size depends on field type, reference - 8 bytes, boolean - 1 byte, etc

Besides objects are aligned to 8 bytes. That is your A takes 16 bytes. Minimum size = 8 bytes, no fields.

More here http://www.javamex.com/tutorials/memory/object_memory_usage.shtml

If you use Oracle JVM you can use sun.misc.Unsafe to investigate object structure, byte by byte.

于 2012-12-27T15:45:17.587 回答
0

不,它永远不可能与 C 中的大小相同,因为对象是在堆上创建的,而引用变量是在堆栈上创建的。因此,它的大小不会相同。

于 2012-12-27T15:43:15.560 回答
0

由于您的私人成员,它将是 Object 的大小加上 int 的大小。

"I can keep large HashMap in RAM without using database" just need to deal with persistentce: serialization and deserialization, and as Object stream it is be to much.

于 2012-12-27T15:43:15.753 回答
0

64 bit system is different to 31 bit system

64 bit system is different to 31 bit system

于 2013-02-27T01:48:04.153 回答