powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как понять откуда взялись массивы примитивов в Heap Dump?
16 сообщений из 16, страница 1 из 1
Как понять откуда взялись массивы примитивов в Heap Dump?
    #38545232
Dymytry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
День добрый!

Имею Heap Dump в Visual VM. Возникают вопросы:

1) Не понимаю что показывает VisualVM в графе суммарный сайз в разделе "по классам". Как известно, там показывается список классов и рядом размер памяти, занимаемый инстансами этих классов. Вопрос: это полная память которую занимают инстансы этих классов, или это память без вложенных в эти инстансы объектов других классов?

Допустим, в анализаторе написано что массивы char[] занимает 40% памяти. Как я понимаю, эти массивы могут быть или локальными переменными в каких-то методах, или быть полями каких-то классов. Следовательно, может быть инстансы какого-то класса занимают эти 40% памяти, или два по 20% итд. Вот я и хочу понять что это за классы. Собственно это второй вопрос:

2) В куче много объектов int[], char[] итд. Они занимают наибольшее место. Однако я не знаю откуда они берутся. Как мне это понять? Я предполагаю, что можно написать запрос на OQL, который выведет все объекты, хранящие массивы примитивов и отсортирует их по суммарной памяти которую они занимают. Как написать такой запрос?
...
Рейтинг: 0 / 0
Как понять откуда взялись массивы примитивов в Heap Dump?
    #38545251
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сохраняйте этот дамп и открывайте его в Eclipse Memory Analyzer, а там первым делом Dominator Tree. Разглядывать масивы в Visual VM - пустое занятие
...
Рейтинг: 0 / 0
Как понять откуда взялись массивы примитивов в Heap Dump?
    #38545262
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dymytry1) Не понимаю что показывает VisualVM в графе суммарный сайз в разделе "по классам". Как известно, там показывается список классов и рядом размер памяти, занимаемый инстансами этих классов. Вопрос: это полная память которую занимают инстансы этих классов, или это память без вложенных в эти инстансы объектов других классов?

На сколько я помню в VisualVM просто размер, без внутренних классов (то есть размер поля это размер ссылки, а не размер объекта, на который поле ссылается). Не помню, умеет ли VisualVM, но в YourKit есть ещё и оценочный полный размер с внутренностями.

DymytryДопустим, в анализаторе написано что массивы char[] занимает 40% памяти. Как я понимаю, эти массивы могут быть или локальными переменными в каких-то методах, или быть полями каких-то классов.

Это скорее всего строки. Если их много, от по количеству объектов типа String будет это видно. Или CLOB-ы.

Dymytry2) В куче много объектов int[], char[] итд. Они занимают наибольшее место. Однако я не знаю откуда они берутся. Как мне это понять? Я предполагаю, что можно написать запрос на OQL, который выведет все объекты, хранящие массивы примитивов и отсортирует их по суммарной памяти которую они занимают. Как написать такой запрос?
Нет. Открываешь список всех классов - выбираешь что нужно int[] или char[]. Даблклик - получаешь список всех экземпляров этого типа. В списке роешься, смотришь содержимое - уже по содержимому можно понять что это за строки (char[]) и что в них.
Выбираешь самые типичные, которых в памяти быть не должно. Если экземпляров много, я обычно в середину тыкаю после сортировки по размеру. Либо по размеру можно выбрать крупные, если их явно не должно быть в памяти.

Потом открываете один какаой экземпляр, вверху будут всего его поля. А внизу все, кто на него ссылается. Вот в нижней секции есть полезная опция - правой клик - Nearest GC Roots - по нему находите что ваше массивы связаны с JDBC драйвером и лежат в его кешах, потому что вы Statement-ы или где-то не закрываете.
...
Рейтинг: 0 / 0
Как понять откуда взялись массивы примитивов в Heap Dump?
    #38545270
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraРазглядывать масивы в Visual VM - пустое занятие
Та ладно. Для небольших куч Visual VM - вполне норм.
...
Рейтинг: 0 / 0
Как понять откуда взялись массивы примитивов в Heap Dump?
    #38545400
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDBC используется?
...
Рейтинг: 0 / 0
Как понять откуда взялись массивы примитивов в Heap Dump?
    #38545459
Dymytry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

нет, есть считывание файла с диска и отправка его по сети.
...
Рейтинг: 0 / 0
Как понять откуда взялись массивы примитивов в Heap Dump?
    #38545492
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dymytryнет, есть считывание файла с диска и отправка его по сети.
Считывания куда?
...
Рейтинг: 0 / 0
Как понять откуда взялись массивы примитивов в Heap Dump?
    #38545498
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тут собственно кратко и доступно
http://visualvm.java.net/heapdump.html
Если дамп не большой, можете выложить его, я посмотрю. Или картинки сделайте аналогичные - приаттачте к форуму.
...
Рейтинг: 0 / 0
Как понять откуда взялись массивы примитивов в Heap Dump?
    #38545500
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DymytryДопустим, в анализаторе написано что массивы char[] занимает 40% памяти.
Это поля java.lang.String. И цифра 40% - вполне себе нормальная цифра.
...
Рейтинг: 0 / 0
Как понять откуда взялись массивы примитивов в Heap Dump?
    #38545638
Dymytry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, похоже на то.

1.
Пишет сейчас:
Instances Size
char[] 37428 3000000
String 37210 1000000

