Обзор онлайн-проблем: оптимизация нижнего уровня JVM | Уик-энда

задняя часть
Обзор онлайн-проблем: оптимизация нижнего уровня JVM | Уик-энда

Эта статья участвовала в учебном плане выходного дня, щелкните ссылку, чтобы просмотреть подробности:Наггетс.Талант/пост/696572…

Во-первых, этопечальная история, который включает в себя знания о базовой оптимизации JVM. Думая о замешательстве, когда я впервые столкнулся с проблемой такого рода, я ответил на старую поговорку:Когда книга израсходована, я ненавижу ее меньше!

Ответственный центр новостей находится воколо восьми часов вечераГруппа эксплуатации и обслуживания сообщила, что большое количество пользователей не может получать SMS-сообщения. Войдите в Kibana, чтобы найти соответствующий журнал ошибок и обнаружить ошибку.Большое количество исключений нижнего индекса за пределами границ

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

Потому что на ELKАнализ логов неудобен, трудно выполнить статистический анализ на разных широтах в соответствии с соответствующей аномалией, поэтому свяжитесь с одноклассниками по эксплуатации и техническому обслуживанию, чтобы сообщить о неисправности в день ее возникновения.Информация, журнал ошибокПотяните вниз для автономного анализа

После анализа журнала известно, что существует два типа аномальных выходных данных.Один с информацией о стеке,Например:

java.lang.ArrayIndexOutOfBoundsException: -1
... 省略堆栈信息

Другой более странный.Только исключения, без соответствующей информации о стеке

java.lang.ArrayIndexOutOfBoundsException: null

Первый вопрос лучше позиционирован, согласноинформация о стеке исключений, найдите конкретный код и непосредственно восстановите его, сложность заключается во втором

На самом деле, эти два являются исключением, вы поймете, когда посмотрите на это позже. Все, что делается позже, - это выяснить две вещи

  • Почему ненормальное сообщение выводится NULL
  • Почему информация о стеке не выводится на печать

JVM Fast Throw

Что такое быстрый бросок?

Говоря простым языком, это так: когда некоторые типы исключений (нулевой указатель, нижний индекс за пределами границ, арифметические операции и т. д.) выбрасываются несколько раз в фиксированной позиции кода, виртуальная машина (HotSpot VM) будет напрямуюВыдает предварительно выделенный объект исключения соответствующего типа. этого объекта исключенияИ сообщение, и трассировка стека пусты

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

The compiler in the server VM now provides correct stack backtraces for all "cold" built-in exceptions. For performance purposes, when such an exception is thrown a few times, the method may be recompiled. After recompilation, the compiler may choose a faster tactic using preallocated exceptions that do not provide a stack trace. To disable completely the use of preallocated exceptions, use this new flag: -XX:-OmitStackTraceInFastThrow.

Эта ситуация описана во введении к документации по выпуску JDK 1.5, и причина такой оптимизации в том, чтоДля повышения производительности. Когда одно и то же исключение генерируется несколько раз в одном и том же месте,Компилятор перекомпилирует метод. После перекомпиляции компилятор можетИспользование предварительно выделенных исключений, которые не обеспечивают трассировку стекавыбрать более быструю стратегию

Если вы хотите отключить этот механизм предварительного выделения исключений, вы можете использовать-XX:-OmitStackTraceInFastThrow. Заинтересованные читатели могут ознакомиться с примечаниями к выпуску:https://sourl.cn/PMzVkC

Кроме того, из исходного кода JVM мы знаем, что механизм Fast Throw в настоящее время поддерживает пять исключений.

Имитация быстрого броска

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

List<String> list = new ArrayList();
for (int j = 0; j < 10000; j++) {
    try {
        list.get(-1);
    } catch (Exception ex) {
        int length = ex.getStackTrace().length;
        System.out.println(String.format("报错异常 :: %s, 堆栈长度 :: %s", ex, length));
    }
}

Вышеупомянутая программа работает в среде Java 8. Из результатов работы программы видно, что Fast Throw все еще действует в Java 8.

Если нет особых обстоятельств, то лучше не отключать эту функцию. Потому что, если есть большое количество параллельных интерфейсов, большое количество запросов будет вызывать исключения в одном и том же коде из-за программных ошибок.Механизм Fast Throw может значительно снизить потери производительности.. Благодаря однопоточному рабочему тестовому демо мы знаем, что чем больше совершается ненормальных вызовов, тем больше разница в производительности.

Открыть быстрый бросок Закрыть быстрый бросок
10w 1004ms 3547ms
100 w 6193ms 30928ms
500w 37492ms ...

Если онлайн-среда запускает механизм Fast Throw, вы можете пройтиОтследить журналы того же местоположения и того же исключениячтобы найти причину проблемы

Заключение

Тысяча слов, объединенных в одно предложение,Рефакторинг рискован, и вам нужно быть осторожным при выходе в интернет.

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

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

Значение, вызванное возникновением ошибок, хорошо или плохо.Накопленный опыт устранения неполадок в Интернете, В этом случае девушки в компании снова столкнутся с той же проблемой и закричат:Девушка, отпустите эту ошибку и позвольте мне кончить!

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


Рекомендуем👍: Пятиминутная грамотность: история эволюции источника данных | Обучение на выходных

Рекомендуем👍: Интервью на фабрике: Как изящно использовать механизм SPI | Исследование выходного дня