写点什么

使用 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 输入查看其命令

universeHeap 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> scanoopsUsage: scanoops start end [ type ]hsdb> scanoops 0x00007fb06ee00000 0x00007fb06f800000 TestNo such type.hsdb> scanoops 0x00007fb06ee00000 0x00007fb06f800000 top.shaozuo.studyhotspot.Test0x00007fb06ee9a308 top/shaozuo/studyhotspot/Testhsdb> inspect 0x00007fb06ee9a308instance of Oop for top/shaozuo/studyhotspot/Test @ 0x00007fb06ee9a308 @ 0x00007fb06ee9a308 (size = 72)_mark: 1_metadata._klass: InstanceKlass for top/shaozuo/studyhotspot/Testi: Oop for java/lang/Integer @ 0x00007fb06ee3d828 Oop for java/lang/Integer @ 0x00007fb06ee3d828plong: 18s: 6c: 'A'l: 0i: Oop for java/lang/Integer @ 0x00007fb06ee3d828 Oop for java/lang/Integer @ 0x00007fb06ee3d828plong: Oop for java/lang/Long @ 0x00007fb06ee9c258 Oop for java/lang/Long @ 0x00007fb06ee9c258c: '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 日阅读数: 128
用户头像

引花眠

关注

还未添加个人签名 2018.06.11 加入

还未添加个人简介

评论

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