使用 HSDB 查看 jvm 内存

用户头像
引花眠
关注
发布于: 2020 年 07 月 20 日

测试代码

以下是测试使用的代码:

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)

保存并退出,重启系统。

这样下次启动时也会生效。

参考资料

  1. 014-通过JDB调试,通过HSDB来查看HotSpot VM的运行时数据



发布于: 2020 年 07 月 20 日 阅读数: 25
用户头像

引花眠

关注

还未添加个人签名 2018.06.11 加入

还未添加个人简介

评论

发布
暂无评论
使用HSDB 查看jvm内存