假设我有:
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吗?
答案 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位系统不同