Почему бы не отбросить контекст данных и просто заменяют его новым экземпляром?
Пара потенциальных проблем:
pmap -x
должен показать, как исчезла ваша память.
RES будет включать код + данные без заголовка. Кроме того, некоторые вещи, которые, как вы думаете, будут храниться в куче, не хранятся, например, стек потока и «данные класса». (Это вопрос определения, но код и данные класса управляются параметром -XX: MaxPermSize =
.)
Это похоже на утечку памяти либо в реализации JVM, либо в ядре Linux, либо в библиотеке. Код JNI.
Если вы используете Sun JVM, попробуйте IBM, или наоборот.
Я не совсем уверен, как работает dlopen, но код доступа к системным библиотекам может повторно отображать одно и то же, если это возможно.
12153] Наконец, вы должны использовать ulimit
, чтобы система отказала раньше, чтобы вы могли легко повторять тесты.
Похоже, у вас утечка. Разве вы не можете выполнить профилирование, чтобы увидеть, какая функция увеличивает объем памяти? Хотя я не уверен.
Если бы мне пришлось нанести удар в темноте, я бы сказал, что используемая вами JVM имеет утечку памяти.
WRT # 1, ваш RSS может быть больше, чем куча. Это связано с тем, что в RSS включены системные библиотеки и код, отличный от Java, но не размер кучи .
WRT # 2, Да, похоже, у вас какая-то утечка. Если сама система дает сбой, вы, вероятно, потребляете слишком много системных ресурсов, таких как сокеты, потоки или файлы.
Попробуйте использовать lsof, чтобы узнать, какие файлы открыты JVM. Выполните это несколько раз по мере увеличения вашей памяти. Если JVM дает сбой, обязательно установите параметр -XX: + HeapDumpOnOutOfMemoryError .