Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Утечка памяти, о чем говорит mat? / 18 сообщений из 18, страница 1 из 1
07.05.2016, 21:47
    #39231377
AK1988
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
Tomcat8 периодически падает из-за нехватки памяти. Сделали хипдамп, посмотрели через mat. Вот что показало

Код: sql
1.
2.
3.
4.
5.
The classloader/component "org.apache.catalina.loader.WebappClassLoader @ 0xf5e66210" occupies 5 381 480 (13,09%) bytes. The memory is accumulated in one instance of "java.util.concurrent.ConcurrentHashMap$Node[]" loaded by "<system class loader>".

Keywords
java.util.concurrent.ConcurrentHashMap$Node[]
org.apache.catalina.loader.WebappClassLoader @ 0xf5e66210




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
6 814 instances of "java.lang.Class", loaded by "<system class loader>" occupy 7 255 232 (17,65%) bytes.

Biggest instances:

class java.beans.ThreadGroupContext @ 0xf61e3618 - 1 968 472 (4,79%) bytes.


Keywords
java.lang.Class



кто может пояснить причины возникновения и подсказать пути решения?
...
Рейтинг: 0 / 0
07.05.2016, 23:05
    #39231394
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
Вам надо узнать что держит класслоадер. Там если не ошибаюсь есть view который называется потенциальные проблемы. Ну и плюс посмотрите gc roots скорее всего все прояснится. Если куча небольшая, можете выложить тут и мы посмотрим.
...
Рейтинг: 0 / 0
07.05.2016, 23:56
    #39231401
AK1988
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
забыл ник, дамп http://rgho.st/8C5wD7zmz, попробую поставить на гласфише или другой версии томката.
...
Рейтинг: 0 / 0
08.05.2016, 10:18
    #39231461
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
http://rsdn.ru/forum/java/5974292.1
Там в коментах ещё ссылка на хороший доклад по теме. Я бы посмотрел дамп, но сейчас не могу.
...
Рейтинг: 0 / 0
08.05.2016, 14:39
    #39231512
Partisan M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
AK1988Tomcat8 периодически падает из-за нехватки памяти. Сделали хипдамп, посмотрели через mat.

Нет утечки памяти и слова "хипдамп". Есть нехватка памяти, а не утечка. Очевидно, Tomcat-у не так задан размер кучи, или выражаясь по-вашему, heap-а. А именно, в настройках JVM для Tomvat-а, параметр JAVA_OPTS, или задано -Xms40m или такое (слишком маленькое) значение первоначального размера heap-а явно не задано и выделяется автоматически (пропорционально объёму памяти в ПК). То есть, оно оказалось в 40 МБ, а нужно задавать больше (в зависимости от программ от 256 МБ до значения -Xmx). Но если Tomcat установлен как служба, то значения могут быть взяты из JvmOptions файла установки службы service.bat, например:
--JvmMs 128 --JvmMx 256
(здесь значения в мегабайтах)

Какое именно значение используется, можно посмотреть такой программой, как jconsole. Также использование памяти (менее подробно, но в данном случае достаточно) показывается программой Tomcat Manager в пункте Server Status. Предыдущий ответ не имеет отношения к теме.
...
Рейтинг: 0 / 0
08.05.2016, 15:02
    #39231518
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
Утечка ресурсов, в том числе и памяти - вполне могут быть. IMHO & AFAIK
...
Рейтинг: 0 / 0
08.05.2016, 16:14
    #39231538
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
Partisan M
Плюсуюсь. При памяти в 40 Mb, подозревать утечку как-то странно.

При том, что большая часть памяти съедена самим Tomcat'ом + либами и, если я правильно понял, приложение всего-то занимает меньше пол-мегабайта.
...
Рейтинг: 0 / 0
08.05.2016, 16:41
    #39231549
AK1988
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
Поставил гласфиш, так же падает. Это так пробный проект на такой вот vds http://ru.hetzner.com/hosting/produkte_vserver/cx10 (1gb ram)
Включаю через скрипт, правда при падении томката не создается хипдамп, может с правами что не правильно, 1 пользователь - рут, для томката отдельно пользователя не создавал хз зачем он нужен если от рута запуск.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#!/bin/bash
export CATALINA_HOME=/opt/tomcat8
export JAVA_OPTS="-Xms256M -Xmx256M -XX:+UseConcMarkSweepGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tomcat8/dumps -Dfile.encoding=UTF-8";
PATH=/sbin:/bin:/usr/sbin:/usr/bin
start() {
 sh $CATALINA_HOME/bin/startup.sh
}
stop() {
 sh $CATALINA_HOME/bin/shutdown.sh
}
case $1 in
 start|stop) $1;;
 restart) stop; start;;
 *) echo "Run as $0 &lt;start|stop|restart&gt;"; exit 1;;
esac



catalina.out - томкат видит 256мб
http://pastebin.ubuntu.com/16300185/

лог после OutOfMemory - показывает 512
http://pastebin.ubuntu.com/16300237/

Может еще что в логах важное не замечаю? Сейчас еще посмотрю через jvisual и нужно попробовать увеличить память за счет swap.
...
Рейтинг: 0 / 0
08.05.2016, 16:50
    #39231551
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 178913280 bytes for committing reserved memory.
# Possible reasons:
# The system is out of physical RAM or swap space
# In 32 bit mode, the process size limit was hit

