2010-10-19 8 views
4

Возможно ли найти использование памяти в объекте Java в приложении?Использование памяти Java Object - ibm jvm 1.4.2

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

У меня проблема, что несколько классов съедают огромный объем памяти и вызывает память проблемы, мое приложение получает сбой. Мне нужно найти это использование памяти (я работаю с ограниченными ресурсами памяти).

EDIT: Я использую Java 1.4:/

+0

Возможный дубликат http://stackoverflow.com/questions/390449/determining-java-memory-usage – nc3b

+0

@ nc3b Эта ссылка рассматривает больше о 1.5. Хотя стоит отметить, что URL: http://www.javamex.com/tutorials/memory/instrumentation.shtml. Хотелось бы иметь это в моей java:/ – Gadolin

ответ

0

Есть инструменты, которые поставляется с JDK, таких как jmap и jhat, который обеспечивает детали на уровне объектов.

+0

Спасибо, к сожалению, это внешние инструменты. Мне нужно получить эту информацию внутри, как указано. – Gadolin

1

Eclipse MAT - действительно хороший инструмент для анализа памяти.

+0

Спасибо, это кажется приятным, но это внешний инструмент. То, что я узнал на их странице http://wiki.eclipse.org/index.php/MemoryAnalyzer, - Если вы запустили приложение с флагом VM -XX: + HeapDumpOnOutOfMemoryError, куча кучи написана на первой ошибке Out Of Memory ,. Хотя я сомневаюсь, что это будет поддержано в моей java. – Gadolin

6

Просмотреть мой любимый проект, MemoryMeasurer. Крошечный пример:

long memory = MemoryMeasurer.measureBytes(new HashMap()); 

Вы также можете получить более качественное расстройство памяти:

Footprint footprint = ObjectGraphMeasurer.measure(new HashMap()); 

Например, я использовал последний для получения per entry cost of various data structures, где накладные расходы измеряются в количестве объектов, созданных, ссылки и примитивы, а не просто байты (что также можно сделать). Итак, в следующий раз, когда вы используете (по умолчанию) HashSet, вы можете сообщить, что каждый элемент в нем стоит 1 новый объект (не ваш элемент), 5 ссылок и int, что является одинаковой стоимостью для записи в HashMap (не является неожиданным, поскольку любой элемент HashSet попадает в HashMap) и так далее.

Вы можете использовать его на любом графике объекта. Если ваш графический объект содержит ссылки других структур, которые вы хотите игнорировать, вы должны использовать предикат, чтобы не исследовать их.

РедактироватьInstrumentation не доступен для Java 1.4 (вау, люди до сих пор используют это ?!), поэтому memoryBytes вызов выше, не будет работать для вас. Но второй будет. Тогда вы можете написать что-то вроде этого (если вы находитесь на 32-битной машине):

long memory = footprint.getObjects() * 8 + footprint.getReferences() * 4 + 
       footprint.getPrimitives().count(int.class) * 4 + 
       footprint.getPrimitives().count(long.class) * 8 + ...; 

Это дает вам приблизительно. Лучше ответ будет CEIL это до ближайшего кратного 16:

long alignedMemory = (x + 15) & (~0xF); //the last part zeros the lowest 4 bits 

Но ответ все еще может быть выключен, так как если вы найдете, скажем, 16 булевы, это одна вещь, если они находятся в том же объект, и совсем другое, если они распространены в нескольких объектах (и вызывают чрезмерное использование пространства из-за выравнивания). Эта логика может быть реализована как другая visitor (аналогично тому, как реализованы MemoryMeasurer и ObjectGraphMeasurer), но я не беспокоился, так как это то, что делает Instrumentation, так что это будет иметь смысл только для версий Java ниже 1.5 ,

+0

Хороший инструмент, но я должен проверить совместимость 1.4. – Gadolin

+0

См. Править тогда :) –

+0

+1, интересно. –

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