0

Я бег приложения, которое имеет 4 гигабайтов maxmimum размера кучи -Xms4096m -Xmx4096m -Xmn1024m с GC, настроенных как -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=50 и GC интервал Dsun.rmi.dgc.server.gcInterval=43200000 -Dsun.rmi.dgc.client.gcInterval=43200000Heap Dump Analysis - Найти первопричину OutOfMemory Exception

Внезапно мое приложение пошло валить из памяти исключение, и я взял резьбовые отвалы и свалки кучи в тот же самый момент. При анализе дампов потоков потоки застревают из-за создания некоторого значения для hashMap и arrayList. ByteArrayOutStream создал блокировки в одном из потоков.

При анализе дампа кучи в инструменте анализатора памяти eclipse он ясно говорит, что объект bytearray занял почти 1 гиг кучи. Из GCViewer он показывает, что он имеет пик доли секунды. Я понимаю, почему вдруг объект массива Byte использовал 1 Gigs of space. Может кто-нибудь помочь мне сузить виновника.

- Application Server - Weblogic 12с

+0

Трудно сказать что-либо с предоставленной информацией. Можете ли вы показать более подробную информацию о вашем коде памяти потребления? – Minh

+0

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

+0

Дополнительная информация о кодах была бы полезна, при запуске приложения по умолчанию с предоставленными флагами jvm ничего не реплицирует для меня –

ответ

0

На Анализе дампа кучи в затмении инструмента анализатора памяти, он ясно говорит ByteArray объект занимает почти 1 гигабайты Heap.

Используйте кратчайшие пути к функции GC root MAT, чтобы увидеть, какие ссылки хранятся в этом массиве байтов.

+0

Я пробовал с слиянием Самый короткий путь к корням GC со всей ссылкой не показывая никаких ссылок. Я попытался с деревом Dominator, он показывает мне массив байтов байтов с адресом памяти «0x74d407870» и некоторыми значениями в байте []. Кроме этого, любым другим способом? – Arun

+0

возможно, что объект становится недоступным после выделения из-за OOME. Возможно, вы пытаетесь сериализовать что-то большое в ByteArrayOutStream, которое, конечно же, будет храниться в памяти до тех пор, пока оно не будет использовано. – the8472

+0

Вы правы. Попробуйте сериализовать объект. Из JVisualVM я могу видеть ссылку: this this (Java frame) - value: byte [] # 65581 (1 073 790 734 элемента) <- buf (Java frame) - class: java.io.ByteArrayOutputStream, value: byte [] # 65581 (1 073 790 734 элемента) <- out (Java frame) - класс: java.io.ObjectOutputStream $ BlockDataOutputStream, значение: java.io.ByteArrayOutputStream # 12 <- bout (Java frame) - class: com.terracotta.toolkit .object.serialization.SerializationStrategyImpl $ SerializerObjectOutputStream, значение: java.io.ObjectOutputStream $ BlockDataOutputStream # 13' – Arun