Как устранить ошибку «Недостаточно памяти» в производственной системе

Мы используем JBoss_4_0_4_GA с JDK 1.5.0 (без обновлений) в Windows

Сервер JBoss работает в оболочке (версия 3.2.3)http://wrapper.tanukisoftware.org.

Поскольку JVM очень старая, я даже не могу использовать опцию -XX: + HeapDumpOnOutOfMemoryError на JVM.

Каковы мои варианты, чтобы выяснить проблему?

Как обычно, исключение «Недостаточно памяти» происходит в разных частях приложения.

Я не могу сразу обновить JVM.

    The current VM settings
    Java Additional Parameters
    wrapper.java.additional.1=-Xms512m
    wrapper.java.additional.2=-Xmx1024m
    wrapper.java.additional.3=-Dsun.rmi.dgc.client.gcInterval=3600000
    wrapper.java.additional.4=-Dsun.rmi.dgc.server.gcInterval=3600000
    wrapper.java.additional.5=-Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser
    wrapper.java.additional.6=-Djava.endorsed.dirs=D:/jboss-4.0.4.GA/lib/endorsed

Фрагменты исключения

INFO | jvm 1 | 2012/05/31 11:25:03 | 11:25:03,502 ERROR [SOAPFaultExceptionHelper] SOAP request exception INFO | jvm 1 | 2012/05/31 11:25:03 | java.rmi.RemoteException: java.lang.OutOfMemoryError: Java heap space; nested exception is: INFO | jvm 1 | 2012/05/31 11:25:03 | java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space

INFO | jvm 1 | 2012/05/31 11:25:03 | Caused by: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space INFO | jvm 1 | 2012/05/31 11:25:03 | at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:205) INFO | jvm 1 | 2012/05/31 11:25:03 | at java.util.concurrent.FutureTask.get(FutureTask.java:80)

Ответы на вопрос(2)

Вы можете попробовать сделать дамп памяти сjmap (в упомянутых вами тегахjava 5 так что это должно быть возможно). Делайте несколько дампов, когда сервер все еще работает (например, каждый час или около того).

Затем проанализируйте их вEclipse MAT, Поиск объектов или коллекций объектов, которые растут на каждой свалке. Скорее всего, это будет ваша утечка памяти.

Я вижу два варианта, каждый из которых имеет свои плюсы и минусы:

  1. Install a profiler agent and connect a profiler on your application. This has of course some serious performance impact which may be not acceptable in your production environment. But this would allow you to monitor the application and perform a memory dump when Heap space is almost full.

  2. Reproduce your production environment elsewhere and also use a profiler. If your issues only appear with big loads, you may have to create load tests so that you reach the OOME.

Использование профилировщика - ваш лучший шанс обнаружить утечки памяти.

В противном случае вы всегда можете попробовать выполнить статический анализ кода, используя PMD и Findbugs (среди других инструментов статического анализа), которые могут обнаружить некоторые ошибки.

Ваш ответ на вопрос