Весенняя загрузка, JVM слишком много или просто параметров достаточно? - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь настроить производственные JVM для пружинных загрузочных микросервисов, и на данный момент я составил этот список

-XX:+UnlockExperimentalVMOptions 
-XX:+UseCGroupMemoryLimitForHeap 
-XX:MaxRAMFraction=2
-XX:+UseStringDeduplication 
-XX:+PrintStringDeduplicationStatistics 
-XX:+CrashOnOutOfMemoryError 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:+UseG1GC 
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps 
-Xloggc:/tmp/gc.log 
-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=5 
-XX:GCLogFileSize=2000k 
-XX:HeapDumpPath='/var/log/heap_dump.log' 
-XX:+UseGCOverheadLimit
-XX:NativeMemoryTracking=summary
-XX:+UnlockDiagnosticVMOptions 
-XX:+PrintNMTStatistics

Как вы думаете, если я заметил, что ни один из них не «дублирует» свою функциональность, но яЯ все еще не на 100% достаточно или, возможно, я мог бы добавить / удалить некоторые из них, не беспокоясь о потере информации.

Моя цель - получить как можно больше информации о том, что происходит в jvm, инастроить производительность памяти / gc, чтобы избежать шума.Приложение запущено в докере.

Некоторые детали: jdk 1.8 u152 spring-boot (s): 1.5.1

1 Ответ

0 голосов
/ 15 ноября 2018

В настоящее время я имею дело с ситуациями, когда приложение просто работает несколько секунд или даже минут и сразу же умирает без простого журнала и ошибки события в метриках Dropwizard

Процесс не должен простоумри, должно быть либо исключение, либо аварийный дамп.Если ваша машина перегружена, ваш процесс может быть убит в Linux для защиты системы.Если это произойдет, он должен войти в систему /var/log/messages

См. https://unix.stackexchange.com/questions/136291/will-linux-start-killing-my-processes-without-asking-me-if-memory-gets-short

Если ваша программа случайным образом вызывает System.exit(int), ваш SecurityManager должен предотвратить это или хотя бы зарегистрировать его.

Таким образом, цель состоит в том, чтобы оптимизировать память полностью зарегистрированного jvm.

К сожалению, многие из упомянутых вами журналов буферизуются, поэтому, если процесс будет остановлен, вы, вероятно, потеряетепоследние несколько записей, возможно последние несколько минут входа.Эти журналы полезны для диагностики проблем с производительностью, но могут не помочь определить, почему процесс неожиданно умирает.

настроить производительность памяти / gc, чтобы избежать oom

Это другой видпроблемы.Вам нужно попробовать

  • , чтобы дать процессу намного больше памяти, и посмотреть, в какой момент процесс не умирает.
  • , если это работает, вашему процессу требуется больше памяти, если вашпроцесс продолжает потреблять память, со временем у вас может быть утечка памяти.
  • , если вы продолжаете получать ошибки OutOfMemoryEr в аналогичных местах кода, это, скорее всего, место, где он потребляет слишком много памяти.
  • Скорее всего, у вас недостаточно памяти для задач, которые он выполняет.Затем я бы посмотрел на профиль памяти, используя профилировщик, такой как регистратор полетов, чтобы посмотреть, сможете ли вы уменьшить объем используемой памяти.В какой-то момент вы либо решаете проблему за счет сокращения использования, либо должны выделить процессу больше памяти.

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

...