Обзор инструментов профилирования JVM

Java задняя часть JVM VisualVM

JPS

статус процесса java Посмотреть процесс

jps
C:\Users\84407>jps
13680 Jps
14704 JConsole
10148 Launcher
8788
10844 ThreadConsole
jps -q

Отображать только логотип ВМ, а не банку, класс, основные параметры и другую информацию

C:\Users\84407>jps -q
18324
15336
19144
19816
jps -m

Выведите параметры, переданные основной функцией

C:\Users\84407>jps -m
15336 ThreadConsole
19144
19816 Launcher C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/annotations.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/httpclient-4.5.2.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/slf4j-api-1.7.10.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/log4j.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/snappy-in-java-0.5.1.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/util.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/jna.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/idea_rt.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/jps-model.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/jna-platform.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/oro-2.0.8.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/aether-dependency-resolver.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/httpcore-4.4.5.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/netty-all-4.1.13.Final.jar;C:/Program Files/
19148 Jps -m

PID IntelliJ IDEA: 19816, параметры - это груды позади

jps -l

Полное имя пакета основного класса приложения вывода или полное имя jar

C:\Users\84407>jps -l
15336 com.jvm.jconsole.ThreadConsole
19144
19816 org.jetbrains.jps.cmdline.Launcher
9704 jdk.jcmd/sun.tools.jps.Jps
jps -v

список параметров JVM

15336 ThreadConsole -javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\lib\idea_rt.jar=61866:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\bin -Dfile.encoding=UTF-8
19144  -Xms128m -Xmx750m -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Dide.no.platform.update=true -Djb.vmOptionsFile=C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\bin\idea64.exe.vmoptions -Didea.jre.check=true -Dide.native.launcher=true -Didea.paths.selector=IntelliJIdea2018.1 -XX:ErrorFile=C:\Users\84407\java_error_in_idea_%p.log -XX:HeapDumpPath=C:\Users\84407\java_error_in_idea.hprof
19816 Launcher -Xmx700m -Djava.awt.headless=true -Djava.endorsed.dirs="" -Djdt.compiler.useSingleThread=true -Dpreload.project.path=D:/workspace/java-nio-and-netty-spring-demo -Dpreload.config.path=C:/Users/84407/.IntelliJIdea2018.1/config/options -Dcompile.parallel=false -Drebuild.on.dependency.change=true -Djava.net.preferIPv4Stack=true -Dio.netty.initialSeedUniquifier=-6623792082140627021 -Dfile.encoding=GBK -Duser.language=zh -Duser.country=CN -Didea.paths.selector=IntelliJIdea2018.1 -Didea.home.path=C:\Program Files\JetBrains\IntelliJ IDEA 2018.1 -Didea.config.path=C:\Users\84407\.IntelliJIdea2018.1\config -Didea.plugins.path=C:\Users\84407\.IntelliJIdea2018.1\config\plugins -Djps.log.dir=C:/Users/84407/.IntelliJIdea2018.1/system/log/build-log -Djps.fallback.jdk.home=C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/jre64 -Djps.fallback.jdk.version=1.8.0_152-release -Dio.netty.noUnsafe=true -Djava.io.tmpdir=C:/Users/84407/.IntelliJIdea2018.1/system/compile-server/java-nio-and-netty-spring-demo_64d579b4/_temp_ -Djps.backw
15052 Jps -Denv.class.path=.;C:\Program Files\Java\jdk-10\lib;C:\Program Files\Java\jre-10\lib; -Dapplication.home=C:\Program Files\Java\jdk-10 -Xms8m -Djdk.module.main=jdk.jcmd

Подробную информацию см. по адресу: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html.

Jstat

Загрузка классов, память, сборка мусора, информация о jit-компиляции

M: Указывает на метапространство, которого больше нет в виртуальной машине, но которое использует локальную память.

Jinfo

Просмотр и настройка различных параметров виртуальных машин в режиме реального времени

jinfo -flags

Просмотр параметров jvm

C:\Users\84407>jinfo -flags 15336
VM Flags:
-XX:CICompilerCount=3 -XX:InitialHeapSize=201326592 -XX:MaxHeapSize=3196059648 -XX:MaxNewSize=1065353216 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=67108864 -XX:OldSize=134217728 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
jinfo -sysprops

Просмотр параметров системы Java

