Количество загруженных классов - PullRequest
0 голосов
/ 01 октября 2010

Я использую веб-сервис на Apache Tomcat 6.0.29 с Sun jdk1.6.0_21, веб-сервис использует Spring, Hibernate, Axis 1.4, Apache CXF, Jaxb и некоторые другие библиотеки.

Я слежу за экземпляром tomcat с помощью javamelody и могу узнать постоянный рост загруженных классов, а количество загруженных классов все еще растет в онлайн-режиме.

Так есть ли способ узнать, какие классы создаются, если сборщик мусора не выполнит очистку.

Это мои JAVA_OPTS

-Xmx768m -Xms512m -Xss4m  -XX:NewSize=256m -XX:MaxNewSize=256m -XX:MaxPermSize=128m -XX:PermSize=128m

Ответы [ 2 ]

1 голос
/ 01 октября 2010

Вы говорите о загруженных классах или загруженных экземплярах .

Почти 100 000 классов - это много. Весь RT из JRE 1.6 имеет около 17 тысяч классов, включая внутренние классы. 100 000 экземпляров на самом деле не так уж много.

Кроме того, классы не выгружаются (за исключением платформ, предназначенных для этого, таких как модули OSGi). Однако экземпляры, когда это необходимо, собирают мусор.

Если у вас нет исключений OutOfMemory (у вас достаточно места), сборщик мусора не должен быть таким агрессивным. Запустите Tomcat с меньшим объемом памяти, и вы увидите, что сборщик мусора начнет собирать более агрессивно. Я не рекомендую делать это на производстве, поскольку вы уменьшите производительность , оказывая давление на ГХ.

Кроме того, такой инструмент, как YourKit , может многое рассказать вам об объектах в памяти, в том числе я считаю, сколько из них имеют право на gc. Что не означает, что gc должен их собрать, но это возможно.

0 голосов
/ 01 октября 2010

Класс может быть выгружен только после того, как его загрузчик классов будет собран сборщиком мусора.Возможно, вы захотите сделать дамп кучи и выяснить, что ссылается на загрузчики классов.

Инструкции по анализу дампов кучи см .: Общая стратегия устранения утечки памяти Java?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...