发布网友 发布时间:2022-04-10 20:12
共17个回答
懂视网 时间:2022-04-11 00:33
java -cp .sa-jdi.jar sun.jvm.hotspot.HSDB正常启动之后界面是这样的:
一篇空白,没啥好看的。当然有的同学可能启动的时候会报错,我启动的时候也是报错了的:
这个错是说有个.dll文件没找到,然后寻找的路径是C:Program FilesJavajre1.8.0_212in,是去我的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 的顺序
参考文章:
jvm 性能调优工具之 jps
借HSDB来探索HotSpot VM的运行时数据
通过HSDB来了解String值的真身在哪里
推荐小册:
第一次使用HSDB
标签:替换 cep lib 包含 main div margin system span
热心网友 时间:2022-04-10 21:41
雷纳多:贝塔星荒原,75级,常用绝招:野蛮扫横,魔动能量,属性复制,激光四射,打败它后可得到雷纳多的精元热心网友 时间:2022-04-10 22:59
火龙现在就可以打热心网友 时间:2022-04-11 00:34
雷纳多:贝塔星荒原,75级,常用绝招:野蛮扫横,魔动能量,属性复制,激光四射,打败它后可得到雷纳多的精元参考资料:纯属自己一字一句打出来的,选我呀
热心网友 时间:2022-04-11 02:25
你用一个80级的步步花 在带一个80级的罗吉拉斯热心网友 时间:2022-04-11 04:33
话说你没事练这么多小精灵不如练出一两个满级的来了。热心网友 时间:2022-04-11 06:58
额和,我用75的洛基拉斯+药水耗到他没技能的,我发现,他血看似就一点的时候,招招都致命,所以一开始就把野蛮和转化+魔能耗掉,最后就让他发激光吧(发激光最好是血还有,你血加满就随便打打,别在招没完之前K掉一大堆),注意哦,不能一下子打到很少血,那样他两下爆击死你哦。热心网友 时间:2022-04-11 09:39
赛尔号雷纳多技能表:初始技能 叩击 威力40 (特殊攻击)热心网友 时间:2022-04-11 12:37
洛吉拉斯烟雾5-6次,(打一次补血直到他打不中),比波同生3-4次,布布花寄生!热心网友 时间:2022-04-11 15:52
雷纳多 (75级)他/她有点难打呀 (感慨.......................ing)参考资料:无 绝对原创 请勿抄袭 嘿嘿 原版在我这里
热心网友 时间:2022-04-11 19:23
我倒霉啊,到勇者之塔49曾那个绿叶仙子,风华乱舞每回都打致命!先让巴鲁丝让他害怕,在上比波,几个童声公司(同生共死)还可以让巴鲁丝旋涡参考资料:禁止抄袭,我是反复实验得到的!
热心网友 时间:2022-04-11 23:11
打不过的,至少90级,用减命中的招,然后比波同生共死,然后最高级的一招秒了他!!没血补热心网友 时间:2022-04-12 03:16
那你也一定打他过致命一击,我也是,我的鲁加斯,爆裂拳打出致命一击,结果雷纳多都是致命一击,这好像是雷纳多的技能复制的效果,如果你真打不过,你就用你的鲁加斯,他打一次,你就加一次血,耗光他的技能,我朋友就是这样打的,先让雷纳多打一下,加一些血,这样好像是用了38个补血药丸,雷纳多没技能了,雷纳多一没技能就干脆不打了,你就借此机会,使劲揍他,就能把他揍死了,我也有雷纳多了,你好好加油吧!!!参考资料:我是一个一个打上来的,没复制,放心!
热心网友 时间:2022-04-12 07:37
先用70巴鲁斯雷多纳100%会疲惫,用49阿克西亚的冰封,用70巴鲁斯的高压水*。热心网友 时间:2022-04-12 12:15
ghjfyjdjgjhfgjfyjfjhgyjghgjhgjyhgjyhghbhghjghjgjhgjgfhjsdfvhjdhbfhjbdfjhdgfjhgdjhfbjhdbfhdjbhbnbhvbguygfhbhjvbbgjhdjnjhbhjghxjbvdhbhjghbhfbdfbjhgdbhgvddfdjhbghbghbghgjdbghdbgdhbjhfbdhvhbdjhgbfgjdkjgbgjhbghgbdhjgbjhvbdjhbvgfggbhghfgfbghbfghjbfgjbghbjhdbjhgbjdhbjhdbgjhgbhgbhgbghbjdhbghjdbghgbjhgbdhbghjjhbdghfhjsgjhsguygbgfhjdgfysgryudgfhbhhfghgyrgfhsgfhsgrfhgjgsyufghjsbjhswwgrjhsfbjhsdbfhjsgfhsyrghgrhjgfuysftughgfygsfysyughgygsryhgrhfhjhfgyghjghj参考资料:76786hbh
热心网友 时间:2022-04-12 17:10
跟纳多雷一样,必须要用烧伤冻伤才行,你现在最好狂练洛吉拉斯,因为他是必胜关键,雷纳多在300滴血一下用的招数都是致命一击!!小心应付!!多带些补血药剂!!参考资料:我已经打败雷纳多了,你说我从哪里搞来的!
热心网友 时间:2022-04-12 22:21
最简单的搞法