当前位置: 首页 > news >正文

Java 调试入门工具

jps常用命令

java

jps # 显示进程的ID 和 类的名称 jps –l # 输出输出完全的包名,应用主类名,jar的完全路径名 jps –v # 输出jvm参数 jps –q # 显示java进程号 jps -m # main 方法 jps -l xxx.xxx.xx.xx # 远程查看

jps参数

java

-q:仅输出VM标识符,不包括classname,jar name,arguments in main method -m:输出main method的参数 -l:输出完全的包名,应用主类名,jar的完全路径名 -v:输出jvm参数 -V:输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件 -Joption:传递参数到vm,例如:-J-Xms512m

jps原理

java程序在启动以后,会在java.io.tmpdir指定的目录下,就是临时文件夹里,生成一个类似于hsperfdata_User的文件夹,这个文件夹里(在Linux中为/tmp/hsperfdata_{userName}/),有几个文件,名字就是java进程的pid,因此列出当前运行的java进程,只是把这个目录里的文件名列一下而已。 至于系统的参数什么,就可以解析这几个文件获得。

更多请参考 jps - Java Virtual Machine Process Status Tool

jstack

jstack是jdk自带的线程堆栈分析工具,使用该命令可以查看或导出 Java 应用程序中线程堆栈信息。线程快照是当前虚拟机内每一条线程上在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、 请求外部资源导致的长时间等待等问题

注意:

  • Jstack 可以直接检测死锁;
  • Jstack并不能直接检测死循环,但可以通过分析线程堆栈信息间接发现死循环的存在;例如
    • 线程一直处于RUNNABLE状态。
    • CPU 使用率异常高(可以通过toppidstat等工具查看)。
    • 线程的堆栈信息中会反复出现相同的函数调用。

jstack常用命令:

java

# 基本 jstack pid jstack 2815 # java和native c/c++框架的所有栈信息 jstack -m 2815 # 额外的锁信息列表,查看是否死锁 jstack -l 2815

pid 是需要被打印配置信息的java进程id,可以用jps查询

jstack参数:

java

-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent 的 ownable synchronizers列表. -F 当’jstack [-l] pid’没有相应的时候强制打印栈信息 -m 打印java和native c/c++框架的所有栈信息. -h | -help 打印帮助信息
Jstack 使用

通过使用 jps 命令获取需要监控的进程的pid,然后使用 jstack pid 命令查看线程的堆栈信息。

通过 jstack 命令可以获取当前进程的所有线程信息。

每个线程堆的信息中,都可以查看到 线程ID、线程的状态(wait、sleep、running 等状态)、是否持有锁信息等。

死锁示例

下面通过一个例子,来演示 jstack 检查死锁的一个例子,代码如下:

java

public static void deathLock() { Thread t1 = new Thread() { @Override public void run() { try { lock1.lock(); TimeUnit.SECONDS.sleep(1); lock2.lock(); } catch (InterruptedException e) { e.printStackTrace(); } } }; Thread t2 = new Thread() { @Override public void run() { try { lock2.lock(); TimeUnit.SECONDS.sleep(1); lock1.lock(); } catch (InterruptedException e) { e.printStackTrace(); } } }; t1.setName("mythread1"); t2.setName("mythread2"); t1.start(); t2.start(); }

使用 jstack -l pid 查看线程堆栈信息,发现在堆栈信息最后面检查出了一个死锁。如下图

可以清楚的看出 mythread2 等待 这个锁 “0x00000000d6eb82d0”,这个锁是由于mythread1线程持有。

mythread1线程等待这个锁“0x00000000d6eb8300”,这个锁是由mythread2线程持有。

“mythread1”线程堆栈信息如下:

可以看出当前线程持有“0x00000000d6eb82d0”锁,等待“0x00000000d6eb8300”的锁

“mythread2”线程堆栈信息如下:

“mythread2”的堆栈信息中可以看出当前线程持有“0x00000000d6eb8300”锁,等待“0x00000000d6eb82d0”的锁。

jinfo

jinfo 是 JDK 自带的命令,可以用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息

Javacore,也可以称为“threaddump”或是“javadump”,它是 Java 提供的一种诊断特性,能够提供一份可读的当前运行的 JVM 中线程使用情况的快照。即在某个特定时刻,JVM 中有哪些线程在运行,每个线程执行到哪一个类,哪一个方法。应用程序如果出现不可恢复的错误或是内存泄露,就会自动触发 Javacore 的生成。

jinfo常用命令:

java

# 输出当前 jvm 进程的全部参数和系统属性 jinfo 2815 # 输出所有的参数 jinfo -flags 2815 # 查看指定的 jvm 参数的值 jinfo -flag PrintGC 2815 # 开启/关闭指定的JVM参数 jinfo -flag +PrintGC 2815 # 设置flag的参数 jinfo -flag name=value 2815 # 输出当前 jvm 进行的全部的系统属性 jinfo -sysprops 2815