...
user.name=84407
java.vm.specification.version=1.8
sun.java.command=com.jvm.jconsole.ThreadConsole
java.home=C\:\\Program Files\\Java\\jdk1.8.0_144\\jre
sun.arch.data.model=64
user.language=zh
java.specification.vendor=Oracle Corporation
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.8.0_144
java.ext.dirs=C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\ext;C\:\\WINDOWS\\Sun\\Java\\lib\\ext
sun.boot.class.path=C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\resources.jar;C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\rt.jar;C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\sunrsasign.jar;C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\jsse.jar;C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\jce.jar;C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\charsets.jar;C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\jfr.jar;C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\classes
java.vendor=Oracle Corporation
file.separator=\\
java.vendor.url.bug=http\://bugreport.sun.com/bugreport/
sun.io.unicode.encoding=UnicodeLittle
sun.cpu.endian=little
sun.desktop=windows
sun.cpu.isalist=amd64
...
jinfo -flag -PrintGC

Указывает, что печать журнала GC отключена, обратите внимание на знак минус

jinfo -flag +PrintGC

Указывает, что печать журнала GC включена, обратите внимание на знак «плюс».

jinfo -flag PrintGC

Проверьте, включена ли печать журнала GC, обратите внимание, что нет знака плюс или минус

Для получения дополнительной информации см.: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jinfo.html#BCGEBFDD


Jmap

Распечатайте объекты в куче JVM, запросите сведения о куче Java и постоянной генерации, использовании, размере использования.

jmap -finalizerinfo

Распечатать информацию об объектах, ожидающих восстановления.

jmap -heap

Распечатайте сводную информацию о куче, алгоритме, используемом сборщиком мусора, конфигурации кучи и использовании мудрой кучи.

jmap -clstats

Вывести информацию о загрузке классов. Содержит имя, живучесть, адрес, родительский загрузчик классов и количество загруженных классов каждого загрузчика классов.

jmap -histo[:live]

распечатать гистограмму кучи

jmap -clstats

Вывести информацию о загрузке классов. Содержит имя, живучесть, адрес, родительский загрузчик классов и количество загруженных классов каждого загрузчика классов.

jmap -dump:format=b,file=d:\a.bin pid

Сгенерируйте информацию о куче и сохраните ее в файле d:\a.bin

jmap -histo pid | more

Просмотр количества и сведений о классах и экземплярах:

Jhat (обычно не используется, большое использование памяти)

инструмент анализа кучи jvm инструмент анализа кучи jvm

jhat d:\a.bin

Проанализируйте файл информации о куче, а затем откройте порт 7000 по умолчанию и отобразите его в виде веб-страницы.

oql

язык объектных запросов

Jstack

распечатать информацию о стеке потока

jstack

Просмотр информации о стеке потоков в процессе Java

jstack -l

Когда возникает взаимоблокировка, вы можете использовать jstack -l pid для наблюдения за состоянием удержания блокировки.

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x00000000033b9000 nid=0x268c in Object.wait() [0x000000001b7be000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x0000000780808ec8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
        - locked <0x0000000780808ec8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

   Locked ownable synchronizers:
        - None
jstack -m

Выводит не только информацию о стеке Java, но и информацию о стеке C/C++ (например, собственные методы).

Jconsole

мониторинг памяти

мониторинг потоков

Используйте следующий код для проверки:

public class ThreadConsole {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        scanner.next();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    //空转
                }
            }
        },"while thread").start();
        scanner.next();
        new Thread(new Runnable() {
            @Override
            public void run() {
                Object object = new Object();
                synchronized (object){
                    try {
                        object.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

第一次输入前

第一次输入后&第二次输入前

第二次输入后

Проверить на взаимоблокировку
/**
 * 模拟死锁并用jconsole进行检测
 *
 * Created by Fant.J.
 */
public class DeadLock {
    public static void main(String[] args) {
        Object o1 = new Object();
        Object o2 = new Object();
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (o1){
                    try {
                        System.out.println("获取到o1的锁");
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (o2){
                        System.out.println("获取到o2的锁");
                    }
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (o2){
                    try {
                        System.out.println("获取到o2的锁");
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (o1){
                        System.out.println("获取到o1的锁");
                    }
                }
            }
        }).start();
    }
}

线程1

线程0

死锁检查

死锁查看

visualVm

Адрес загрузки: https://visualvm.github.io/download.html Используйте его, чтобы понять с первого взгляда, без демонстрации