2012-06-28 2 views
2

Можно создать дубликат:
In Java, what is the best way to determine the size of an object?Расчет «вес» объекта, HOWTO

Предположим, у вас есть структура данных, которая позволяет добавлять в него данные, скажем, список:

List<KeyValuePair> 

Как клиент системы фактически добавляет контент ... в какой-то момент у JVM закончится память, это всего лишь aq когда это происходит. Было бы неплохо периодически сохранять объект, содержащий этот список, на диске, а остальное - gc.

Использование Java, можно ли оценить, сколько памяти занимает объект сейчас?

+1

Вы действительно хотите оценить размер объекта? Кажется, что правильный вопрос, который нужно задать, «дается, что у меня есть огромный объект, как я могу сказать, когда пришло время записать его на диск и отказаться от него?» – templatetypedef

+1

Достаточно честный, но мне нужно знать, что такое «огромное средство», верно? – JAM

+0

повторяет: http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an-object –

ответ

3

Вы ищете java.lang.instrument.Instrumentation.getObjectSize(Object object)

Документация:

Возвращает приближение конкретной реализации в размере хранения, потребляемой указанным объектом. Результат может включать в себя некоторые или все служебные данные объекта и, следовательно, полезно для сравнения в реализации, но не между реализациями. Оценка может измениться в течение одного вызова JVM.

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/instrument/Instrumentation.html#getObjectSize%28java.lang.Object%29

Но для того, чтобы иметь возможность использовать его:

Единственный способ получить доступ к экземпляру интерфейс инструментария является для JVM будет запущен таким образом, чтобы указывает класс агента - см. спецификацию пакета. Экземпляр Instrumentation передается в метод premain класса агента. Когда агент приобретает экземпляр Instrumentation , агент может в любой момент вызвать методы в экземпляре .

Хороший пример реализации: http://www.javalobby.org/java/forums/t19309.html

+0

Не могли бы вы привести пример? – JAM

+0

Я следую этому руководству, когда мне нужна эта функциональность: http://www.javalobby.org/java/forums/t19309.html –

3

Метод getObjectSize() может быть тем, что вы ищете.
Цитата из документации Interface Instrumentation:

GetObjectSize (Объект objectToSize)
Возвращает приближение реализации конкретной суммы хранения, потребляемую указанный объект.

1

Вы можете сделать это, делая много одних и тех же объектов и измерения память, занятую. Я использовал эту технику несколько раз со стабильными, повторяемыми результатами.В схеме,

public static void main(String[] args) { 
    final Object[] a = new Object[10000]; 
    final long startMem = memTaken(); 
    for (int i = 0; i < a.length; i++) a[i] = new Object(); 
    System.out.println((memTaken() - startMem)/a.length); 
    a.hashCode(); 
} 
static long memTaken() { 
    final Runtime rt = getRuntime(); 
    try { 
    rt.gc(); Thread.sleep(50); 
    rt.gc(); Thread.sleep(50); 
    } catch (InterruptedException e) {} 
    final long memTaken = rt.totalMemory() - rt.freeMemory(); 
    System.out.println("Mem taken " + memTaken); 
    return memTaken; 
} 

Это надежно производит номер 24 на моей машине. Преимущество такого подхода заключается в том, что он автоматически учитывает эффективное воздействие кучи вашего объекта на все, что учитывается. Конечно, вы должны, конечно, убедиться, что он надежен в настройке, прежде чем доверять ему.

Смежные вопросы