powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Tomcat: предупреждение об утечке памяти
14 сообщений из 14, страница 1 из 1
Tomcat: предупреждение об утечке памяти
    #39842548
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

CentOs7 + Tomcat8 + MariaDB10

Web приложение крутится на Tomcat и пишет в MariaDB через HikariCP.
При остановке приложения я закрываю HikariCP через метод close(). Сами соединения не закрываю.
В результате в логе Tomcat получаю предупреждения:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
INFO | HikariPool-1 - Starting...
 INFO | HikariPool-1 - Start completed.
 INFO | HikariPool-1 - Shutdown initiated...
 INFO | HikariPool-1 - Shutdown completed.
 INFO | JMS connection closeed successfully
29-Jul-2019 14:10:53.306 INFO [main] org.apache.catalina.core.StandardServer.await A valid shutdown command was received via the shutdown port. Stopping the Server instance.
29-Jul-2019 14:10:53.306 INFO [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8080"]
29-Jul-2019 14:10:53.342 INFO [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-8009"]
29-Jul-2019 14:10:53.364 INFO [main] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina]
29-Jul-2019 14:10:53.379 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [scjmsconsumer] registered the JDBC driver [org.mariadb.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
29-Jul-2019 14:10:53.395 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [scjmsconsumer] appears to have started a thread named [MariaDb-bulk-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
 java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:458)
 java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
 java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:924)
 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
 java.lang.Thread.run(Thread.java:748)
...
Рейтинг: 0 / 0
Tomcat: предупреждение об утечке памяти
    #39842557
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соединения открываются через try-with-resources
...
Рейтинг: 0 / 0
Tomcat: предупреждение об утечке памяти
    #39842570
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну собственно томкат сам пытается подчистить лики, о чем и пишел в лог.
Чтобы проверить получилось ли у него или нет - надо задеплоить томкат, открыть jVisualVM прочекать память, предварительно запустив сборку мусора, потом наживую передеплоить томкат, опять собрать мусор и сравнить объем памяти. Если он +- такой же - значит волноваться не стоит, если в 2 раза больше - значит лик есть.
...
Рейтинг: 0 / 0
Tomcat: предупреждение об утечке памяти
    #39842575
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как в jVisualVM предварительно запустить сборку мусора?
забыл ник,
...
Рейтинг: 0 / 0
Tomcat: предупреждение об утечке памяти
    #39842605
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я имею ввиду после того как приложение задеплоилось сделай сборку мусора, чтобы понять сколько оно памяти ест, и тоже самое после редеплоя. А запустить ее надо нажав на кнопку Perform GC если не изменяет память
...
Рейтинг: 0 / 0
Tomcat: предупреждение об утечке памяти
    #39842611
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar, все написано в сообщении:
Molasarregistered the JDBC driver ... To prevent a memory leak, the JDBC Driver has been forcibly unregistered


- смысл: либо используйте JDBC-пул настроенный в Tomcat (тогда он сам будет анрегистерить драйвер), либо делайте это в своем коде сами (еще ни разу не видел чтобы кто то это делал). Иначе будет течь память (при каждом старте приложения драйвер регистрируется заново, а при стопе не арегистрится).
...
Рейтинг: 0 / 0
Tomcat: предупреждение об утечке памяти
    #39842680
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarWeb приложение крутится на Tomcat и пишет в MariaDB через HikariCP.
При остановке приложения я закрываю HikariCP через метод close(). Сами соединения не закрываю.
В результате в логе Tomcat получаю предупреждения:Перенесите jdbc-драйвера и, вероятно, HikariCP из контекста приложения в ${CATALINA.BASE}/lib
...
Рейтинг: 0 / 0
Tomcat: предупреждение об утечке памяти
    #39843422
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скопировал.
В в каталоге приложения WEB-INF\lib их нужно удалить?
Как собрать war без зависимостей?
Basil A. SidorovMolasarWeb приложение крутится на Tomcat и пишет в MariaDB через HikariCP.
При остановке приложения я закрываю HikariCP через метод close(). Сами соединения не закрываю.
В результате в логе Tomcat получаю предупреждения:Перенесите jdbc-драйвера и, вероятно, HikariCP из контекста приложения в ${CATALINA.BASE}/lib
...
Рейтинг: 0 / 0
Tomcat: предупреждение об утечке памяти
    #39843505
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переносом драйвера JDBC из контекста приложения в ${CATALINA.BASE}/lib я избавился от предупреждения failed to unregister it when the web application was stopped.
При этом в POM я добавил <scope>runtime</scope> для mariadb-java-client

Но при этом остаются предупреждения:
Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
31-Jul-2019 14:14:47.699 WARNING [http-nio-8080-exec-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [scjmsconsumer-0.0.1] appears to have started a thread named [MariaDb-bulk-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)
 java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(Unknown Source)
 java.util.concurrent.SynchronousQueue$TransferStack.transfer(Unknown Source)
 java.util.concurrent.SynchronousQueue.poll(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 java.lang.Thread.run(Unknown Source)
31-Jul-2019 14:14:47.702 WARNING [http-nio-8080-exec-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [scjmsconsumer-0.0.1] appears to have started a thread named [MariaDb-bulk-2] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)
 java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(Unknown Source)
 java.util.concurrent.SynchronousQueue$TransferStack.transfer(Unknown Source)
 java.util.concurrent.SynchronousQueue.poll(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 java.lang.Thread.run(Unknown Source)
31-Jul-2019 14:14:47.703 WARNING [http-nio-8080-exec-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [scjmsconsumer-0.0.1] appears to have started a thread named [MariaDb-bulk-3] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)
 java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(Unknown Source)
 java.util.concurrent.SynchronousQueue$TransferStack.transfer(Unknown Source)
 java.util.concurrent.SynchronousQueue.poll(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 java.lang.Thread.run(Unknown Source)
31-Jul-2019 14:14:47.704 WARNING [http-nio-8080-exec-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [scjmsconsumer-0.0.1] appears to have started a thread named [MariaDb-bulk-4] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)
 java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(Unknown Source)
 java.util.concurrent.SynchronousQueue$TransferStack.transfer(Unknown Source)
 java.util.concurrent.SynchronousQueue.poll(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 java.lang.Thread.run(Unknown Source)
31-Jul-2019 14:14:47.705 WARNING [http-nio-8080-exec-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [scjmsconsumer-0.0.1] appears to have started a thread named [MariaDb-bulk-5] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)
 java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(Unknown Source)
 java.util.concurrent.SynchronousQueue$TransferStack.transfer(Unknown Source)
 java.util.concurrent.SynchronousQueue.poll(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 java.lang.Thread.run(Unknown Source)
31-Jul-2019 14:14:47.707 WARNING [http-nio-8080-exec-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [scjmsconsumer-0.0.1] appears to have started a thread named [MariaDb-bulk-6] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)
 java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(Unknown Source)
 java.util.concurrent.SynchronousQueue$TransferStack.transfer(Unknown Source)
 java.util.concurrent.SynchronousQueue.poll(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 java.lang.Thread.run(Unknown Source)


После остановки приложения потоки MariaDb-bulk остаются припаркованными в памяти. Как их закрыть?
...
Рейтинг: 0 / 0
Tomcat: предупреждение об утечке памяти
    #39843518
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жизненный цикл сервлета предусматривает методы init() и destroy().
В первом инициализируете подключение к базе при развертывании (старте) контекста приложения, во втором - "прибираетесь" при "свёртывании".
Учитываете, что в обоих методах не должно быть "долгоиграющих" действий и что один и тот же сервлет может работать в нескольких контекстах: static и прочая "глобализация" только там, где вы точно понимаете, что именно вы делаете.
...
Рейтинг: 0 / 0
Tomcat: предупреждение об утечке памяти
    #39843635
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ниже простейший пример, который вызывает это предупреждение:
Код: java
1.
2.
WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ConnTest2] appears to have started a thread named [MariaDb-bulk-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)

Причем припаркованные, но не завершенные, потоки MariaDB-bulk возникают при использовании statement.executeBatch().
Всё закрыто, всё прибрано.
Код: 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.
@WebListener
public class CTServletContextListener implements ServletContextListener {

    private static HikariDataSource hikariDataSource;

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        hikariDataSource = new HikariDataSource(getHikariConfig());
        
        try (Connection connection = hikariDataSource.getConnection();
                Statement statement = connection.createStatement()) {
            statement.addBatch("insert into mytab1 (id) values (1)");
            statement.executeBatch();
            connection.commit();
        } catch (SQLException ex) {
            Logger.getLogger(CTServletContextListener.class
                    .getName()).log(Level.SEVERE, null, ex);
        }
        
        hikariDataSource.close();
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    }

    private HikariConfig getHikariConfig() {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setJdbcUrl("jdbc:mariadb://192.168.0.158:3306/scjmsdb");
        hikariConfig.setUsername("user");
        hikariConfig.setPassword("user");
        hikariConfig.setDriverClassName("org.mariadb.jdbc.Driver");
        return hikariConfig;
    }


Basil A. SidorovЖизненный цикл сервлета предусматривает методы init() и destroy().
В первом инициализируете подключение к базе при развертывании (старте) контекста приложения, во втором - "прибираетесь" при "свёртывании".
Учитываете, что в обоих методах не должно быть "долгоиграющих" действий и что один и тот же сервлет может работать в нескольких контекстах: static и прочая "глобализация" только там, где вы точно понимаете, что именно вы делаете.
...
Рейтинг: 0 / 0
Tomcat: предупреждение об утечке памяти
    #39843665
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarВсё закрыто, всё прибрано.
Код: java
1.
2.
3.
4.
5.
6.
try (Connection connection = hikariDataSource.getConnection();
  Statement statement = connection.createStatement()) {
  statement.addBatch("insert into mytab1 (id) values (1)");
  statement.executeBatch();
  connection.commit();
}

Не похоже на try-с-ресурсом.
дока Java SE API
Код: plaintext
1.
2.
java.sql
Interface Statement
All Superinterfaces: AutoCloseable, Wrapper
Поэтому напрашивается:
Код: java
1.
2.
3.
4.
5.
try ( Connection connection = hikariDataSource.getConnection() ) {
  try ( Statement statement = connection.createStatement() ) {
    // работаем работу
  }
}
...
Рейтинг: 0 / 0
Tomcat: предупреждение об утечке памяти
    #39843871
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот работающий вариант с одним try-с-ресурсом:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
        try (Connection connection = DriverManager.getConnection(connUrl);
                Statement statement = connection.createStatement()) {
            statement.addBatch("insert into mytab1 (id) values (1)");
            statement.executeBatch();
            connection.commit();
        } catch (SQLException ex) {
            Logger.getLogger(CTServletContextListener.class
                    .getName()).log(Level.SEVERE, null, ex);
        }


И в моём и в вашем вариантах всё равно появляется предупреждение.
Так что дело в другом...((((

Basil A. SidorovMolasarВсё закрыто, всё прибрано.
Код: java
1.
2.
3.
4.
5.
6.
try (Connection connection = hikariDataSource.getConnection();
  Statement statement = connection.createStatement()) {
  statement.addBatch("insert into mytab1 (id) values (1)");
  statement.executeBatch();
  connection.commit();
}

Не похоже на try-с-ресурсом.
дока Java SE API
Код: plaintext
1.
2.
java.sql
Interface Statement
All Superinterfaces: AutoCloseable, Wrapper
Поэтому напрашивается:
Код: java
1.
2.
3.
4.
5.
try ( Connection connection = hikariDataSource.getConnection() ) {
  try ( Statement statement = connection.createStatement() ) {
    // работаем работу
  }
}
...
Рейтинг: 0 / 0
Tomcat: предупреждение об утечке памяти
    #39844016
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarИ в моём и в вашем вариантах всё равно появляется предупреждение.Значит читайте доки Hikari и MariaDB.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Tomcat: предупреждение об утечке памяти
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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