首页 > 编程语言 >Java | 一分钟掌握JDK命令行工具 | 3 - 实战

Java | 一分钟掌握JDK命令行工具 | 3 - 实战

时间:2023-04-15 21:32:50浏览次数:54  
标签:lang java JDK prio 31 Thread nid 命令行 Java

 作者:Mars酱

 声明:本文章由Mars酱编写,部分内容来源于网络,如有疑问请联系本人。

 转载:欢迎转载,转载前先请联系我!

前言

前一篇 Java | 一分钟掌握JDK命令行工具 | 2- 分类 - 掘金 (juejin.cn) 罗列了一些JDK命令行工具,我们没有必要把所有命令行工具全部介绍,那样对于开发者来说不实用也没有任何价值,所有功能介绍,这件事情由且只能由JDK的发行方自己做。来,我们上实战的车~

实战

基本操作

既然知道了概念,我们做个基本操作。首先我们罗列出系统中有哪些正在运行的java进程:

jps

如果你的jps命令不可以用,有两种解决方案,一种是检查你的环境变量配置,比如:pathclasspath这些是不是已经配置好;另一种是cd到你jdk的安装目录,进入bin文件夹,再执行jps。

以下是我的bin文件夹下的内容:

Java | 一分钟掌握JDK命令行工具 | 3 - 实战_命令行

jps命令敲入之后,会看到列出了系统中运行的java进程:

Java | 一分钟掌握JDK命令行工具 | 3 - 实战_java_02

如果想查看完整的进程信息,可以使用jps -l,得到的结果会类似这样:

Java | 一分钟掌握JDK命令行工具 | 3 - 实战_java_03

其中4952这个进程pid,是由jdk.jcmd/sun.tools.jps.Jps这个主类执行的。pid=58321和pid=58266这两个进程是怎么回事呢?我们使用jinfo命令查看一下:

jinfo #java进程id#

我查看了58266这个进程,得到的信息类似这样:

Java | 一分钟掌握JDK命令行工具 | 3 - 实战_命令行_04

逐行查看,原来是我的idea开发工具,里面罗列了很多idea这个进程的配置信息,图没截完,信息比较长还很粗。

反编译自己的代码

那么我们来写一段无限循环代码,然后对这段代码进行反编译、运行的监控和分析吧,我们拿 1 - 基础 中爷爷跟我说‘Hello World’的例子改造一下:

/**
 * @author mars酱
 */
public class GranfatherTalkToMe {
    public static void main(String[] args) throws InterruptedException {
        while (true) {
            System.out.println("Hello World");
            Thread.sleep(5000);
        }
    }
}

爷爷跟我说‘Hello World’,然后打盹5秒,如此反复。先确保它能正确的运行:

Java | 一分钟掌握JDK命令行工具 | 3 - 实战_java_05

ok,可以正常运行,那么我们不停止程序,在系统命令行使用jps -l来查看一下:

Java | 一分钟掌握JDK命令行工具 | 3 - 实战_命令行_06

最后一行那个6172进程就是我们编写的java代码,我们反编译一下它,使用javap

javap #class文件名#

这样,就会在命令行看到:

Java | 一分钟掌握JDK命令行工具 | 3 - 实战_命令行_07

好了,反编译也可用。

给进程拍照

我们把GranfatherTalkToMe运行起来,然后通过jmap命令来生成快照,保存在桌面,使用命令:

jmap -dump:format=b,file=#保存路径##想要保存的文件名#.hprof #java进程id#

会得到类似的信息:

Java | 一分钟掌握JDK命令行工具 | 3 - 实战_java_08

Heap dump file created

这行提示信息表示快照文件已经生成。

分析进程内容

jhat可以用来通过网页查看和分析 heapdump 文件,它会在本地建立一个 HTTP/HTML 服务,我们可以打开浏览器查看分析结果:

~ /Desktop >jhat gttm.hprof
Reading from gttm.hprof...
Dump file created Sat Apr 08 14:13:42 CST 2023
Snapshot read, resolving...
Resolving 11269 objects...
Chasing references, expect 2 dots..
Eliminating duplicate references..
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

Server is ready

这个提示标示服务运行成功,我们打开浏览器,输入http://localhost:7000/就可以看到结果。如果你的7000端口被占用,自行腾出来吧。

网页效果类似如下:

Java | 一分钟掌握JDK命令行工具 | 3 - 实战_java_09

给当前任务一个快照

一些时候,我们程序可能耗费很高cpu或者内存,那我们就需要分析一下这个任务的情况了,可以使用jstack给当前时刻进行快照。

执行命令:

jstack #java进程id#

得到类似结果(部分):

~/Desktop > jstack 9598
2023-04-08 14:40:34
Full thread dump OpenJDK 64-Bit Server VM (25.312-b07 mixed mode):

"Attach Listener" #13 daemon prio=9 os_prio=31 tid=0x00007f9120821800 nid=0x5107 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Service Thread" #12 daemon prio=9 os_prio=31 tid=0x00007f911f016800 nid=0x7c03 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread3" #11 daemon prio=9 os_prio=31 tid=0x00007f90d8808800 nid=0x5a03 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread2" #10 daemon prio=9 os_prio=31 tid=0x00007f90d800a000 nid=0x7e03 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" #9 daemon prio=9 os_prio=31 tid=0x00007f90d8009000 nid=0x5803 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #8 daemon prio=9 os_prio=31 tid=0x00007f911f810000 nid=0x5603 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"JDWP Command Reader" #7 daemon prio=10 os_prio=31 tid=0x00007f9121042000 nid=0x5503 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"JDWP Event Helper Thread" #6 daemon prio=10 os_prio=31 tid=0x00007f90ff022000 nid=0x4903 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"JDWP Transport Listener: dt_socket" #5 daemon prio=10 os_prio=31 tid=0x00007f90ff021000 nid=0x4703 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" #4 daemon prio=9 os_prio=31 tid=0x00007f911f80e000 nid=0x4c03 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" #3 daemon prio=8 os_prio=31 tid=0x00007f911f80c800 nid=0x4103 in Object.wait() [0x00007000035e4000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x0000000715588ee0> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
	- locked <0x0000000715588ee0> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
	at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)

