2015-04-02 1 views
29

У меня есть приложение J2EE с интересным поведением ... куча, кажется, ведет себя хорошо, растет и сокращается с коллекциями мусора, как и ожидалось с течением времени. Нет заметного общего долгосрочного расширения кучи. Тем не менее, metaspace просто неуклонно растет со скоростью около 20 Мб в час, пока мы не нажмем MaxMetaspace и не столкнемся с OOME. Я попробовал как сборщики мусора с параллельным, так и G1 (jdk1.8.0_40).Как диагностировать утечку метапроцессора Java 8?

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

+0

Вы нашли ответ на этот вопрос еще? –

+0

Можете ли вы предоставить дополнительную информацию: JEE-сервер, используемые библиотеки. – sibnick

+1

Это была попытка запустить унаследованное J2EE-приложение на JBoss 4.2.3.GA под Java 8. Это не поддерживаемая конфигурация, но клиент действительно захотел попробовать ее. Я знаю, что с тех пор произошли серьезные изменения в загрузке JBoss, поэтому я подозреваю, что это проблема с загрузкой класса. Предположительная гипотеза Филиппа относительно генерации доверенных лиц может иметь некоторые достоинства. В конце концов мы решили «укусить пулю» и перенести приложение на Wildfly 8. –

ответ

3

Основная причина java.lang.OutOfMemoryError: Метапространство является:

  • либо слишком много классов или
  • слишком большие классы загружаются в Метапространство.

Если вы хотите, чтобы воссоздать проблему использовать этот фрагмент кода:

public class Metaspace { 
static javassist.ClassPool cp = javassist.ClassPool.getDefault(); 

public static void main(String[] args) throws Exception { 
    for (int i = 0; ; i++) { 
     Class c = cp.makeClass("eu.plumbr.demo.Generated" + i).toClass(); 
    } 
    } 
} 

Все эти сгенерированные определения классов в конечном итоге потребляя Метапространстве.

Javaassist в Maven repo.

Вы можете найти много больше о OOME here

3

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

Редактировать: В теории вы также можете быть уверены, что постоянно создаете прокси.

+1

Мы попробовали MAT classloader explorer. К сожалению, приложение занято и достаточно сложное, и утечка была достаточно медленной, что было по-прежнему «иглой в стоге сена». В любом случае эта конфигурация должна была быть промежуточным решением, и мы достигли точки уменьшения прибыли, поэтому мы сдались. –

+0

Я не знаю о проблеме WildFly. OP никогда не отлаживал проблему, поэтому это могло быть что угодно, включая его/ее приложение. –