Весенние запросы на загрузку зависают при получении OutOfMemoryError в потоках веб-сервера - PullRequest
0 голосов
/ 01 марта 2020

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

Однако вместо сбоя запросов я получаю бесконечное зависание и только следующую ошибку в консоли:

*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message can't create name string at JPLISAgent.c line: 826

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "http-nio-8090-ClientPoller"

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Catalina-utility-2"

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Catalina-utility-1"

Почему запросы зависают и не перестают работать? Является ли единственное решение (кроме того, что сначала не хватает памяти) - убить службу? (Он работает в контейнере, поэтому он будет перезапущен)

Мой код для отключения службы:

static class GlobalThreadExceptionHandler implements UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread thread, Throwable throwable) {
        logger.error(String.format("Caught unhandled exception in thread %s", thread), throwable);
        Runtime.getRuntime().halt(137);
    }
}

public static void main(String[] args) {
  Thread.setDefaultUncaughtExceptionHandler(new GlobalThreadExceptionHandler());
  ...
}

(System.exit() также зависал)

I использую Java 11 с версией Spring Boot 2.1.6

1 Ответ

1 голос
/ 01 марта 2020

Это время паузы или задержки приложения, когда Java сборщик мусора пытается освободить память. Но, похоже, сборщик мусора также не может работать, так как память заполнена. Итак, приложение зависло.

Существует множество новых сборщиков мусора, таких как zg c, shenandoah, которые могут работать параллельно с приложениями для непрерывного освобождения памяти, но я не знаю, здесь они применимы или нет.

Если вы используете docker контейнеры, вы можете проверить 'docker stats', чтобы проверить, когда ваше содержимое использует и освобождает память. И если в вашей системе достаточно памяти, вы можете соответственно увеличить / установить размерную переменную MAX_HEAP вашего контейнера. Также вы можете перемещать / масштабировать другие объекты соответственно, чтобы этот контейнер получал больше ресурсов.

...