锁定老帖子 主题:如何获取一个对象的在内存中的大小?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-10-11
Map map = new HashMap(); Foo foo = new Foo(1, "name"); map.put("foo", foo); foo在内存中多大? 想知道map占用的内存大小又如何获取? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-10-11
这个问题我也不大清楚,高手们指点一下吧。
|
|
返回顶楼 | |
发表时间:2004-10-11
System还是Runtime类有查看内存消耗的函数。Sun原来讲过的,好像分析的时候还有多调用几次GC
|
|
返回顶楼 | |
发表时间:2004-10-11
偶不知道,即使有可能也是很耗时的方法。
你是不是想据此进行Cache控制,如果是给你介绍种做法 要求要放入Cache中的对象自行给出自己Size,如果是普通Java对象可以通过一些计算方式给出。可以参考 public class CacheSizes { public CacheSizes(); { } public static int sizeOfObject(); { return 4; } public static int sizeOfString(String string); { if(string == null); return 0; else return 4 + string.length(); * 2; } public static int sizeOfInt(); { return 4; } public static int sizeOfChar(); { return 2; } public static int sizeOfBoolean(); { return 1; } public static int sizeOfLong(); { return 8; } public static int sizeOfDouble(); { return 8; } public static int sizeOfDate(); { return 12; } public static int sizeOfMap(Map map); { if(map == null); return 0; int size = 36; Object values[] = map.values();.toArray();; for(int i = 0; i < values.length; i++); size += sizeOfString((String);values[i]);; Object keys[] = map.keySet();.toArray();; for(int i = 0; i < keys.length; i++); size += sizeOfString((String);keys[i]);; return size; } public static int sizeOfList(List list); { if(list == null); return 0; int size = 36; Object values[] = list.toArray();; for(int i = 0; i < values.length; i++); { Object obj = values[i]; if(obj instanceof String); { size += sizeOfString((String);obj);; continue; } if(obj instanceof Long); size += sizeOfLong(); + sizeOfObject();; else size += ((Cacheable);obj);.getCachedSize();; } return size; } } |
|
返回顶楼 | |
发表时间:2004-10-11
即使字段也不能简单的累加得到他们占用内存大小的,记得原来在SMTH还讨论过。其实你说的String内部的有哪些字段你也不知道啊,不只是个字符数组吧,呵呵
|
|
返回顶楼 | |
发表时间:2004-10-11
而且你算List的时候还没算引用大小
|
|
返回顶楼 | |
发表时间:2004-10-11
shenli 写道 即使字段也不能简单的累加得到他们占用内存大小的,记得原来在SMTH还讨论过。其实你说的String内部的有哪些字段你也不知道啊,不只是个字符数组吧,呵呵
管它什么字段,总之是在内存中的描述。不知道你指的讨论具体是什么,偶很孤陋寡闻的。:) |
|
返回顶楼 | |
发表时间:2004-10-11
shenli 写道 而且你算List的时候还没算引用大小
其实是算了的,前提是都实现了getCachedSize的Method。:) 而这个getCachedSize就是通过根类实现利用这个工具类来判断size,子类若有特殊情况则覆盖根类的方法 |
|
返回顶楼 | |
发表时间:2004-10-12
算了,找不到了,大意好像就是JVM分配内存的时候是一块一块分配的,即使你的字段的字节达不到那么多,它还是把一块都分配给你了
|
|
返回顶楼 | |
发表时间:2004-10-12
我大概查了一下。java中的内存分配是jvm动态分配的,具体的大小不是说list,或者string的字符多少决定的。还有些别的因素。
|
|
返回顶楼 | |