"Reference Handler" #2 daemon prio=10 os_prio=31 tid=0x00007f912081e800 nid=0x3503 in Object.wait() [0x00007000034e1000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x0000000715586c00> (a java.lang.ref.Reference$Lock)
	at java.lang.Object.wait(Object.java:502)
	at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
	- locked <0x0000000715586c00> (a java.lang.ref.Reference$Lock)
	at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

"main" #1 prio=5 os_prio=31 tid=0x00007f9121008800 nid=0x1503 waiting on condition [0x00007000028bd000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
	at java.lang.Thread.sleep(Native Method)
	at com.mars.GranfatherTalkToMe.main(GranfatherTalkToMe.java:10)

"VM Thread" os_prio=31 tid=0x00007f9121041000 nid=0x3303 runnable

当前线程很健康,没有问题。

jstack出来的信息,大家可能会看不懂,但是大致也就这样几种状态:

NEW:未启动的,不会出现在Dump中;

RUNNABLE: 在虚拟机内执行的;

BLOCKED:受阻塞并等待监视器锁;

WATING:无限期等待另一个线程执行特定操作;

TIMED_WATING:有时限的等待另一个线程的特定操作;

TERMINATED:已退出的;

如果出现死锁的情况,会直接提示DeadLock的。

最后

呵呵,一分钟也不过如此,少说多做才持久,下个章节见。

标签:lang,java,JDK,prio,31,Thread,nid,命令行,Java
From: https://blog.51cto.com/marsz/6192456

相关文章

  • java字节码编程技术(8/10) -Javassist
    Javassist这个库和asm经常使用,它的性能稍差一点<dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.27.0-GA</version></dependency>获取一个类加载器(ClassLoader),以加载指定的.jar或.class文件privateClassLoade......
  • java.lang.NoSuchMethodException: com.innovation.web.BuyServlet.get(javax.servlet
    问题描述我将路径定义到相应的servlet的函数方法里面,然后就出现了这个问题,很明显的找不到相应的函数方法;问题解决将目光重新放到我定义的相关路径那里,发现我出于习惯,将servlet里面原本应该是名为checkIt的函数方法写成了get方法,改回去之后,这个问题也就解决啦!......
  • Java Stream API 操作完全攻略:让你的代码更加出色 (四)
    前言  JavaStream是一种强大的数据处理工具,可以帮助开发人员快速高效地处理和转换数据流。使用Stream操作可以大大简化代码,使其更具可读性和可维护性,从而提高开发效率。本文将为您介绍JavaStream操作的所有方面,包括range、range、iterate、generate等操作,让你的代码行......
  • eclpise断点调试Java代码
    Eclipse支持对Java代码进行Debug也就是在执行代码时暂停执行并可以观察相关的信息,比如栈中的变量,堆中的变量,执行的代码,方法调用栈等,这个暂停的位置就是断点一个简单的工程如果需要观察getMax方法的执行,可以在代码编辑器左边缘双击,增加断点,或者右键ToggleBre......
  • java -- 标记接口
    标记接口标记接口(MarkerInterface),又称标签接口(TagInterface)仅代表一个标记不包含任何方法标记接口是用来判断某个类是否具有某种能力Cloneable标记接口此类实现了Cloneable接口,以指示Object.clone方法可以合法地对该类实例进行按字段复制如果在没有实现Cloneable接......
  • JAVA远程请求工具类
    importcom.alibaba.fastjson.JSONObject;importorg.apache.http.Consts;importorg.apache.http.HttpResponse;importorg.apache.http.HttpStatus;importorg.apache.http.NameValuePair;importorg.apache.http.client.entity.UrlEncodedFormEntity;importorg.apac......
  • Java笔记(16) Collection集合-->Set集合-->HashSet
    1.Set接口基本介绍Set是无序集合(添加和取出的顺序不一致,但取出的顺序是固定的),没有索引不允许重复元素,所以最多包含一个nullJDKAPI中Set接口的实现类有:Abstract,ConcurrentHashMap.KeySetView,ConcurrentSkipListSet,CopyOnWriteArraySet,EnumSet,HashSet,JobStateRea......
  • java的协变和逆变
    一、协变和逆变的概念协变:模板中赋值给A的是A或者A的子类。比如:List<?extendsA>listA=List<ChildA>()即:ChildA可能是A或者A的子类逆变:模板中赋值给A的是A或者A的父类。比如:List<?superA>listA=List<ParentA>()即: ParentA可能是A或者A的父类二、为何会有协变和逆......
  • java maven-plugin-shade插件 Maven生成的jar运行出现“没有主清单属性”
    命令窗口运行jar,提示“没有主清单属性”  2.1分析问题在打包构建的jar目录内,可以看到有一个MANIFEST.MF文件,如图所示:该文件就是jar运行时要查找的清单目录,其中主清单数据,就是我们要运行的主类(函数入口main所在的类);提示缺少主清单属性,就是文件中少了主清单属性如下所示:正......
  • java——微服务——spring cloud——前言导读
                       黑马课程连接:https://www.bilibili.com/video/BV1LQ4y127n4?p=1&vd_source=79bbd5b76bfd74c2ef1501653cee29d6 ......