性能工具之 Java 调试工具 JDB

简介: 【2月更文挑战第25天】性能工具之 Java 调试工具 JDB

一、前言

严格来说,JDB 是 Java 调试工具。但是为了文章好分类,所以我加了“性能工具”几个字。其实才是仅为性能工具呢,这个是不好分类的。仅有一些专门的性能测试和性能监控工具,但是对性能分析、性能调试来说,用的工具几乎都不是专门为性能而设计的。

我们知道 windows 上面有 windebug,Linux 上面有 GDB,在 Java 的层面呢就有 JDB 可以用。

它可以实现对 Java 进程和线程进行各种动态控制操作。命令参数可以在网上查查或者直接 help 一下。由于太长,我就不列在这里了。直接把我的操作列在这里供参考。

二、服务端

在要运行的 Java 程序中的 JAVA_OPTIONS 里加入:

-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y

看需要,suspend 可以为 n,也就是不等待连上来就直接运行程序。这个和 jprofiler 连接中的参数是一个意思。

三、客户端

localhost:~Zee$ jdb-attach 192.168.1.105:8000 -sourcepath 
/Users/Zee/Documents/workspace/testProj/src/  #连接远程JVM,带源代码
Setuncaught java.lang.Throwable
Setdeferred uncaught java.lang.Throwable
Initializingjdb ...
> 
VMStarted: No frames on the current call stack

main[1]threads  #查看线程
Groupsystem:
 (java.lang.ref.Reference$ReferenceHandler)0x153 Reference Handler cond.waiting
 (java.lang.ref.Finalizer$FinalizerThread)0x152  Finalizer         cond. waiting
  (java.lang.Thread)0x151                         Signal Dispatcherrunning
Groupmain:
  (java.lang.Thread)0x1                           main              running

> stop atZee.MemoryTest.OOM.MEMTestDemo:42  #设置断点
Setbreakpoint Zee.MemoryTest.OOM.MEMTestDemo:42