jinfo参数:

java

no option 输出全部的参数和系统属性 -flag name 输出对应名称的参数 -flag [+|-]name 开启或者关闭对应名称的参数 -flag name=value 设定对应名称的参数 -flags 输出全部的参数 -sysprops 输出系统属性
示例一: no option

命令:jinfo pid
描述:输出当前 jvm 进程的全部参数和系统属性

示例二: -flag name

命令:jinfo -flag name pid
描述:输出对应名称的参数

使用该命令,可以查看指定的 jvm 参数的值。如:查看当前 jvm 进程是否开启打印 GC 日志。

示例三:-flag [+|-]name

命令:jinfo -flag [+|-]name pid
描述:开启或者关闭对应名称的参数

使用 jinfo 可以在不重启虚拟机的情况下,可以动态的修改 jvm 的参数。尤其在线上的环境特别有用。

使用如下:

示例四:-flag name=value

命令:jinfo -flag name=value pid
描述:修改指定参数的值。

同示例三,但示例三主要是针对 boolean 值的参数设置的。
如果是设置 value值,则需要使用 name=value 的形式。

使用如下:

注意事项 :jinfo虽然可以在java程序运行时动态地修改虚拟机参数,但并不是所有的参数都支持动态修改

示例五: -flags

命令:jinfo -flags pid
描述:输出全部的参数

示例六:-sysprops

命令:jinfo -sysprops pid
描述:输出当前 jvm 进行的全部的系统属性

jmap

命令jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。

两个用途

java

# 查看堆的对象分配情况 jmap -heap 2815 # dump jmap -dump:live,format=b,file=/tmp/heap2.bin 2815 jmap -dump:format=b,file=/tmp/heap3.bin 2815 # 查看堆的占用 jmap -histo 2815 | head -10

jmap参数

java

no option: 查看进程的内存映像信息,类似 Solaris pmap 命令。 heap: 显示Java堆详细信息 histo[:live]: 显示堆中对象的统计信息 clstats:打印类加载器信息 finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象 dump:<dump-options>:生成堆转储快照 F: 当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效. help:打印帮助信息 J<flag>:指定传递给运行jmap的JVM的参数
示例一:no option

命令:jmap pid

http://www.jsqmd.com/news/1092919/

相关文章:

  • 大湾区EMBA特色测评:科学选型理性指南
  • python: Deadline Pattern
  • 从零到一:如何用免费开源Verilog工具链打造专业数字电路
  • StockWidget:桌面悬浮的轻量盯盘小工具
  • 关于vidocoding的开发流程
  • 微信小程序云开发实战:从0到1构建“商业清洁预约”双向匹配后端
  • CBDC安全架构:密码学签名与硬件防护核心技术解析
  • 【单片机毕业设计】基于 STM32 的多模式智能路灯控制系统设计, 基于单片机的光照自适应路灯亮度调节系统设计(014001)
  • Python 文件打开模式总结
  • 为什么顶尖AI团队拒绝“通用提示词”?——稀缺首发:金融/医疗/法律三大垂直领域217条经审计Prompt资产包(限时开放下载)
  • 图片进知识库:先让模型生成文字描述再检索
  • StyleGAN 技术脉络:从风格空间到无混叠生成
  • 《科技代替了我工作》值得被认真放进中文歌单
  • Java 多线程:继承 Thread 与实现 Runnable 两种创建方式完整对比
  • 吾爱出品,必属精品,离线可用!
  • 自动定期备份服务器数据
  • python下载M3U8视频脚本
  • 【单片机毕业设计】基于 STM32 的超重声光报警电子秤设计与实现,基于 STM32 的阈值式重量监测报警系统设计(013701)
  • AI截图工具免费下载,基于DeepSeek的OCR截图软件支持Mac和Win
  • 三列布局三大方案对比总结
  • TI TPIC7710EVM评估模块:汽车EPB系统ASIC驱动与电机控制实战解析
  • Burp Suite实战:验证码场景下的自动化渗透测试与绕过技术
  • 专业iOS激活锁绕过工具applera1n:5分钟恢复iPhone 6s-X使用权限
  • 单板测试正常,整机运行异常:6 类系统排查清单
  • 关于我的第十次web作业
  • YOLO轻量化与部署优化- 第75篇:ONNX导出与优化:从PyTorch到ONNX部署
  • 传统潮流款库存一定会亏损,编程潮流款二手转售,改款二次销售收益模型,降低滞销亏损。
  • PilotGo-plugin-llmops API全解析:轻松集成与二次开发
  • ABB工业机器人编程基础(十三)功能程序(FUNC)
  • 合肥第三期《AI产品经理训练营》授课心得