Обратите внимание, что тип OutOfMemoryError важен. Есть много вариантов этого. Прочитайте сообщение, которое приходит с исключением. Это может быть «пространство кучи Java», которое указывает на ошибку, связанную с кучей, но может также иметь другое сообщение, относящееся к другим областям памяти (см., Например, этот пост ).
Предполагая, что существует проблема с выделением кучи, вы можете использовать флаг JVM XX: + HeapDumpOnOutOfMemoryError для получения полного дампа кучи при возникновении ошибки. Затем вы можете использовать программу чтения дампов кучи и проанализировать результаты (например, VisualVM или jhat ).
Как уже упоминалось в другом ответе, вы также можете использовать инструмент командной строки jmap. Я бы начал с jmap -histo, который создает простую гистограмму разных классов. Если вы видите класс с необоснованным количеством экземпляров, у вас есть подозрение на утечку памяти.