Можно ли увидеть, сколько кучи использует объект? - PullRequest
1 голос
/ 26 мая 2011

Если у меня есть List<Object>, можно ли будет запустить какой-либо метод для каждого объекта, чтобы увидеть, сколько памяти каждый потребляет? Я ничего не знаю о каждом объекте, это может быть весь видеофайл, загруженный в кучу, или просто двухбайтовая строка. В конечном счете, я хотел бы знать, какие объекты отбрасывать в первую очередь, прежде чем закончится память.

Я думаю, Runtime.totalMemory() показывает память, используемую в данный момент JVM, но я хочу увидеть память, используемую одним объектом.

Ответы [ 6 ]

1 голос
/ 26 мая 2011

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

1 голос
/ 26 мая 2011
0 голосов
/ 26 мая 2011

На самом деле еще одна возможная тактика - просто создать дерьмовую загрузку экземпляра класса, который вы хотите проверить (например, миллион в массиве).

Огромное количество объектов должно сводить на нет накладные расходы (как внакладные расходы на другие вещи будут намного меньше, чем нагрузка на дерьмо объектов).

Вы, конечно, захотите запустить это изолированно (т. е. public static main ()).

Я будудопустим, вам понадобится много памяти для этого теста.

0 голосов
/ 26 мая 2011

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

Я бы не советовал делать это в производственной системе. Я лично сделал это один раз для экспериментов и оценки.

0 голосов
/ 26 мая 2011

Что-то, что вы можете сделать, это сделать Map<Object, Long>, который сопоставляет каждый объект с размером его памяти.

Затем, чтобы измерить размер конкретного объекта, вы должны сделать это при создании каждого объекта - мерапамять JVM используют до (вызов Runtime.totalMemory()) и после построения объекта (вызов Runtime.totalMemory()) и принимают разницу между двумя значениями - это размер объекта в памяти.Затем добавьте Object и Long на карту.Оттуда вы сможете просмотреть все ключи на карте и найти объект, используя наибольший объем пространства.

Я не уверен, что есть способ сделать это для объекта после того, как у вас уже естьваш List<Object> ... надеюсь, это полезно!

0 голосов
/ 26 мая 2011

Если вы находитесь в контейнере, вы можете использовать Jconsole http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html

JDK начиная с версии 1.5 поставляется с ulits к дампу кучи ... Вы в контейнере или в затмении?Кроме того, почему у вас есть список объектов ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...