第一次使用hsdb(代码片段)

alinainai alinainai     2022-12-22     800

关键词:

今天看了几篇大佬关于HSDB使用的文章,自己也依样画葫芦的用来一下,强大的一匹!!!

HSDB(Hotspot Debugger),JDK自带的工具,用于查看JVM运行时的状态。

HSDB位于C:\\Program Files\\Java\\jdk1.8.0_212\\lib里面,接下来启动HSDB:

1 java -cp .\\sa-jdi.jar sun.jvm.hotspot.HSDB

  正常启动之后界面是这样的:

技术图片

  一篇空白,没啥好看的。当然有的同学可能启动的时候会报错,我启动的时候也是报错了的:

技术图片

  这个错是说有个.dll文件没找到,然后寻找的路径是C:\\Program Files\\Java\\jre1.8.0_212\\bin\\,是去我的jre里面去找的,我在安装jdk的时候选择安装了外部的jre

技术图片

  然后我就去jdk里面找了一下有没有这个dll文件,还真有,我就给copy到外部jre里面对应的目录里面了,接着启动HSDB就没有问题啦。

  接着上面的,我们已经启动了HSDB,接下来可以关联到具体的JVM进程了,我这里准备了一段代码并启动,今天的用HSDB对JVM进行分析,就跟着这段代码走了

 1 public abstract class A 
 2 
 3     public void printMe() 
 4         System.out.println("I love vim");
 5     
 6     public abstract void sayHello();
 7 
 8 
 9 
10 public class B extends A
11 
12     @Override
13     public void sayHello() 
14         System.out.println("hello, i am child B");
15     
16 
17 
18 
19 public class MyTest 
20 
21     public static void main(String[] args) throws IOException 
22         A obj = new B();
23         System.in.read();
24         System.out.println(obj);
25     
26 
27 

  运行代码之后,会卡在System.in.reda();这里,于是我们可以查看JVM的进程,这里我是用jps命令来查看:

技术图片

  可以看到刚才运行的代码的PID是5360,我们在HSDB里面去关联进程:

  File > Attach to Hotspot process

技术图片

  进来之后首先看到就是当前进程里面的线程:

技术图片

  好,到此一步,我们前面的准备工作已经OK了,接下来我们的目的就是分析多态情况下的虚方法表,具体来说就是分析B对象的vtable,首先找到B对象的

内存指针地址:

  Tools > Class Browser

技术图片

  B对象的地址是0x0000000100062028,然后我们去看这个对象的详细信息:

  Tools > Inspector

技术图片

  找到有一行是vtable的,那就是该对象的虚方法表了,我这里是:

技术图片

  咦,为什么虚方法表现是方法有七个呢?这是因为,万物皆对象,对象都继承自Object,所以B对象继承了Object的5个方法,然后继承了A的一个方法,自己重写了

一个方法,所以是七个,如何验证呢?

  我们可以用mem命令来查看,当然要先知道vtable的内存起始地址。这里可以这样算,因为vtable是在instanceKlass对象实例的尾部,而instanceKlass大小在

64 位系统的大小为 0x1B8,因此 vtable 的起始地址等于 instanceKlass 的内存首地址加上 0x1B8 等于 0x00000007C00605D0

技术图片

  接下类我们就用算出这个地址1000621E0去看:

  Windows > Console

技术图片

  第一列是方法实际在堆中的内存地址,第二列则是内存指针地址,于是我们拿到内存指针地址去A,B和Object中分别查看,可以看到前5行对应的是Object

的方法,第6行对应的是A对象中的方法,第7行则对应B对象中的方法,由此我们可以得出以下结论:

1.vtable 是 Java 实现多态的基石,如果一个方法被继承和重写,会把 vtable 中指向父类的方法指针指向子类自己的实现。
2.Java 子类会继承父类的 vtable。Java 所有的类都会继承 java.lang.Object 类,Object 类有 5 个虚方法可以被继承和重写。当一个类不包含任何方法时,vtable 的长度也最小为 5,表示 Object 类的 5 
个虚方法
3.finalstatic 修饰的方法不会被放到 vtable 方法表里 4.当子类重写了父类方法,子类 vtable 原本指向父类的方法指针会被替换为子类的方法指针
5.子类的 vtable 保持了父类的 vtable 的顺序

  参考文章:

  jvm 性能调优工具之 jps

  借HSDB来探索HotSpot VM的运行时数据

  通过HSDB来了解String值的真身在哪里

  

  推荐小册:

  技术图片

 

30借hsdb来探索hotspotvm的运行时数据(代码片段)

前言呵呵R大的经典文章: 借HSDB来探索HotSpotVM的运行时数据 也来动手实际过一次 另外就是文章中提到的根据Method查看方法的字节码信息,这部分也还是挺有趣的,我应该是之前整理在文档上面了的吧,多久整理一下 测试用例package... 查看详情