В 1.8 java-писатели, что-то с Non Heap memory больно намутили. Раньше был Heap и PermGen, сейчас это поменяли. Аналогичная хрен была при попытке поставить на 1Gb AWS (Amazon) инстанс, лично я не разбирался, просто на AWS инстанс добавил своп.

Хотя, конечно лучше со всеми ключиками-памяти разобраться.
...
Рейтинг: 0 / 0
08.05.2016, 17:07
    #39231558
AK1988
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
Leonid Kudryavtsev,

там ssd, поставил swap 2gb - vm.swappiness=10 vm.vfs_cache_pressure = 50, посмотрим что будет, теперь за jvisual.
...
Рейтинг: 0 / 0
08.05.2016, 20:45
    #39231617
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
AK1988Tomcat8 периодически падает из-за нехватки памяти. Сделали хипдамп, посмотрели через mat. Вот что показало
...

кто может пояснить причины возникновения и подсказать пути решения?

Нет, в Java утечек памяти нет!
...
Рейтинг: 0 / 0
08.05.2016, 20:57
    #39231618
AK1988
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
Blazkowicz,

сделав пару раз deploy и undeploy от некоторых классов нет остаточных объектов, например,

ProductDaoImpl
http://rgho.st/8z22RRZmH.view

,а от части классов остаются не удаленные объекты, например

RoleToUserProfileConverter
http://rgho.st/7wk6y7zjv.view

жму на не удаленный объект, затем "Show Nearest GC Root" - все показывают одну строку
http://rgho.st/7ngG7jTSL.view

AbandonedConnectionCleanupThread.

Добавил в конфиг томката classesToInitialize
Код: sql
1.
2.
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"
          classesToInitialize="com.mysql.jdbc.NonRegisteringDriver" />


Объект остается. Добавил лиснер

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
public class ContextFinalizer implements ServletContextListener {

    private static final Logger LOGGER = LoggerFactory.getLogger(ContextFinalizer.class);

    public void contextInitialized(ServletContextEvent sce) {
    }

    public void contextDestroyed(ServletContextEvent sce) {
        Enumeration<Driver> drivers = DriverManager.getDrivers();
        Driver d = null;
        while(drivers.hasMoreElements()) {
            try {
                d = drivers.nextElement();
                DriverManager.deregisterDriver(d);
                LOGGER.warn(String.format("Driver %s deregistered", d));
            } catch (SQLException ex) {
                LOGGER.warn(String.format("Error deregistering driver %s", d), ex);
            }
        }
//        Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
//        Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]);
//        for(Thread t:threadArray) {
//            if(t.getName().contains("Abandoned connection cleanup thread")) {
//                synchronized(t) {
//                    t.stop(); //don't complain, it works
//                }
//            }
//        }
        try {
            AbandonedConnectionCleanupThread.shutdown();
        } catch (InterruptedException e) {
            LOGGER.warn("SEVERE problem cleaning up: " + e.getMessage());
            e.printStackTrace();
        }
    }

}


Объект остается.

Blazkowicz, как чинили?
...
Рейтинг: 0 / 0
08.05.2016, 21:57
    #39231627
AK1988
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
Если добавить фильтр или без добавления фильтра убрать из папки webapp/lib mysqlconnector, а оставить mysqlconnector только в ($TOMCAT_HOME)/lib, то gc уперается в AppContext
http://rgho.st/7yd2jhN2b.view
хз, что дальше?
...
Рейтинг: 0 / 0
08.05.2016, 22:02
    #39231629
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
...
Рейтинг: 0 / 0
08.05.2016, 22:14
    #39231634
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
AK1988Если добавить фильтр или без добавления фильтра убрать из папки webapp/lib mysqlconnectorВозьмите за правило, что "глобальные" вещи должны быть исключительно в ${catalina.base}/lib. Библиотеки логирования и jdbc-драйверы - "безусловно глобальные".
Практически это означает, что в WEB-INF/lib (WEB-INF/classes) должно быть только то, что обязано находиться только там, а из того, что не обязано - только то, что:
а) является вашим кодом;
б) часто меняется;

Из всего этого так же следует, что настройкой среды для запуска сайта должен заниматься системный администратор хоста.
Если сайтов более одного - сисадмин обязан использовать раздельные catalina.base для каждого.
...
Рейтинг: 0 / 0
08.05.2016, 22:30
    #39231638
AK1988
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
Basil A. Sidorov,

спасибо! сейчас со свопом держится, если упадет, добавлю overcommit, но все-таки интересно решить проблему с редеплоем.
...
Рейтинг: 0 / 0
08.05.2016, 22:54
    #39231644
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
Не ленитесь корректно реализовывать методы init() / destroy() для каждого (своего) сервлета.
С методом init(), в общем-то, понятно - любая инициализация должна быть там и только там, а не в (упаси боже) статических блоках, например.
Метод destroy(), в свою очередь, должен устанавливать глобальный нестатический флаг завершения, который (в логически определённых местах) должны проверять методы service() и do_XXXX(). Желательно, чтобы destroy() отслеживал процесс завершения рабочих потоков.
...
Рейтинг: 0 / 0
09.05.2016, 10:59
    #39231722
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, о чем говорит mat?
вот тут много полезной инфы - http://java.jiderhamn.se/2012/03/04/classloader-leaks-vi-this-means-war-leak-prevention-library/

там же либа по устранению утечек
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Утечка памяти, о чем говорит mat? / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]