Ну да, похоже все это строки. Похоже что размер классов указывается без размеров вложенных объектов. Но почему такая разница между char[] и String ? По идее ссылка на String должна быть небольшой по размеру, а char[] должен содержать в себе ссылку и все буквы и должен быть больше.
То есть получается так: размер ссылки на строку 40 байт, размер ссылки на char[] + содержимое = 80 байт. Получается полностью объект Строка занимает 120 байт как минимум, что ли? Из которых большая часть - ссылка, а не буковки.

2. скажите, может ли быть ситуация когда утечки памяти нет, GC все убирает, но генерация мусора слишком велика и система не справляется - становится слишком медленной или OutOfMemory?

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

Спасибо за ссылки, пойду почитаю, или может Eclipse поставлю.
...
Рейтинг: 0 / 0
Как понять откуда взялись массивы примитивов в Heap Dump?
    #38545639
Dymytry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczDymytryнет, есть считывание файла с диска и отправка его по сети.
Считывания куда?

Файл считывается в память и отправляется по сети на сервер.
...
Рейтинг: 0 / 0
Как понять откуда взялись массивы примитивов в Heap Dump?
    #38545670
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DymytryНу да, похоже все это строки. Похоже что размер классов указывается без размеров вложенных объектов. Но почему такая разница между char[] и String ? По идее ссылка на String должна быть небольшой по размеру, а char[] должен содержать в себе ссылку и все буквы и должен быть больше.
Object занимает от 8 до 16 байт в зависимости от версии JVM. Помимо строк char[] интенсивно выделяют
StringBuffer, StringBuilder и реализации *Reader-ов, *Writer-ов. И не забывай что строки в Unicode.

Твои расчётные формулы про 120 байт скорее всего не верны. Их надо пересчитать с учётом того не все
char[] обязательно стоят в контейнере String.

скажите, может ли быть ситуация когда утечки памяти нет, GC все убирает, но генерация мусора слишком велика и система не справляется - становится слишком медленной или OutOfMemory?
Это в реальности так и происходит. Мы расплачиваемся за Memory Model постоянной текучестью
памяти. И часть мегафлопов уходит на постоянную уборку.

По поводу крашей или перегрузок GC - думаю можно создать искусственно ситуацию когда
в памяти будет много ненужных объектов но удалить их трудно.
...
Рейтинг: 0 / 0
Как понять откуда взялись массивы примитивов в Heap Dump?
    #38545672
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dymytryда, похоже на то.
1. Пишет сейчас:
Instances Size
char[] 37428 3000000
String 37210 1000000

Ну да, похоже все это строки. Похоже что размер классов указывается без размеров вложенных объектов. Но почему такая разница между char[] и String ? По идее ссылка на String должна быть небольшой по размеру, а char[] должен содержать в себе ссылку и все буквы и должен быть больше.

Сложно сказать. Может там строки короткие?
Но судя по тому что кол-во экземпляров совпадает, да это строки.
Открыл посмотрел VisualVM - там вон есть кнопка Compute Retained Sizes - это будет размер с вложениями.

DymytryТо есть получается так: размер ссылки на строку 40 байт, размер ссылки на char[] + содержимое = 80 байт. Получается полностью объект Строка занимает 120 байт как минимум, что ли? Из которых большая часть - ссылка, а не буковки.

Что-то много вы посчитали. Вроде 20 байт размер строки (Java 7)

Dymytry2. скажите, может ли быть ситуация когда утечки памяти нет, GC все убирает, но генерация мусора слишком велика и система не справляется - становится слишком медленной или OutOfMemory?

Да, конечно, если куча заполнена так и будет. Есть отдельный параметр, которым настраивается когда должен выкинуться OutOfMemoryError - при определенном наполнении кучи и при работе GC дольше определенного времени.

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

Если выложите дамп, могу посмотреть и объяснить.
...
Рейтинг: 0 / 0
Как понять откуда взялись массивы примитивов в Heap Dump?
    #38545673
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DymytryФайл считывается в память и отправляется по сети на сервер.
А зачем в память? IO Stream-ы или NIO Channel transfer не используются как нужно?
...
Рейтинг: 0 / 0
Как понять откуда взялись массивы примитивов в Heap Dump?
    #38547686
Dymytry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
если вдаваться в подробности,
то:
используется Netty как оболочка для RTMP клиента. Однако в данном исполнении клиента SimpleChannelUpstreamHandler-ы хранят состояния, поэтому когда мое приложение публикует на сервер несколько потоков - для каждого создается ClientBootstrap, в каждый из которых вставляется свой новый SimpleChannelUpstreamHandler (который нужен чтобы конвертить байты в объекты RtmpMessage и обратно). Эти хэндлеры и занимают много памяти, но я пока не понимаю, можно ли использовать одну общую PipelineFactory для публикации разных потоков.

0. Одна из проблем явно в этом, пробую разобраться.

1. А вот как выглядит память в Memory Profiler:

http://pasteboard.co/poU1E38.png

Я просто даже не представляю, что это может быть.

2. Непонятная мне особенность VisualVM - то что оно делает GC память если получать Heap Dump. Получается, что если моя проблема в том что слишком много инстансов, но вообще они все собираемы GC, но я никогда этого не обнаружу. Потому что при нажатии на getHeapDump они все благополучно собирутся. Как в картинке из п. 1: я не могу понять что вызывает такой рост памяти, потому что в момент роста система не отвечает, а когда отвечает - поздно. OutOfMemory нет, хотя может просто не выводится...
...
Рейтинг: 0 / 0
Как понять откуда взялись массивы примитивов в Heap Dump?
    #38548216
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать настроить создании дампа на OOME
http://stackoverflow.com/a/8311489
Правда, на больших кучах может работать не стабильно.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как понять откуда взялись массивы примитивов в Heap Dump?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]