共计 2786 个字符,预计需要花费 7 分钟才能阅读完成。
明天在整顿 PPT 的时候,发现没有这个工具的 slide,所以就顺手整顿一下。
严格来说,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]contMethodentered:
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”)) {
51MEMTestDemo 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 中的变量值、监控某个变量的批改记录等等。
不必特定死板的界定工具是用来干什么的,要看你想达到的目标是什么。包含它在什么时候用,怎么用,都没有对立的规范,就看适宜不适宜。