第一次使用HSDB
今天看了几篇大佬关于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.final 和 static 修饰的方法不会被放到 vtable 方法表里
4.当子类重写了父类方法,子类 vtable 原本指向父类的方法指针会被替换为子类的方法指针
5.子类的 vtable 保持了父类的 vtable 的顺序
参考文章:
推荐小册:

第一次使用HSDB的更多相关文章
- 我的“第一次”,就这样没了:DDD(领域驱动设计)理论结合实践
写在前面 插一句:本人超爱落网-<平凡的世界>这一期,分享给大家. 阅读目录: 关于DDD 前期分析 框架搭建 代码实现 开源-发布 后记 第一次听你,清风吹送,田野短笛:第一次看你,半弯 ...
- IIS初始化(预加载),解决第一次访问慢,程序池被回收问题
你以为你可以慢,那是不可能的!你以为你可以不动,那也是不可能的! 河南是守株待兔故事情节的发源地,讲的是懒惰的农夫坐在树桩旁等待可爱的小毛兔撞树的故事,那么这种事情怎么可能天天出现呢!你以为的事并一定 ...
- 简历生成平台项目开发-STEP3第一次项目例会探讨
时间:2016.7.13周三7点半 地点:图书馆 讨论主题:项目需求和功能分析.第一次任务分配 内容:按照之前的讨论,我们认为简历生成功能,不仅要适应学生求职的需求,更多的是要在格式和内容上满足HR的 ...
- android应用程序第一次启动时显示引导界面
市面上好多优秀的应用(举例新浪微博.UC浏览器)都采用了欢迎页面与使用向导的方式给用户带来了良好的用户体验. 一般来说用户第一次安装应用或者安装了新版本后第一次进入应用都会显示成 欢迎页面-使用向导- ...
- 《Entity Framework 6 Recipes》中文翻译系列 (40) ------ 第七章 使用对象服务之从跟踪器中获取实体与从命令行生成模型(想解决EF第一次查询慢的,请阅读)
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-5 从跟踪器中获取实体 问题 你想创建一个扩展方法,从跟踪器中获取实体,用于数 ...
- Android笔记——判断程序是否第一次启动
public class Welcome extends Activity { private final long SPLASH_LENGTH = 2000; Handler handler = n ...
- HSDB - HotSpot debugger
HSDB 是专门用于调试 HotSpot VM 的调试器,它是一个图形化界面.与之对应的还有个 CLHSDB-Command Line HotSpot Debugger,命令行调试界面.下面是启动命令 ...
- Coding道场:第一次
10/23日,我在部门内部进行了一次内部学习,使用目前流行的Coding Dojo(道场)方式,进行了TDD开发的演练.演练的题目如下: 有关Coding道场的介绍,请自行百度一下,我就不再多 ...
- 第一次写博客Poj1044
Date bugs Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3005 Accepted: 889 Descript ...
随机推荐
- Spine学习七 - spine动画资源+ Unity Mecanim动画系统
前面已经讲过 Spine自己动画状态机的动画融合,但是万一有哥们就是想要使用Unity的动画系统,那有没有办法呢?答案是肯定的,接下来,就说说如何实现: 1. 在project面板找打你导入的Spin ...
- 20190925-01安装redis 000 022
1.将redis压缩包放入Linux系统有4种办法. 第一:如果安装了VMware Tools工具可以直接进行拖拽 第二:在windows中找到配置好的共享文件夹将redis压缩包放入其中,在Linu ...
- python3 venv
介绍 venv 是什么? python3 自带的虚拟环境 为什么需要虚拟环境? 当服务器中需要搭建共存多个环境时(不同环境之间会有冲突) 比如说环境1:需要mongo:3.6版本 / 但是环境2:需要 ...
- leetcode刷题-69x的平方根
题目 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4输出: 2 思 ...
- python应用 曲线拟合 01
双指数函数 待拟合曲线为 y(x) = bepx + ceqx import matplotlib.pyplot as plt x = ([0.05, 0.1, 0.15, 0.2, 0.25, 0. ...
- SpringCloud实战 | 第二篇:SpringCloud整合Nacos实现注册中心
前言 随着eureka的停止更新,如果同时实现注册中心和配置中心需要SpringCloud Eureka和SpringCloud Config两个组件;配置修改刷新时需要SpringCloud Bus ...
- Android实现二值点阵图识别
好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star 前言 我这几天在做一个东西,就是一张像二维码这样的 n*n ...
- CentOS 7安装SeaweedFS
1.从GitHub下载编译好的SeaweedFS 地址:https://github.com/chrislusf/seaweedfs/releases 选择linux_amd64.tar.gz的压缩包 ...
- tomcat源码之概述
tomcat架构及常用的组件如下: Server Server代表了tomcat服务器,Tomcat启动时即会启动一个server实例,它监听在8005端口以接收shutdown命令,使用 telne ...
- 最全总结 | 聊聊 Python 数据处理全家桶(Sqlite篇)
1. 前言 上篇文章 聊到 Python 处理 Mysql 数据库最常见的两种方式,本篇文章继续说另外一种比较常用的数据库:Sqlite Sqlite 是一种 嵌入式数据库,数据库就是一个文件,体积很 ...