«Легкая» настройка jvm

задняя часть

Как человек, который мотивирован стать «Мастером покемонов», как вы можете даже не понимать JVM, иначе вы можете быть как Чжие, и вы не сможете выиграть чемпионат в своей жизни.
Основой для запуска java на нескольких платформах является виртуальная машина java.Мы не будем здесь говорить о ее области памяти.В конце концов, есть разница между областью методов jdk7 и метапространством jdk8.

JVM-параметры

//常见参数
-Xms1024m 初始堆大小 
-Xmx1024m 最大堆大小  一般将xms和xmx设置为相同大小,防止堆扩展,影响性能。
-XX:NewSize=n:设置年轻代大小 
-XX:NewRatio=n:设置年轻代和年老代的比值.如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4 
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值.注意Survivor区有两个.如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5 
-XX:MaxPermSize=n:设置持久代大小
-XX:+HeapDumpOnOutOfMemoryError OOM时自动保存堆文件,可以用visualvm分析堆文件

//收集器设置 
-XX:+UseSerialGC:设置串行收集器 
-XX:+UseParallelGC:设置并行收集器 
-XX:+UseParalledlOldGC:设置并行年老代收集器 
-XX:+UseConcMarkSweepGC:设置并发收集器

//垃圾回收统计信息 
-XX:+PrintGC 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps 
-Xloggc:filename

//并行收集器设置 
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数.并行收集//线程数. 
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间 
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比.公式为1/(1+n)
//并发收集器设置 
-XX:+CMSIncrementalMode:设置为增量模式.适用于单CPU情况. 
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数.并行收集线程数.

Применение

Использование идеи
  1. открытая идея
  2. Нажмите в правом верхнем углуedit configurations
  3. Введите параметры в vm options

Использование Springboot

Поскольку автор использует Springboot, вот демонстрация в виде Springboot, добавляющего параметры при запуске jar-пакета проекта.

java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC newframe-1.0.0.jar

использование инструмента

Visual VM

Visual VM написан на языке java и интегрирован с помощью jdk. Он помогает нам анализировать использование памяти, обнаруживая информацию о классах и объектах, загруженных в JVM. Это мощный инструмент для анализа и настройки проектов Java.

概述: показывает параметры jvm проекта.
При чем тут запрет? Я считаю, что зрители в зале прямого эфира должны быть мудрыми!
监视: {} Временно пропустить n слов.
线程: {} Временно пропустить n слов.
抽样器: {} Временно пропустить n слов.

jstat

1. Просмотр PID процесса проекта
  1. Автор использует докер для развертывания проекта Springboot, поэтому нужно толькоtopилиjpsВы можете напрямую просматривать Pid.
  2. lsof -i:端口号, при условии, что он у вас установлен.
  3. ps -ef | grep 项目名
2. Используйте команду для просмотра результатов
jstat -gcutil 5 1000

Фактический анализ

  1. Через Visual VM установлено, что в основном каждые 8 ​​минут в jvm будет происходить GC, а сам я проект не посещал, и объем доступа проекта должен быть равен 0, поэтому при отсутствии задач по времени или бесконечности циклы, количество сгенерированных объектов должно быть равно 0. Теоретически GC не происходит.
  2. Так где же происходит GC? Молодой или старый?
    Потому что здесьNewRatioЭто 1, поэтому, будь то старое поколение или новое поколение, GC обычно составляет около 200 м, и нам трудно различить, какое это поколение. На самом деле, преждеNewRatio=2,xmx450m, случай, когда происходит GC, составляет 150 м. Следовательно, РЖ возникает в новом поколении.
  3. Если не верите, вот скриншот jstat, видно, что постоянно генерируются объекты нового поколения.

4. Зная, что GC возник в новом поколении, в основном доказана вышеизложенная гипотеза: существует бесконечный цикл. Абстрактный анализатор обнаружил, что объект char очень большой.

5. Далее вы можете узнать, какие строки кода имеют проблемы с помощью дампа кучи. можно использоватьjhatС помощью этого инструмента файл может быть сгенерирован Visual VM, и, конечно же, в случае OOM он также может быть сгенерирован по параметрам.

jhat -J-Xmx1024M file

Вы должны быть в состоянии найти его, проанализировав дамп кучи.Мы не будем анализировать его здесь.На самом деле более хлопотно перезапустить проект,промапить несколько портов,а затем дождаться сборщика мусора. Чтобы быть ближе к реальности, этот проект является реальным проектом и был развернут в облаке Alibaba.Ссылка здесь, поразите меня сильно, код взят с github.

Эпилог

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