Как предотвратить сборщик мусора, чтобы замедлить мое приложение - PullRequest
0 голосов
/ 16 декабря 2011

Допустим, у меня есть приложение с утечкой памяти.В какой-то момент GC будет очень стараться очистить память и замедлит мое приложение.Я знаю, что если вы установите этот параметр для JVM -XX: -UseGCOverheadLimit, он выдаст исключение OutOfMemoryException:

, если на сборку мусора будет затрачено более 98% общего времени и менее 2%из кучи восстанавливается.

Однако это как-то недостаточно хорошо для меня.Потому что мое приложение станет очень медленным еще до того, как эти цифры появятся.GC будет поглощать процессор в течение некоторого времени, прежде чем будет выдано исключение OutOfMemoryException.Моя цель состоит в том, чтобы как-то распознать очень рано, если возникнет наиболее вероятная проблема, а затем выбросить исключение OutOfMemory.После этого у меня есть какая-то стратегия восстановления.

Хорошо, теперь я нашел эти два дополнительных параметра GCTimeLimit и GCHeapFreeLimit.С их помощью можно настроить две указанные константы (98% и 2%).

Я провел несколько тестов самостоятельно, как небольшой фрагмент кода, который вызывает утечку памяти, и играл с этими настройками.,Но я не совсем уверен, как найти правильный компромисс.Я надеюсь, что у кого-то еще была такая же проблема, и он нашел разумное решение, или, может быть, есть какие-то другие коммутаторы GC, которых я пока не знаю.

Я чувствую себя немного растерянным, так как я не очень разбираюсь в этой теме, и кажется, что есть много вещей, которые можно рассмотреть.

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

Вы можете использовать java.lang.management.MemoryUsage для определения используемой памяти и общего объема доступной памяти.По мере приближения к настраиваемому порогу сбора GC вы можете выбросить свою ошибку.

Конечно, делать это немного нелепо.Если проблема в том, что вам нужно больше памяти, увеличьте размер кучи.Более вероятная проблема заключается в том, что вы не освобождаете память изящно, когда закончите.

0 голосов
/ 16 декабря 2011

Если вы используете JVM Sun / Oracle, эта страница кажется довольно полным учебником по настройке GC.

0 голосов
/ 16 декабря 2011

Шагните в сторону кучи JVM и используйте что-то вроде Большая память Терракоты , которая использует прямое управление памятью, чтобы вырваться за пределы досягаемости сборщика мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...