Допустим, у меня есть приложение с утечкой памяти.В какой-то момент GC будет очень стараться очистить память и замедлит мое приложение.Я знаю, что если вы установите этот параметр для JVM -XX: -UseGCOverheadLimit, он выдаст исключение OutOfMemoryException:
, если на сборку мусора будет затрачено более 98% общего времени и менее 2%из кучи восстанавливается.
Однако это как-то недостаточно хорошо для меня.Потому что мое приложение станет очень медленным еще до того, как эти цифры появятся.GC будет поглощать процессор в течение некоторого времени, прежде чем будет выдано исключение OutOfMemoryException.Моя цель состоит в том, чтобы как-то распознать очень рано, если возникнет наиболее вероятная проблема, а затем выбросить исключение OutOfMemory.После этого у меня есть какая-то стратегия восстановления.
Хорошо, теперь я нашел эти два дополнительных параметра GCTimeLimit и GCHeapFreeLimit.С их помощью можно настроить две указанные константы (98% и 2%).
Я провел несколько тестов самостоятельно, как небольшой фрагмент кода, который вызывает утечку памяти, и играл с этими настройками.,Но я не совсем уверен, как найти правильный компромисс.Я надеюсь, что у кого-то еще была такая же проблема, и он нашел разумное решение, или, может быть, есть какие-то другие коммутаторы GC, которых я пока не знаю.
Я чувствую себя немного растерянным, так как я не очень разбираюсь в этой теме, и кажется, что есть много вещей, которые можно рассмотреть.