类成员变量在哪里分配(代码片段)

...来分析下类的静态变量到底在哪里分配,同时熟悉下如何使用HSDB这个工具查看Java内存信息。一、启动Java进程我们通过debug模式运行如下代码 查看详情

hsdb

http://lovestblog.cn/blog/2014/06/28/hsdb-string/借HSDB来探索HotSpotVM的运行时数据 查看详情

33根据instanceklass查找vtable的数据(代码片段)

前言//呵呵下周就要离开这个住了五年的地方了吧 之前(2020.05.17)在hllvm群组看到这样一篇文章,呵呵当时打了一个todo,是时候清理todo了 在HSDB中查看instanceKlass中vtable的疑问?就是给你一个InstanceKlass,你怎么定位到这个Klass对应... 查看详情

33根据instanceklass查找vtable的数据(代码片段)

前言//呵呵下周就要离开这个住了五年的地方了吧 之前(2020.05.17)在hllvm群组看到这样一篇文章,呵呵当时打了一个todo,是时候清理todo了 在HSDB中查看instanceKlass中vtable的疑问?就是给你一个InstanceKlass,你怎么定位到这个Klass对应... 查看详情

hsdb

$JAVA_HOME/bin/java-classpath$JAVA_HOME/lib/sa-jdi.jarsun.jvm.hotspot.HSDB importjava.util.ArrayList;importjava.util.List;importjava.util.Properties;/***Createdbyjasonon7/25/2016.*/publicclassgg{ 查看详情

hsdb-hotspotdebugger

  HSDB是专门用于调试HotSpotVM的调试器,它是一个图形化界面。与之对应的还有个CLHSDB-CommandLineHotSpotDebugger,命令行调试界面。下面是启动命令:java-cp.;%JAVA_HOME%/lib/sa-jdi.jarsun.jvm.hotspot.HSDB#启动图形界面java-cp.;%JAVA_HOME%/lib/sa-jdi.j... 查看详情

初次尝试java虚拟机调试-启动hsdb

    本人最近正在学习java虚拟机,而HSDB是学习java虚拟机的必经之路,于是今天尝试下了HSDB的调试。    首先借鉴了知乎大牛R大的文章:   借HSDB来探索HotSpotVM的运行时数据,而本文章的意... 查看详情

初次尝试java虚拟机调试-启动hsdb

    本人最近正在学习java虚拟机,而HSDB是学习java虚拟机的必经之路,于是今天尝试下了HSDB的调试。    首先借鉴了知乎大牛R大的文章:   借HSDB来探索HotSpotVM的运行时数据,而本文章的意... 查看详情

第一次使用多线程(代码片段)

项目中有个需求自动发送短信功能,因为数据可能比较多 就考虑用多线程来完成。具体需求此处分了两个步骤 ,在后后发送的时候保存模板和根据条件筛选出来的用户。第二步,自动发送短信服务,该服务是控制台程序... 查看详情

第一次制作和使用图标字体-icomoon(代码片段)

 开题:之前就有所耳闻,最近两天第一次运用到图标字体。刚开始嘛,一脸懵逼的状态。成功运用之后就来记录一下使用过程咯!1.打开在线生成工具:https://icomoon.io/app/#/select  2.导入本地文件或者选择图标库(1)如... 查看详情

xml第一次自动填充,使用属性的customfield(专门针对searchspring的颜色)(代码片段)

查看详情

xml第一次自动填充,使用属性的customfield(专门针对searchspring的颜色)(代码片段)

查看详情

智能车第一次任务(代码片段)

2、初试排序输入不超过100个整数,排序并去除重复数字之后输出。输入格式:第一行为输入的数字个数,第二行为全部数字(使用空格间隔)输出格式:直接输出全部数字(使用空格间隔)要求:排序使用冒泡排序和快速排序... 查看详情

第一次使用loadrunner时遇到的问题(代码片段)

记录一下第一次使用LoadRunner时遇到的问题安装LoadRunner下载链接:ed2k://|file|%5B%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7LR11.00%5D.loadrunner-11.iso|4313382912|b95afeb3a879c6b8146435bb79e8cb97|h=nt 查看详情

使用convenientbanner时页面第一次显示总会显示最后一页(代码片段)

问题:ConvenientBanner是比较常用的和很多人使用的广告轮播的第三方控件.本身控件也是很好使用的.感谢作者先~~.今天使用时发现一个问题.情况是这样的.使用其来显示启动界面(其实就是懒得自己去写个指示器),当然启动页这里是不... 查看详情

beyondcompare4使用脚本,每月一次(代码片段)

BeyondCompare4使用脚本,每月一次1、手动在windows命令行输入以下脚本regdelete“HKEY_CURRENT_USER\\Software\\ScooterSoftware\\BeyondCompare4”/vCacheID/f2、重新打开3、每月一次 查看详情

java使用mockito调用tdd检查方法一次(代码片段)

查看详情