JVM命令行监控工具

news/2024/7/5 5:22:11

1 jps

功能描述:jps 全称 JVM Process Status Tool,命令位于 jdk 的 bin 目录下,其作用是显示当前系统的 Java 进程情况,及其 pid 号。他是 Java自带的一个命令。

code:

public class Simple {

    public static void main(String[] args) {

        while (true){


        }
    }

}

在这里插入图片描述
-q:仅仅显示 LVMID (local virtual machine id),即本地虚拟机唯一id。不显示主类的名称等。
在这里插入图片描述
-l:输出应用程序主类的全类名或如果进程执行的是jar包,则输出jar完整路径
在这里插入图片描述
-m:输出虚拟机进程启动时传递给主类main()的参教
在这里插入图片描述
-v: 列出jvm参数, -Xms20m -Xmx50m是启动程序指定的jvm参数。

设置启动参数:-Xms100m -Xms100m
在这里插入图片描述
以上参数可以综合使用:
在这里插入图片描述

2 jstat

jstat(Java Virtual Machine statistics monitoring tool)它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。

它的基本使用语法为:

#jstat 
#-t: 在输出信息前加上一个Timestamp列,显示程序的运行时间。单位:秒。
#-h: 可以在周明性数据輸出时,输出多少行数据后輸出一个表头信息
#vmid: java进程ID
#-interval: 用于指定输出统计数据的周期,单位为毫秒,:查识间隔
#-count:用于指定查询的总次数
jstat -<option> [-t] [-h<lines>] <vmid> [<interval>[<count>]]

选项 option可以由以下值构成:

类装载相关的:

-class:显示ClassLoader的相关信息:类的装载、卸载数量、总空间类装载所消耗的时间等

垃圾回收相关的:

-gc:显示与GC相关的堆信息。包括Eden区、两个 Survivor区、老年代永久代等的容量、早用空间、GC时间合计等信息。

-capacity:显示内容与-gc基本相同,但输出主要关注]ava堆各个区域使用到的最大、最小空间。

-gcutil:显示内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。

-gccause:与-gcutil功能一样,但是会额外输出导致最后一次或当前正在发生的GC产生的原因 。

-gcnew:显示新生代GC状况。

-gcnewcapacity:显示内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间。

-gold:显示老年代GC状况

2.1 code

public class Simple {


    /**
     * VM options: -Xms100m -Xms100m
     */
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        String info = scanner.next();
    }


}

2.2 类装载

显示ClassLoader的相关信息:类的装载、卸载数量、总空间类装载所消耗的时间等
在这里插入图片描述
1秒打印一次,打印5次:

#-interval: 用于指定输出统计数据的周期,单位为毫秒,:查识间隔
#-count:用于指定查询的总次数
#-t: 在输出信息前加上一个Timestamp列,显示程序的运行时间。单位:秒。
#-h: 可以在周明性数据輸出时,输出多少行数据后輸出一个表头信
jstat -class -t -h2 6928 1000 10

在这里插入图片描述

2.2 垃圾回收

#-gc:显示与GC相关的堆信息。包括Eden区、两个 Survivor区、老年代永久代等的容量、早用空间、GC时间合计等信息。
jstat -gc 6928

s0总容量、S1总容量、S0使用容量、S1使用容量、Eden总容量、Eden使用容量、Old总容量、Old使用容量、方法区总容量、方法区使用容量、压缩类总容量、压缩类使用容量、YongGC次数、YongGC花费时间、FullGC次数、FullGC花费时间、GC总花费时间
在这里插入图片描述
code


public class GCTest {

