测试代码
以下是测试使用的代码:
public abstract class MyClass {
private Integer i =1;
protected long plong = 18L;
protected final short s = 6;
public char c = 'A';
}
public class Test extends MyClass {
private long l;
private Integer i =1;
protected Long plong = 12L;
public char c = 'B';
public void add(int a,int b) {
Test test = this;
int z = a+b;
int x = 3;
}
public static void main(String[] args) {
Test test= new Test();
test.add(2, 3);
}
}
复制代码
将其编译之后可以在 add 上打断点,然后使用 HSDB 查看运行时的数据。
HSDB
启动 hsdb
可以使用以下命令:
java -cp .;%JAVA_HOME%/lib/sa-jdi.jar sun.jvm.hotspot.HSDB
复制代码
启动之后可以使用 jps 命令查看运行的 Java 代码的进程 id
然后使用File->Attach to HotSpot process
将该进程 id 输入查看其命令
universe
Heap Parameters:
Gen 0: eden [0x00007fb06ee00000,0x00007fb06eeaab10,0x00007fb06f0b0000) space capacity = 2818048, 24.80979742005814 used
from [0x00007fb06f0b0000,0x00007fb06f0b0000,0x00007fb06f100000) space capacity = 327680, 0.0 used
to [0x00007fb06f100000,0x00007fb06f100000,0x00007fb06f150000) space capacity = 327680, 0.0 usedInvocations: 0
Gen 1: old [0x00007fb06f150000,0x00007fb06f150000,0x00007fb06f800000) space capacity = 7012352, 0.0 usedInvocations: 0
hsdb> scanoops
Usage: scanoops start end [ type ]
hsdb> scanoops 0x00007fb06ee00000 0x00007fb06f800000 Test
No such type.
hsdb> scanoops 0x00007fb06ee00000 0x00007fb06f800000 top.shaozuo.studyhotspot.Test
0x00007fb06ee9a308 top/shaozuo/studyhotspot/Test
hsdb> inspect 0x00007fb06ee9a308
instance of Oop for top/shaozuo/studyhotspot/Test @ 0x00007fb06ee9a308 @ 0x00007fb06ee9a308 (size = 72)
_mark: 1
_metadata._klass: InstanceKlass for top/shaozuo/studyhotspot/Test
i: Oop for java/lang/Integer @ 0x00007fb06ee3d828 Oop for java/lang/Integer @ 0x00007fb06ee3d828
plong: 18
s: 6
c: 'A'
l: 0
i: Oop for java/lang/Integer @ 0x00007fb06ee3d828 Oop for java/lang/Integer @ 0x00007fb06ee3d828
plong: Oop for java/lang/Long @ 0x00007fb06ee9c258 Oop for java/lang/Long @ 0x00007fb06ee9c258
c: 'B'
hsdb>
复制代码
注意事项
在 ubuntu 系统中,使用 HSDB 可能会出现如下错误:
ERROR: ptrace(PTRACE_ATTACH, ..) failed for 11276: 不允许的操作
复制代码
出现该错误是因为在 Ubuntu 11.04(“Natty Narwhal”)之后的版本中,一种叫做 ptrace scope 的安全机制被引入。这种机制防止用户访问当前正在运行的进程的内存和状态,这就造成 QtCreator 的调试器不能正常工作。这种安全机制可以防止恶意软件附加到其他进程中(如 SSH 或者 GPG),读取程序内存,产生安全问题。
有两种方式可以使用
一种是临时的解决方案,重启后实效,将/proc/sys/kernel/yama/ptrace_scope 虚拟文件的内容设为 0
sudo echo 0 > /proc/sys/kernel/yama/ptrace_scope
复制代码
另一种解决方法可以永久解决这个问题,方法是编辑/etc/sysctl.d/10-ptrace.conf 这个文件,设置
kernel.yama.ptrace_scope = 0(默认是 1)
保存并退出,重启系统。
这样下次启动时也会生效。
参考资料
014-通过JDB调试,通过HSDB来查看HotSpot VM的运行时数据
评论