论坛首页 Java企业应用论坛

如何获取一个对象的在内存中的大小?

浏览 16241 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-10-11  
new 一个对象后如何获取它在内存占用的大小?

Map map = new HashMap();
Foo foo = new Foo(1, "name");
map.put("foo",  foo);
foo在内存中多大?
想知道map占用的内存大小又如何获取?
   发表时间:2004-10-11  
这个问题我也不大清楚,高手们指点一下吧。
0 请登录后投票
   发表时间:2004-10-11  
System还是Runtime类有查看内存消耗的函数。Sun原来讲过的,好像分析的时候还有多调用几次GC
0 请登录后投票
   发表时间: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;
    }
}
0 请登录后投票
   发表时间:2004-10-11  
即使字段也不能简单的累加得到他们占用内存大小的,记得原来在SMTH还讨论过。其实你说的String内部的有哪些字段你也不知道啊,不只是个字符数组吧,呵呵
0 请登录后投票
   发表时间:2004-10-11  
而且你算List的时候还没算引用大小
0 请登录后投票
   发表时间:2004-10-11  
shenli 写道
即使字段也不能简单的累加得到他们占用内存大小的,记得原来在SMTH还讨论过。其实你说的String内部的有哪些字段你也不知道啊,不只是个字符数组吧,呵呵


管它什么字段,总之是在内存中的描述。不知道你指的讨论具体是什么,偶很孤陋寡闻的。:)
0 请登录后投票
   发表时间:2004-10-11  
shenli 写道
而且你算List的时候还没算引用大小


其实是算了的,前提是都实现了getCachedSize的Method。:)
而这个getCachedSize就是通过根类实现利用这个工具类来判断size,子类若有特殊情况则覆盖根类的方法
0 请登录后投票
   发表时间:2004-10-12  
算了,找不到了,大意好像就是JVM分配内存的时候是一块一块分配的,即使你的字段的字节达不到那么多,它还是把一块都分配给你了
0 请登录后投票
   发表时间:2004-10-12  
我大概查了一下。java中的内存分配是jvm动态分配的,具体的大小不是说list,或者string的字符多少决定的。还有些别的因素。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics