Как отключить GC или получить время паузы GC между выполнением некоторого кода? - PullRequest
0 голосов
/ 20 декабря 2018

Ранее я читал статью о том, что FGC повлиял на синхронизацию и заставил приложение давать неправильный результат.
Пример кода выглядит так:

long start = System.currentTimeInMillis();
doSomething();
// what if here comes a long time FGC pause
long end = System.currentTimeInMillis();
if (end - start > TIME_OUT) {
    xxxx
}

, если GC происходит между присвоением start и end,время будет больше действительного значения и повлияет на результат.

Есть несколько способов исправить.
Один из способов - отключить GC между ними, я знаю, что сейчас невозможно отключить GC. Я хочу знать, есть ли способ удалить safepoint междунекоторый код (или рефакторинг кода для его достижения?).

Другой способ - получить время паузы в GC, кажется (возможно) не сложнее, чем в первом случае.

Вернемся к вопросу:
Если у меня есть логика, чувствительная ко времени, как я могу избежать влияния GC на нее?

1 Ответ

0 голосов
/ 20 декабря 2018

Вы можете сделать несколько вещей здесь (в порядке возрастания сложности, и вы можете комбинировать некоторые из них):

  1. Запускайте свои тесты с такой большой кучей, какой сможете собрать (это будет работать, только есливы можете избежать любого GC, как только вы нажмете GC, это будет длинная пауза).
  2. Используйте лучшее время, чем настенные часы.См. Жгут проводов Java Microbenchmark
  3. . Используйте много прогонов, чтобы усреднить влияние любого ГХ, удалив верхние выбросы.Здесь помогает JMH из вышеприведенного пункта.
  4. Спросите у своей JVM, сколько времени он провел GC, используя MX Beans .YMMV в зависимости от JVM.
  5. Записать все паузы GC в журнал GC и использовать их в расчете
  6. Измените код, чтобы не делать выделения в критической секции (см. this или эта статья с некоторыми советами)
  7. JVM Azul Systems под названием ZING имеет GC без паузы.Это будет стоить денег.

Надеюсь, что это поможет и Счастливого Рождества !

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