- 浏览: 3048941 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
接前一篇日志,再记一些HotSpot中Serviceability Agent(以下简称SA)的有趣用法。
前面提到过,要在Windows上使用SA的话,可以使用Sun JDK 7 build 64或者更新的版本。下面我们用JDK 7 build 96来跑VisualVM 1.3和Groovy 1.7.2的groovysh做个例子。
(要用JDK7来启动groovysh的话,一个简单的办法是在命令行里把JAVA_HOME设置到JDK7的目录上。
另外,要让Groovy使用某些Java参数启动的话,可以设置JAVA_OPTS环境变量)
在启动VisualVM的时候,确保它使用的是JDK7。可以用--jdkhome参数或者在VisualVM安装目录下的etc/visualvm.conf文件中设置jdkhome。启动后在VisualVM主菜单的Tools -> Plugins里,选择Available Plugins选项卡,在列表里可以看到一个称为SAPlugin的插件,把它装上。SAPlugin是VisualVM为SA提供的图形界面插件,可以方便的使用SA的部分封装好的功能。
然后用JDK7来启动一个groovysh,再在VisualVM里通过SAPlugin接进去,可以看到:
SAPlugin还有这样的功能,可以看到被JIT编译过的方法以及解释器的汇编代码:
那SA是不是有内建的反汇编器,可以把任意x86、x64、IA64、SPARC等架构的机器码给反汇编为汇编代码呢?答案是肯定的,有足够方便的现成的API可用。(x64版尚未实现完,暂时还用了)
(顺带提一下:“反汇编”(disassemble)与“反编译”(decompile)是不一样的,请不要弄混了。)
设想有个场景,HotSpot VM突然crash了,并在退出过程中打出了一个hs_err_pidXXXX.log的日志文件。其中开头的部分是:
可以看到HotSpot遇到了访问异常(EXCEPTION_ACCESS_VIOLATION)。访问异常有很多时候是由本地代码中的空指针访问而引起的,这里是否也是如此呢?
至少得看看出错的指令长啥样吧。可以看到日志里有一块写着“Instructions”,有两行十六进制表示的数据跟在后面。这就是出错位置前后的机器码,其中第二行开头处是出错指令的开头位置。
借助SA里内建的反汇编器,我们可以写段代码来看看日志里出错的机器码到底是什么:
确保$JAVA_HOME/lib/sa-jdi.jar在classpath上,运行该程序可以看到输出为:
可以看到在地址0x6d9039f1的指令是mov eax, [ecx],对ECX寄存器有一个间接读访问,而从日志上可以看到此时ECX寄存器的值为0x00000008。在32位Windows XP上0x00000000-0x0000FFFF是保护区域,尝试对该区域读写会引发访问异常。这里程序试图从0x00000008读取一个DWORD赋值给EAX,印证了它是日志中访问异常的事发地。当然,真正导致该问题的代码肯定在更前面的地方,但确认事发地的状况也算是个好的开始。
SA反汇编出来的汇编代码语法既不是AT&T系的(GNU as用这种),也不是Intel系的(MASM、NASM用这种),感觉有那么点怪。
与Intel系的相似点是参数顺序,目标在前,源在后;间接引用以方括号表示。
与AT&T系相似的是寄存器带有%前缀,而且间接引用的偏移量写在括号的前面;指令带有宽度后缀。
总之需要点时间来习惯…
反汇编器这部分的实现与SA的其它相对独立,要抽出来单独用也没什么问题。有需要的话抽个出来改造成纯MASM语法输出或许会有用。
Alright,今天就废话到这里~
看help就知道了。如果你的HSDB正常启动了的话(sa.js正确加载了),那么“dis”命令就是把机器指令反汇编的。它的格式是
其中address是机器指令的起始地址。length是想反汇编的数据的长度。
你问的问题的话pc那个值才是机器码相关的。
还有个比较新的disassemble命令也行。这个接收的参数是CodeBlob或者nmethod的起始地址。
注意:在JDK-6879063: SA should use hsdis for disassembly之后,SA会用hsdis插件来反汇编,这样只要支持hsdis的平台都能在SA里看反汇编;在它之前SA只能在x86(32位)上反汇编。
跟sa-jdi.jar的实现有关,而跟SAPlugin没关系。JDK7u的SA有些bug使得metadata字段不一定会显示出来。
您用的VisualVM是不是很新的,或者说是很新的JDK自带的?
如果是的话,试试用stand-alone的VisualVM。如果不行的话试试1.3.1之前的版本。
据说VisualVM 1.3.x都有点诡异?回头我找台Windows的机器来试试
翻译怎样个不给力法?我没读过中文版的,一直不知道这本的翻译质量如何
没读过英文版,且中文版目前只读了前两章。这只是一种感觉,抑或是这本书本身的难度对阅
读造成的影响。
翻译怎样个不给力法?我没读过中文版的,一直不知道这本的翻译质量如何
计算机组织与结构相关的内容如果有比较好的基础的话,对理解虚拟机也会有帮助。
毕竟要虚拟机要模拟的东西就是某种体系结构。
不过我觉得读不懂的话完全不需要着急。记得我是08年左右买到的那本书的影印版,前后已经读了很多遍了,花了颇长时间才渐渐觉得里面的内容变得易懂了。
你用的JDK版本是什么?这篇的开头就写了在Windows上的话一定要用JDK7才行。我的建议是安装一个新版本的JDK7,并且去下载一个单独的VisualVM(因为现在JDK7里的VisualVM有点小问题所以去下单独的版本吧)。
哦,正在下载visualvm。
那啥顺道再问个问题:
最近在读虚拟机:系统与进程的通用平台,发现很多知识点对我来说比较朦胧,好想知道,但是又不能全然领悟书中的观点。是不是知识储备不够?需要补充哪方面的知识?
你用的JDK版本是什么?这篇的开头就写了在Windows上的话一定要用JDK7才行。我的建议是安装一个新版本的JDK7,并且去下载一个单独的VisualVM(因为现在JDK7里的VisualVM有点小问题所以去下单独的版本吧)。
是用它“反汇编”,不是“汇编”……这玩儿只能从机器码转换到汇编,没法从汇编转换到机器码啦。
前面提到过,要在Windows上使用SA的话,可以使用Sun JDK 7 build 64或者更新的版本。下面我们用JDK 7 build 96来跑VisualVM 1.3和Groovy 1.7.2的groovysh做个例子。
(要用JDK7来启动groovysh的话,一个简单的办法是在命令行里把JAVA_HOME设置到JDK7的目录上。
另外,要让Groovy使用某些Java参数启动的话,可以设置JAVA_OPTS环境变量)
在启动VisualVM的时候,确保它使用的是JDK7。可以用--jdkhome参数或者在VisualVM安装目录下的etc/visualvm.conf文件中设置jdkhome。启动后在VisualVM主菜单的Tools -> Plugins里,选择Available Plugins选项卡,在列表里可以看到一个称为SAPlugin的插件,把它装上。SAPlugin是VisualVM为SA提供的图形界面插件,可以方便的使用SA的部分封装好的功能。
然后用JDK7来启动一个groovysh,再在VisualVM里通过SAPlugin接进去,可以看到:
SAPlugin还有这样的功能,可以看到被JIT编译过的方法以及解释器的汇编代码:
那SA是不是有内建的反汇编器,可以把任意x86、x64、IA64、SPARC等架构的机器码给反汇编为汇编代码呢?答案是肯定的,有足够方便的现成的API可用。(x64版尚未实现完,暂时还用了)
(顺带提一下:“反汇编”(disassemble)与“反编译”(decompile)是不一样的,请不要弄混了。)
设想有个场景,HotSpot VM突然crash了,并在退出过程中打出了一个hs_err_pidXXXX.log的日志文件。其中开头的部分是:
# # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d9039f1, pid=3628, tid=3664 # # JRE version: 6.0_18-b07 # Java VM: Java HotSpot(TM) Client VM (16.0-b13 mixed mode, sharing windows-x86 ) # Problematic frame: # V [jvm.dll+0x1039f1] # # If you would like to submit a bug report, please visit: # http://java.sun.com/webapps/bugreport/crash.jsp # --------------- T H R E A D --------------- Current thread (0x0084c000): JavaThread "main" [_thread_in_vm, id=3664, stack(0x008e0000,0x00930000)] siginfo: ExceptionCode=0xc0000005, reading address 0x00000008 Registers: EAX=0x00000000, EBX=0x0084c000, ECX=0x00000008, EDX=0x0092e134 ESP=0x0092dbf8, EBP=0x0092dc3c, ESI=0x00000000, EDI=0x0084c8ec EIP=0x6d9039f1, EFLAGS=0x00010246 Top of Stack: (sp=0x0092dbf8) 0x0092dbf8: 0084c110 0092e134 0092e134 0092e134 0x0092dc08: 04506fef 0092dc30 1000781f 00000000 0x0092dc18: 00000001 00000000 0092e054 0084c000 0x0092dc28: 00000000 00000002 0084c110 f910dbcd 0x0092dc38: 0084c000 0084c110 62f01296 0084c8e8 0x0092dc48: 0092e134 62f0f17c 00000049 00000000 0x0092dc58: 00000000 00000000 00000000 00000000 0x0092dc68: 00000000 00000000 00000000 00000000 Instructions: (pc=0x6d9039f1) 0x6d9039e1: 8b f0 eb 07 89 51 08 89 30 8b f0 8b 00 8d 48 08 0x6d9039f1: 8b 01 53 ff 50 2c 8b 43 04 85 c0 0f 85 8f 00 00
可以看到HotSpot遇到了访问异常(EXCEPTION_ACCESS_VIOLATION)。访问异常有很多时候是由本地代码中的空指针访问而引起的,这里是否也是如此呢?
至少得看看出错的指令长啥样吧。可以看到日志里有一块写着“Instructions”,有两行十六进制表示的数据跟在后面。这就是出错位置前后的机器码,其中第二行开头处是出错指令的开头位置。
借助SA里内建的反汇编器,我们可以写段代码来看看日志里出错的机器码到底是什么:
import sun.jvm.hotspot.asm.CPUHelper; import sun.jvm.hotspot.asm.Disassembler; import sun.jvm.hotspot.asm.Instruction; import sun.jvm.hotspot.asm.InstructionVisitor; import sun.jvm.hotspot.asm.SymbolFinder; import sun.jvm.hotspot.asm.x86.X86Helper; /** * @author sajia * */ public class TestX86Disassembler { /** * @param args */ public static void main(String[] args) { CodeSnippet code = makeSampleCode(); CPUHelper cpuHelper = new X86Helper(); Disassembler dasm = cpuHelper.createDisassembler(code.startPc, code.code); StringBuilder buf = new StringBuilder(); dasm.decode(new RawCodeVisitor(buf)); String dasmStr = buf.toString(); System.out.println(dasmStr); } private static CodeSnippet makeSampleCode() { CodeSnippet code = new CodeSnippet(); code.startPc = 0x6d9039f1; code.code = new byte[] { (byte) 0x8b, (byte) 0x01, (byte) 0x53, (byte) 0xff, (byte) 0x50, (byte) 0x2c, (byte) 0x8b, (byte) 0x43, (byte) 0x04, (byte) 0x85, (byte) 0xc0, (byte) 0x0f, (byte) 0x85, (byte) 0x8f, (byte) 0x00, (byte) 0x00 }; return code; } private static class CodeSnippet { long startPc; byte[] code; } private static class RawCodeVisitor implements InstructionVisitor { private final StringBuilder buf; private final SymbolFinder symFinder = new DummySymbolFinder(); public RawCodeVisitor(StringBuilder buf) { this.buf = buf; } @Override public void prologue() { // do nothing } @Override public void visit(long currentPc, Instruction instr) { buf.append("0x") .append(Long.toHexString(currentPc)) .append(": ") .append(instr.asString(currentPc, symFinder)) .append("\n"); } @Override public void epilogue() { // do nothing } } public static class DummySymbolFinder implements SymbolFinder { public String getSymbolFor(long address) { return "0x" + Long.toHexString(address); } } }
确保$JAVA_HOME/lib/sa-jdi.jar在classpath上,运行该程序可以看到输出为:
0x6d9039f1: movl %eax, [%ecx] 0x6d9039f3: pushl %ebx 0x6d9039f4: call 44[%eax] 0x6d9039f7: movl %eax, 4[%ebx] 0x6d9039fa: testl %eax, %eax 0x6d9039fc: jne 0x6d903a91
可以看到在地址0x6d9039f1的指令是mov eax, [ecx],对ECX寄存器有一个间接读访问,而从日志上可以看到此时ECX寄存器的值为0x00000008。在32位Windows XP上0x00000000-0x0000FFFF是保护区域,尝试对该区域读写会引发访问异常。这里程序试图从0x00000008读取一个DWORD赋值给EAX,印证了它是日志中访问异常的事发地。当然,真正导致该问题的代码肯定在更前面的地方,但确认事发地的状况也算是个好的开始。
SA反汇编出来的汇编代码语法既不是AT&T系的(GNU as用这种),也不是Intel系的(MASM、NASM用这种),感觉有那么点怪。
与Intel系的相似点是参数顺序,目标在前,源在后;间接引用以方括号表示。
与AT&T系相似的是寄存器带有%前缀,而且间接引用的偏移量写在括号的前面;指令带有宽度后缀。
总之需要点时间来习惯…
反汇编器这部分的实现与SA的其它相对独立,要抽出来单独用也没什么问题。有需要的话抽个出来改造成纯MASM语法输出或许会有用。
Alright,今天就废话到这里~
评论
18 楼
RednaxelaFX
2014-10-25
Ferdiknight 写道
R大,HSDB有什么命令是可以拿到对应方法的机器码数据的吗,比如某个方法地址是0x35xxxxx,pc=0x2bxxxxx,然后mem 0x35xxxxx size 这个得到的是不是对应这个方法的native code 的内容啊?
看help就知道了。如果你的HSDB正常启动了的话(sa.js正确加载了),那么“dis”命令就是把机器指令反汇编的。它的格式是
dis address [length]
其中address是机器指令的起始地址。length是想反汇编的数据的长度。
你问的问题的话pc那个值才是机器码相关的。
还有个比较新的disassemble命令也行。这个接收的参数是CodeBlob或者nmethod的起始地址。
注意:在JDK-6879063: SA should use hsdis for disassembly之后,SA会用hsdis插件来反汇编,这样只要支持hsdis的平台都能在SA里看反汇编;在它之前SA只能在x86(32位)上反汇编。
17 楼
Ferdiknight
2014-10-24
R大,HSDB有什么命令是可以拿到对应方法的机器码数据的吗,比如某个方法地址是0x35xxxxx,pc=0x2bxxxxx,然后mem 0x35xxxxx size 这个得到的是不是对应这个方法的native code 的内容啊?
16 楼
RednaxelaFX
2014-10-23
Ferdiknight 写道
今天在新机器上搞了个1.3.8,用的jdk7u55 ,为啥只显示oop的地址了,不显示klass的地址了-_- 不幸福,这个是跟saplugin有关,还是跟jdk的sa-jdi.jar有关系啊
跟sa-jdi.jar的实现有关,而跟SAPlugin没关系。JDK7u的SA有些bug使得metadata字段不一定会显示出来。
15 楼
Ferdiknight
2014-10-22
今天在新机器上搞了个1.3.8,用的jdk7u55 ,为啥只显示oop的地址了,不显示klass的地址了-_- 不幸福,这个是跟saplugin有关,还是跟jdk的sa-jdi.jar有关系啊
14 楼
RednaxelaFX
2014-03-19
zking3 写道
R,我晚上下载了好几个版本的VisualVM,然后添加SAPlugin,但是重启后,选项卡那里还是没有,没有那个蓝色的小图标SAPlugin。试了好几个版本都没。
您用的VisualVM是不是很新的,或者说是很新的JDK自带的?
如果是的话,试试用stand-alone的VisualVM。如果不行的话试试1.3.1之前的版本。
13 楼
zking3
2014-03-16
R,我晚上下载了好几个版本的VisualVM,然后添加SAPlugin,但是重启后,选项卡那里还是没有,没有那个蓝色的小图标SAPlugin。试了好几个版本都没。
12 楼
RednaxelaFX
2011-10-29
bluesleaf 写道
撒迦同学,我用的win7,JDK 1.7.0_01,visualvm 1.3.3,jdkhome也指定了,安装完SA插件,程序也是用JDK7跑的,但打开进程就是看不到SA Plugin的tab,visual gc的tab也可以看到,不知道是为啥呢
据说VisualVM 1.3.x都有点诡异?回头我找台Windows的机器来试试
11 楼
bluesleaf
2011-10-29
撒迦同学,我用的win7,JDK 1.7.0_01,visualvm 1.3.3,jdkhome也指定了,安装完SA插件,程序也是用JDK7跑的,但打开进程就是看不到SA Plugin的tab,visual gc的tab也可以看到,不知道是为啥呢
10 楼
igotti
2011-06-16
RednaxelaFX 写道
igotti 写道
哦,话说翻译的有点不给力啊。只能先“读书不求甚解”式的把前6章看一遍。
翻译怎样个不给力法?我没读过中文版的,一直不知道这本的翻译质量如何
没读过英文版,且中文版目前只读了前两章。这只是一种感觉,抑或是这本书本身的难度对阅
读造成的影响。
9 楼
RednaxelaFX
2011-06-16
igotti 写道
哦,话说翻译的有点不给力啊。只能先“读书不求甚解”式的把前6章看一遍。
翻译怎样个不给力法?我没读过中文版的,一直不知道这本的翻译质量如何
8 楼
igotti
2011-06-16
计算机组织与结构相关的内容如果有比较好的基础的话,对理解虚拟机也会有帮助。
毕竟要虚拟机要模拟的东西就是某种体系结构。
不过我觉得读不懂的话完全不需要着急。记得我是08年左右买到的那本书的影印版,前后已经读了很多遍了,花了颇长时间才渐渐觉得里面的内容变得易懂了。
哦,话说翻译的有点不给力啊。只能先“读书不求甚解”式的把前6章看一遍。
毕竟要虚拟机要模拟的东西就是某种体系结构。
不过我觉得读不懂的话完全不需要着急。记得我是08年左右买到的那本书的影印版,前后已经读了很多遍了,花了颇长时间才渐渐觉得里面的内容变得易懂了。
哦,话说翻译的有点不给力啊。只能先“读书不求甚解”式的把前6章看一遍。
7 楼
RednaxelaFX
2011-06-16
igotti 写道
最近在读虚拟机:系统与进程的通用平台,发现很多知识点对我来说比较朦胧,好想知道,但是又不能全然领悟书中的观点。是不是知识储备不够?需要补充哪方面的知识?
计算机组织与结构相关的内容如果有比较好的基础的话,对理解虚拟机也会有帮助。
毕竟要虚拟机要模拟的东西就是某种体系结构。
不过我觉得读不懂的话完全不需要着急。记得我是08年左右买到的那本书的影印版,前后已经读了很多遍了,花了颇长时间才渐渐觉得里面的内容变得易懂了。
6 楼
igotti
2011-06-16
RednaxelaFX 写道
igotti 写道
为什么安装saplugin的时候提示实用程序 API 版本 太低。 我是用jdkhome选项启动的visualvm。
你用的JDK版本是什么?这篇的开头就写了在Windows上的话一定要用JDK7才行。我的建议是安装一个新版本的JDK7,并且去下载一个单独的VisualVM(因为现在JDK7里的VisualVM有点小问题所以去下单独的版本吧)。
哦,正在下载visualvm。
那啥顺道再问个问题:
最近在读虚拟机:系统与进程的通用平台,发现很多知识点对我来说比较朦胧,好想知道,但是又不能全然领悟书中的观点。是不是知识储备不够?需要补充哪方面的知识?
5 楼
RednaxelaFX
2011-06-16
igotti 写道
为什么安装saplugin的时候提示实用程序 API 版本 太低。 我是用jdkhome选项启动的visualvm。
你用的JDK版本是什么?这篇的开头就写了在Windows上的话一定要用JDK7才行。我的建议是安装一个新版本的JDK7,并且去下载一个单独的VisualVM(因为现在JDK7里的VisualVM有点小问题所以去下单独的版本吧)。
4 楼
igotti
2011-06-16
为什么安装saplugin的时候提示实用程序 API 版本 太低。 我是用jdkhome选项启动的visualvm。
3 楼
lwwin
2010-09-14
好吧- -其实想着反得- -打字就偏偏少了一个字……
2 楼
RednaxelaFX
2010-08-04
lwwin 写道
就是可以用它汇编- -?水水没怎么用过GNU系列的,那种符号感觉更贴近GNU的=0=!
是用它“反汇编”,不是“汇编”……这玩儿只能从机器码转换到汇编,没法从汇编转换到机器码啦。
1 楼
lwwin
2010-08-04
就是可以用它汇编- -?水水没怎么用过GNU系列的,那种符号感觉更贴近GNU的=0=!
一时间前面几个名字没看懂……
一时间前面几个名字没看懂……
发表评论
-
The Prehistory of Java, HotSpot and Train
2014-06-02 08:18 0http://cs.gmu.edu/cne/itcore/vi ... -
MSJVM and Sun 1.0.x/1.1.x
2014-05-20 18:50 0当年的survey paper: http://www.sym ... -
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
class data sharing by Apple
2014-03-28 05:17 0class data sharing is implement ... -
Java 8与静态工具类
2014-03-19 08:43 16276以前要在Java里实现所谓“静态工具类”(static uti ... -
Java 8的default method与method resolution
2014-03-19 02:23 10453先看看下面这个代码例子, interface IFoo { ... -
HotSpot Server VM与Server Class Machine
2014-02-18 13:21 0HotSpot VM历来有Client VM与Server V ... -
Java 8的lambda表达式在OpenJDK8中的实现
2014-02-04 12:08 0三月份JDK8就要发布首发了,现在JDK8 release c ... -
GC stack map与deopt stack map的异同
2014-01-08 09:56 0两者之间不并存在包含关系。它们有交集,但也各自有特别的地方。 ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
基于LLVM实现VM的JIT的一些痛点
2014-01-07 17:25 0同事Philip Reames Sanjoy Das http ... -
tailcall notes
2013-12-27 07:42 0http://blogs.msdn.com/b/clrcode ... -
《自制编程语言》的一些笔记
2013-11-24 00:20 0http://kmaebashi.com/programmer ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22395(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局 (0): 拿在手上的是什么
2013-11-04 18:22 21493(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对C语义的for循环的基本代码生成模式
2013-10-19 23:12 21874之前有同学在做龙书(第二版)题目,做到8.4的练习,跟我对答案 ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ...
相关推荐
本文将深入探讨HSDis工具、HotSpot虚拟机以及反汇编在JVM中的应用。 HSDis全称为HotSpot Disassembler,是一个二进制转汇编的工具。它能够将JIT编译后的机器码转换为可读的汇编代码,这对于分析和调试JVM内部行为...
hsdis-amd64.dll是一款用于Java HotSpot虚拟机(JVM)的反汇编插件,主要用于帮助开发者查看和理解Java字节码在实际执行时如何被转换为机器码的过程。这款插件是开源的,并且是Java开发工具集(JDK)的一部分,对于...
HSDis全称为HotSpot Disassembler,是由Sun Microsystems开发的用于解析Java字节码并将其转化为可读的汇编代码的工具。这款插件主要适用于32位和64位的JVM环境,例如在描述中提到的路径"\Java\jdk1.8.0_141\jre\bin\...
6. **性能监控和调试工具**:书中可能包含如何使用JVisualVM、JConsole、JFR(Java Flight Recorder)和JMC(Java Mission Control)等工具来监控和诊断HotSpot虚拟机的状态。 7. **并行与并发**:HotSpot虚拟机...
1. 解释器:Hotspot VM最初使用解释器来执行字节码,这是一种快速启动但执行速度相对较慢的方式。 2. 编译器:随着程序的运行,Hotspot VM会识别出执行频率高的“热点”代码,并使用Just-In-Time (JIT) 编译器将其...
深入解析hotspot实战!内容比较翔实、精辟,值得收藏!
6. **编译和优化策略**:Hotspot使用复杂的优化技术,如逃逸分析、标量替换、循环展开等,来提升代码性能。此外,它还有一套动态适应性优化系统,可以根据运行时数据调整优化级别。 深入理解Hotspot源码,有助于...
- 动态编译:HotSpot采用了一种名为C1(Client Compiler)和C2(Server Compiler)的即时编译器来实现动态编译功能。 - 内存管理:HotSpot支持分代垃圾回收机制,能够有效管理内存空间。 - 安全性:提供强大的类...
HotSpot实战
本书深入浅出地讲解了 HotSpot 虚拟机的工作原理,将隐藏在它内部的本质内容逐一呈现在读者面前,包 括 OpenJDK 与 HotSpot 项目、编译和调试 HotSpot 的方法、HotSpot 内核结构、Launcher、OOP-Klass 对象表 示系统...
《深入剖析JDK8 Hotspot源码》 Hotspot是Oracle JDK中的一个关键组件,它是一款高效的Java虚拟机(JVM)。JDK8u-hotspot源码提供了对Hotspot内部工作原理的深入了解,这对于Java开发者优化性能、调试问题以及理解...
对于Java开发者来说,深入理解HotSpot源码能够帮助他们更好地理解和优化Java应用程序,因为这涉及到JVM如何处理内存管理、垃圾回收、类加载、线程调度等关键操作。 在Java世界中,JVM扮演着至关重要的角色,它是...
Sun 公司不断通过制定各种工业标准和内部标准来提升 HotSpot 虚拟机的执行性能,这些改进适用于客户端和服务器端的 Java 虚拟机环境。 Java SE 平台包含了两种 HotSpot 虚拟机实现: 1. **Java HotSpot 客户端...
1. **热管理**:通过准确预测温度分布,Hotspot 可以帮助设计人员采取有效措施来降低芯片内部的热点温度,从而提高系统的稳定性和可靠性。 2. **能效优化**:通过对功耗的细致分析,设计者可以调整电路设计,以达到...
总的来说,JDK 1.8是一个具有里程碑意义的版本,它的特性如Lambda表达式、Stream API、日期和时间API的改进以及HotSpot虚拟机的优化,都极大地推动了Java语言的发展,提升了开发者的生产力。对于Java开发者来说,...
学习Hotspot源码对于开发者来说,不仅可以深入了解Java运行机制,还能提升性能调优的能力。源码分析有助于开发者掌握如何在实际项目中优化代码,提高应用的运行效率。 【标签】"Hotspot 虚拟机"明确了这个压缩包的...
总的来说,Hotspot 1.6源代码的学习将帮助我们深入了解Java运行时环境的内部工作机制,提高程序设计和优化的水平。通过对这些源代码的深度阅读和分析,开发者可以更好地应对性能挑战,创造出更高效、更稳定的Java...
本书针对HotSpot JVM的内部工作原理、性能调优和相关技术进行了详尽的解析,对于Java开发者和性能优化工程师来说,是一份非常宝贵的参考资料。 首先,我们要理解HotSpot的基本概念。HotSpot JVM的主要目标是提高...
此外,还特别提到了逆向工程、反汇编或反编译软件的行为受到法律限制,除非法律明确规定为了兼容性目的可以这样做。这表明了Oracle对于知识产权保护的态度和立场。 #### 三、面向对象 本指南主要面向以下几类人群...
【热区关联规则】是一种数据挖掘技术,主要应用于发现数据集中不同变量之间的有趣关系,比如在超市购物...在实际项目中,结合具体业务需求,调整算法参数,优化数据处理流程,就能有效利用这个工具来挖掘有价值的信息。