    /**
     * VM options:-Xms60m -Xmx60m
     */
    public static void main(String[] args) {

        List<Object> list = new ArrayList<>();
        for (int i = 1; i <= 1000; i++) {
            //100KB
            byte[] arr = new byte[1024 * 100];
            list.add(arr);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

}

在这里插入图片描述

#-gcutil查看OOM
jstat -gcutil 12464 1000 30

在这里插入图片描述

在这里插入图片描述

3 jmap

jmap (JVM Memory Map):作用一方面是获取dump文件(堆转储快照文件、二进制文件)它还可以获取目标Java进程的内存相关信息,包括]ava堆各区域的使用情况、堆中对象的统计信息.、类加载信息等。

它的基本使用语法为:

jmap [option] <pid>
jmap [option] <executable <core>>
jmap [option] [server_id@]<remote server IP or hostname>

其中option包括:
在这里插入图片描述

导出内存映射文件:

一般来说,使用jmap指令生成dump文件的操作算得上是最常用的jmap命令之一,将堆中所有存活对象导出至一个文件之中。

说明
(1)通常在写 Heap Dump 文件前会触发一次Full GC,所以 heap dump文件里保存的都是FullGC后留下的对象信息。
(2)由于生成dump文件比较耗时,因此大家需要耐心等待,尤其是大内存镜像生成dump文件则需要耗费更长的时间来完成。

3.1 手动的方式

jmap -dump:format=b,file=<filename,hprof> <pid>
#live 只保存堆中存活的对象
jmap -dump:live,format=b,file=<filename,hprof> <pid> 

code

/**
     * VM options:-Xms60m -Xmx60m
     */
    public static void main(String[] args) {
        List<Object> list = new ArrayList<>();
        for (int i = 1; i <= 1000; i++) {
            //100KB
            byte[] arr = new byte[1024 * 100];
            list.add(arr);
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

#命令
jmap -dump:format=b,file=d:\temp.hprof 17788
jmap -dump:live,format=b,file=d:\temp_live.hprof 17788

在这里插入图片描述
在这里插入图片描述

3.2 自动方式

当程序发生OOM退出系统时,一些瞬时信息都随着程序的终止而消失,而重现OOM问题往往比较困难或者耗时。此时若能在OOM时,自动导出dump文件就显得非常迫切。

获取快照文件的方法:

-XX:+HeapDumpOnOutOfMemoryError:在程序发生OOM时,导出应用程序的当前堆快照。
-XX:HeapDumpPath:可以指定堆快照的保存位置。

例如:

-Xms60m -Xmx60m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\temp_oom.hprof

修改VM参数:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/4556667.html

相关文章

C++语言程序是最好的吗

关键是看它的算法功能 一个程序 没有最好的 用什么语言只是其次

我只有初中的文化 我能自学c语言吗

不过C语言要求比较深的基础知识 一定能学好的 建议你先学Java或者Python 完全可以 C语言就像少林功夫 用来作为第一门语言不太合适 答案补充 在学习C语言之前 学的人很多 是硬功 等到有一定功力的时候再回过头来学C 需要十多年的修炼才能把C语言搞好 在这些基础还不具备之前 但…

Spring源码本地调试环境搭建

1 Gradle 环境 2 下载源码 git clone --branch v5.2.8.RELEASE https://gitee.com/Z201/spring-framework.git3 修改文件 3.1 settings.gradle pluginManagement {repositories {gradlePluginPortal()maven { url https://maven.aliyun.com/repository/public }maven { url h…

Mybatis-SQL语句构建器类及日志

SQL语句构建器类 问题 Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL语句。这么来做通常是由于SQL语句需要动态来生成-否则可以将它们放到外部文件或者存储过程中。正如你已经看到的那样&#xff0c;MyBatis在它的XML映射特性中有一个强大的动态SQL生成方案。但有时…

求一个4*4矩阵两对角线元素之和 设计一个程序

||| 提示你一下 但是只应该加一次 中间行的对角线元素重叠 由于当n是奇数的时候 每行上对角线元素的序号相加是n1 对角线的元素在每行上的分布是规律的 共n行 不过思想是从行出发 矩阵由数组array[n][n]表示for(int i0;i<n;i){ if(i (n-1)/2) sum(array[i][i]array[i][n-i-1…

C语言中的for语句

第二个没有打印出来. i); }如你上面写的程序 i);printf ("%d" for (i0;i<100;i){printf ("%d" 如果想要执行两次 i); 答案补充 第一个 ||| for 循环里要循环的语句如果不只一句要用大插号{}括起来.如上 只循环printf("%d"

Spring 中 Xml 属性配置的解析过程

1 工程概述 1.1 pom文件 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><spring.v…

我不太清楚 请高手指导一下 是先学c语言再学c++好还是先学c++再学c语言好

||| C语言 ||| 我觉得还是学习完C言再学C好C言是编程的最基础啊 但是我个人不这样认为 所以建议先学c&#xff1b;但是也有人说学c最后不要学c 比较抽象 但是c是面向对象的 更接近一半人的思维模式 而且是面向过程的 先c后c&#xff1b;这是我的经验c比较基础 一面混淆