>    #断点命中
Breakpoint hit: "thread=main",Zee.MemoryTest.OOM.MEMTestDemo.main(), line=42 bci=6
42if(args[0].equals("HeapOOM")) {
   

> thread0x1  #进入线程
main[1]where  #查看位置
  [1] Zee.MemoryTest.OOM.MEMTestDemo.main(MEMTestDemo.java:42)
Localvariables:

main[1]clear  #查看断点
Breakpointsset:
  breakpoint Zee.MemoryTest.OOM.MEMTestDemo:42

main[1]cont  #继续执行
>where
Nothread specified.
>thread 0x1
>
main[1]suspend  #暂停线程
Allthreads suspended.

main[1]where  #查看位置  
  [1] Zee.MemoryTest.OOM.MEMTestDemo.main(MEMTestDemo.java:46)

main[1]tracemethods 0x1  #跟踪方法调用
main[1]
main[1]cont
> 
Methodentered: 
Methodentered: "thread=main", Zee.MemoryTest.OOM.OOMObject.<init>(),line=3 bci=0
3    public class OOMObject {
   

main[1]untracemethods 0x1  #取消跟踪

main[1]step  #单步调试
> 
Stepcompleted: "thread=main", Zee.MemoryTest.OOM.MEMTestDemo.main(),line=46 bci=33
46      list.add(newOOMObject());

main[1]next  #执行一行(stepOVERCalls)
> 
Stepcompleted: "thread=main", Zee.MemoryTest.OOM.MEMTestDemo.main(),line=45 bci=39
45while (true) {
   

main[1]locals  #查看变量
Methodarguments:
args= instance of java.lang.String[1] (id=439)
Localvariables:
list= instance of java.util.ArrayList(id=441)

main[1]list  #查看源码
42      if(args[0].equals("HeapOOM")) {
   
43      List<OOMObject>list = new ArrayList<OOMObject>();
44    
45      while(true) {
   
46=>   list.add(new OOMObject());
47      }
48      }
49    
50      if(args[0].equals("StackSOF")) {
   
51 MEMTestDemo memtestdemo = newMEMTestDemo();●

main[1]dumplist  #dump变量
 list = {
   
    serialVersionUID: 8683452581122892189
    DEFAULT_CAPACITY: 10
    EMPTY_ELEMENTDATA: instance ofjava.lang.Object[0] (id=442)
    DEFAULTCAPACITY_EMPTY_ELEMENTDATA: instanceof java.lang.Object[0] (id=443)
    elementData: instance ofjava.lang.Object[2734845] (id=444)
    size: 1964611
    MAX_ARRAY_SIZE: 2147483639
    java.util.AbstractList.modCount: 1964611
   java.util.AbstractCollection.MAX_ARRAY_SIZE: 2147483639
}

其实 JDB 还可以做更多的事情,比如说修改 JVM 中的变量值、监控某个变量的修改记录等等。

四、总结

不用特定死板的界定工具是用来干什么的,要看你想达到的目的是什么。包括它在什么时候用,怎么用,都没有统一的标准,就看适合不适合。

目录
相关文章
|
4天前
|
Java
探索Java世界的奇妙工具——运算符与表达式运算符
探索Java世界的奇妙工具——运算符与表达式运算符
8 0
|
3天前
|
缓存 IDE Java
Java一分钟之-Gradle:构建自动化工具
【5月更文挑战第16天】本文介绍了Gradle,一个基于Groovy的灵活构建工具,强调其优于Maven的灵活性和性能。文中通过示例展示了基本的`build.gradle`文件结构,并讨论了常见问题:版本冲突、缓存问题和构建速度慢,提供了相应的解决策略。此外,还提醒开发者注意插件ID、语法错误和源代码目录等易错点。掌握这些知识能提升开发效率,使构建过程更顺畅。
21 2
|
3天前
|
安全 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【5月更文挑战第16天】 在移动开发领域,性能一直是开发者关注的焦点。随着Kotlin语言的普及,其与Java在Android应用中的性能表现成为热门话题。本文将深入分析Kotlin和Java在Android平台上的性能差异,并通过实际测试数据来揭示二者在编译速度、应用启动时间以及运行效率方面的表现。我们的目标是为开发者提供一个参考依据,以便在选择合适的编程语言时做出更加明智的决策。
|
4天前
|
Java Maven 开发者
Java一分钟之-Maven项目管理工具使用
【5月更文挑战第15天】Maven是Java开发的项目管理工具,用于自动化构建、依赖管理和项目信息管理。通过POM模型管理项目,依赖中央仓库。基本目录包括`src/main/java`、`src/main/resources`、`src/test/java`和`src/test/resources`。常用命令有`clean`、`compile`、`test`、`package`和`install`。面对依赖冲突、找不到依赖或编译错误,可以调整`pom.xml`或`settings.xml`。理解Maven的工作原理和解决常见问题能提升开发效率。
17 0
|
4天前
|
存储 安全 Java
12条通用编程原则✨全面提升Java编码规范性、可读性及性能表现
12条通用编程原则✨全面提升Java编码规范性、可读性及性能表现
|
4天前
|
监控 Java Maven
揭秘Java Agent技术:解锁Java工具开发的新境界
作为JDK提供的关键机制,Java Agent技术不仅为Java工具的开发者提供了一个强大的框架,还为性能监控、故障诊断和动态代码修改等领域带来了革命性的变革。本文旨在全面解析Java Agent技术的应用场景以及实现方式,特别是静态加载模式和动态加载模式这两种关键模式。
49 0
|
4天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能对比
【5月更文挑战第4天】在移动开发的世界中,性能一直是衡量应用质量的重要指标。随着Kotlin的兴起,许多Android开发者开始考虑是否应该从传统的Java迁移到Kotlin。本文通过深入分析两者在Android平台上的性能差异,帮助开发者理解Kotlin在实际项目中的表现,并提供选择编程语言时的参考依据。
24 5
|
4天前
|
存储 缓存 前端开发
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
54 3
|
4天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【5月更文挑战第1天】 在移动开发的世界中,性能优化始终是开发者关注的焦点。随着Kotlin的兴起,许多团队和开发者面临着一个选择:是坚持传统的Java语言,还是转向现代化、更加简洁的Kotlin?本文通过深入分析和对比Kotlin与Java在Android应用开发中的性能表现,揭示两者在编译效率、运行速度和内存消耗等方面的差异。我们将探讨如何根据项目需求和团队熟悉度,选择最适合的语言,以确保应用的高性能和流畅体验。
|
4天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第30天】在Android开发领域,Kotlin作为一种现代化的编程语言,因其简洁性和功能性受到了开发者的广泛欢迎。尽管与传统的Java相比,Kotlin提供了诸多便利,但关于其性能表现的讨论始终未息。本文将深入分析Kotlin和Java在Android平台上的性能差异,通过实际测试数据揭示两种语言在编译效率、运行速度以及内存占用方面的具体表现,并探讨如何利用Kotlin的优势来提升Android应用的整体性能。