精华内容
下载资源
问答
  • Java HotSpot(TM) 64-Bit Server VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional outputLoaded disassembler from /var/software/java/jdk1.8.0_151/jre/lib/amd64/hsdis...

    Java HotSpot(TM) 64-Bit Server VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional output

    Loaded disassembler from /var/software/java/jdk1.8.0_151/jre/lib/amd64/hsdis-amd64.so

    Decoding compiled method 0x00007f56f9102150:

    Code:

    Argument 0 is unknown.RIP: 0x7f56f91022a0 Code size: 0x00000110

    [Disassembling for mach='amd64']

    [Entry Point]

    [Constants]

    # {method} {0x00007f56f3211c38} 'getSnapshotTransformerList' '()[Lsun/instrument/TransformerManager$TransformerInfo;' in 'sun/instrument/TransformerManager'

    # [sp+0x40] (sp of caller)

    0x00007f56f91022a0: mov 0x8(%rsi),%r10d

    0x00007f56f91022a4: shl $0x3,%r10

    0x00007f56f91022a8: cmp %rax,%r10

    0x00007f56f91022ab: jne 0x7f56f9045e20 ; {runtime_call}

    0x00007f56f91022b1: nopw 0x0(%rax,%rax)

    0x00007f56f91022bc: nop

    [Verified Entry Point]

    0x00007f56f91022c0: mov %eax,0xfffffffffffec000(%rsp)

    0x00007f56f91022c7: push %rbp

    0x00007f56f91022c8: sub $0x30,%rsp ;*aload_0

    ; - sun.instrument.TransformerManager::getSnapshotTransformerList@0 (line 166)

    0x00007f56f91022cc: mov 0x10(%rsi),%eax

    0x00007f56f91022cf: shl $0x3,%rax ;*getfield mTransformerList

    ; - sun.instrument.TransformerManager::getSnapshotTransformerList@1 (line 166)

    0x00007f56f91022d3: add $0x30,%rsp

    0x00007f56f91022d7: pop %rbp

    0x00007f56f91022d8: test %eax,0x16e0ee22(%rip) ; {poll_return}

    0x00007f56f91022de: retq

    0x00007f56f91022df: nop

    0x00007f56f91022e0: nop

    0x00007f56f91022e1: mov 0x2a8(%r15),%rax

    0x00007f56f91022e8: movabs $0x0,%r10

    0x00007f56f91022f2: mov %r10,0x2a8(%r15)

    0x00007f56f91022f9: movabs $0x0,%r10

    0x00007f56f9102303: mov %r10,0x2b0(%r15)

    0x00007f56f910230a: add $0x30,%rsp

    0x00007f56f910230e: pop %rbp

    0x00007f56f910230f: jmpq 0x7f56f906e2e0 ; {runtime_call}

    0x00007f56f9102314: hlt

    0x00007f56f9102315: hlt

    0x00007f56f9102316: hlt

    0x00007f56f9102317: hlt

    0x00007f56f9102318: hlt

    0x00007f56f9102319: hlt

    0x00007f56f910231a: hlt

    0x00007f56f910231b: hlt

    0x00007f56f910231c: hlt

    0x00007f56f910231d: hlt

    0x00007f56f910231e: hlt

    0x00007f56f910231f: hlt

    [Exception Handler]

    [Stub Code]

    0x00007f56f9102320: callq 0x7f56f90fd660 ; {no_reloc}

    0x00007f56f9102325: mov %rsp,0xffffffffffffffd8(%rsp)

    0x00007f56f910232a: sub $0x80,%rsp

    0x00007f56f9102331: mov %rax,0x78(%rsp)

    0x00007f56f9102336: mov %rcx,0x70(%rsp)

    0x00007f56f910233b: mov %rdx,0x68(%rsp)

    0x00007f56f9102340: mov %rbx,0x60(%rsp)

    0x00007f56f9102345: mov %rbp,0x50(%rsp)

    0x00007f56f910234a: mov %rsi,0x48(%rsp)

    0x00007f56f910234f: mov %rdi,0x40(%rsp)

    0x00007f56f9102354: mov %r8,0x38(%rsp)

    0x00007f56f9102359: mov %r9,0x30(%rsp)

    0x00007f56f910235e: mov %r10,0x28(%rsp)

    0x00007f56f9102363: mov %r11,0x20(%rsp)

    0x00007f56f9102368: mov %r12,0x18(%rsp)

    0x00007f56f910236d: mov %r13,0x10(%rsp)

    0x00007f56f9102372: mov %r14,0x8(%rsp)

    0x00007f56f9102377: mov %r15,(%rsp)

    0x00007f56f910237b: movabs $0x7f570ee0a316,%rdi ; {external_word}

    0x00007f56f9102385: movabs $0x7f56f9102325,%rsi ; {internal_word}

    0x00007f56f910238f: mov %rsp,%rdx

    0x00007f56f9102392: and $0xfffffffffffffff0,%rsp

    0x00007f56f9102396: callq 0x7f570eb35d80 ; {runtime_call}

    0x00007f56f910239b: hlt

    展开全文
  • 文章目录测试环境下载文件安装IDEA应用...将其放在配置好的环境变量JAVA_HOME对应的JAVA_HOME\jre\bin\server中。 IDEA应用 在指定的类中运行前增加下列配置: -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly

    测试环境

    Windows 10

    下载文件

    首先需要下载一个hsdis的工具。下载链接如下所示:

    https://download.csdn.net/download/qq_38322527/21512291

    安装

    解压下载好的.zip文件,根据系统版本32位/64位,选择对应的hsdis-amd64.dll文件。

    将其放在配置好的环境变量JAVA_HOME对应的JAVA_HOME\jre\bin\server中。
    在这里插入图片描述
    在这里插入图片描述

    IDEA应用

    在指定的类中运行前增加下列配置:

    -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly

    如果查看大致的,可以使用下列配置:
    >-server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly,*Jmm03_CodeVisibility.refresh -Djava.compiler=NONE

    在这里插入图片描述
    然后applay - > ok操作后,直接运行程序即可!

    运行效果

    在这里插入图片描述

    展开全文
  • Java代码汇编细节

    2021-03-26 12:33:45
    1.准备工作HSDIS是一份Sun官方推荐的HotSpot VM JIT编译代码的反汇编插件,它包含在...它的作用是让HotSpot的-XX:+PrintAssembly指令调用它来把动态生成的本地代码还原为汇编代码输出,同时还生成了大量非常有...

    2fdcc75eeeb0c8fcc46132fa9f53b255.png

    1.准备工作

    HSDIS是一份Sun官方推荐的HotSpot VM JIT编译代码的反汇编插件,它包含在HotSpot VM的源码之中,在Project Kenai(http://kenai.com/projects/base-hsdis)也可以下载到单独的源码。它的作用是让HotSpot的-XX:+PrintAssembly指令调用它来把动态生成的本地代码还原为汇编代码输出,同时还生成了大量非常有价值的注释,这样我们就可以通过输出的代码来分析问题。

    读者可以根据自己的操作系统和CPU类型从Kenai的网站上下载编译好的插件,直接放到JDK_HOME/jre/bin/client和JDK_HOME/jre/bin/server目录中即可。如果没有找到所需操作系统 (譬如Windows的就没有)的成品,那就得自己拿源码编译一下,或者去HLLVM圈子(http://hllvm.group.iteye.com/)中下载也可以。

    如果你使用的是Debug或者FastDebug版的HotSpot,那可以直接通过-XX:+PrintAssembly指令使用的插件; 如果你使用的是Product版的HotSpot,那还要额外加入一个-XX:+UnlockDiagnosticVMOptions参数。

    我使用的Java版本是:

    E:dataak>java -version

    java version "1.7.0_06"

    Java(TM) SE Runtime Environment (build 1.7.0_06-b24)

    Java HotSpot(TM) Client VM (build 23.2-b09, mixed mode, sharing)

    2.案例分析

    第一个案例的问题是“在Java虚拟机规范中把虚拟机内存划分为Java Heap、Java VM Stack、Method Area等多个运行时区域,那当ByteCode编译为Native Code后,Java堆、栈、方法区还是原来那个吗?在Java堆、栈、方法区中的数据是如何访问的?”

    我们通过下面这段简单代码的实验来回答这个问题:

    public class Bar {

    int a = 1;

    static int b = 2;

    public int sum(int c) {

    return a + b + c;

    }

    public static void main(String[] args) {

    new Bar().sum(3);

    }

    }

    代码很简单,sum()方法使用到3个变量a、b、c,按照概念模型中的划分,其中a是实例变量,来自Java Heap,b是类变量,来自Method Area,c是参数,来自VM Stack。那我们来看看JIT之后,它们是怎么访问的。使用下面命令来执行上述代码:

    java -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -Xcomp -XX:CompileCommand=dontinline,*Bar.sum -XX:CompileCommand=compileonly,*Bar.sum Bar

    其中,参数-Xcomp是让虚拟机以编译模式执行代码,这样代码可以偷懒,不需要执行足够次数来预热都能触发JIT编译。两个 -XX:CompileCommand意思是让编译器不要内联sum()并且只编译sum(),-XX:+PrintAssembly就是输出反汇编内 容。如果一切顺利的话,屏幕上出现类似下面的内容:

    1089762783.png

    整个JAVA文件汇编后的完整代码我放gist上了,地址如下:

    3.解读

    代码并不多,一句一句来看:

    1.    mov %eax,-0x4000(%esp):检查栈溢。

    2.    push %ebp:保存上一栈帧基址。

    3.    sub $0x18,%esp:给新帧分配空间。

    4.    mov 0x8(%ecx),%eax:取实例变量a,这里0x8(%ecx)就是ecx+0x8的意思,前面“[Constants]”节中提示了 “this:ecx = "test/Bar"”,即ecx寄存器中放的就是this对象的地址。偏移0x8是越过this对象的对象头,之后就是实例变量a的内存位置。这次是访 问“Java堆”中的数据。

    5.    mov $0x239ae978,%esi:取test.Bar在方法区的指针。

    6.    mov 0x70(%esi),%esi:取类变量b,这次是访问“方法区”中的数据。

    7.    add %esi,%eax 、add %edx,%eax:做2次加法,求a+b+c的值,前面的代码把a放在eax中,把b放在esi中,而c在[Constants]中提示了,“parm0:edx = int”,说明c在edx中。

    8.    add $0x18,%esp:撤销栈帧。

    9.    pop %ebp:恢复上一栈帧。

    10.    test %eax,0x120100:轮询方法返回处的SafePoint

    11.    ret:方法返回。

    从汇编代码中可见,访问Java堆、栈和方法区中的数据,都是直接访问某个内存地址或者寄存器,之间并没有看见有什么隔阂。HotSpot虚拟机本身 是一个运行在物理机器上的程序,Java堆、栈、方法区都在Java虚拟机进程的内存中分配。在JIT编译之后,Native Code面向的是HotSpot这个进程的内存,说变量a还在Java Heap中,应当理解为a的位置还在原来的那个内存位置上,但是Native Code是不理会Java Heap之类的概念的,因为那并不是同一个层次的概念。

    附:此文只是最简单的讲解,文章内容来自Iteye上LLVM圈子的讨论,如果需要更多的信息,可以参考此文:使用IdealGraphVisualizer观察HotSpot Server Compiler编译过程的一个例子,注意,如果想比较方便的看到汇编代码,最好使用fastDebug版本的JDK,而不是正式版。

    如图所示:

    1075386354.png

    idealgraphvisualizer显示了JAVA从语法解析到最终生成本地代码的完整过程

    另有以下地址可参考:https://wikis.oracle.com/display/HotSpotInternals/PrintAssembly

    http://ssw.jku.at/General/Staff/TW/igv.html

    展开全文
  • 第一步:下载hsdis 第二步:将hsdis-amd64.dll存放到..\jdk1.8.0_171\jre\bin\server目录下 将hsdis-amd65.dll和hsdis-i386.... - java.lang.String::hashCode@6 (line 1467) 这样就能看到java文件编译后的汇编代码

    第一步:下载hsdis

    第二步:将hsdis-amd64.dll存放到..\jdk1.8.0_171\jre\bin\server目录下

    将hsdis-amd65.dll和hsdis-i386.dll存放到\jre1.8.0_171\bin\server目录下

    第三步:打开IDEA,run>>Edit Configurations

    d0066824a0e3450d8a4fd648970f3311.jpg

    第四步:在VM options里输入下面的指令

    -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:+PrintCompilation

    0f978a1be75542bdb9867c248acc41f3.jpg

    第五步: 运行程序。下面只贴出了部分代码。

    164 1 4 java.lang.String::hashCode (55 bytes)

    Loaded disassembler from C:\Program Files\Java\jdk1.8.0_171\jre\bin\server\hsdis-amd64.dll

    Decoding compiled method 0x00000000038c07d0:

    Code:

    [Disassembling for mach='i386:x86-64']

    [Entry Point]

    [Constants]

    # {method} {0x000000001c5e4fc0} 'hashCode' '()I' in 'java/lang/String'

    # [sp+0x30] (sp of caller)

    0x00000000038c0900: mov 0x8(%rdx),%r10d

    0x00000000038c0904: shl $0x3,%r10

    0x00000000038c0908: cmp %r10,%rax

    0x00000000038c090b: jne 0x0000000003895f60 ; {runtime_call}

    0x00000000038c0911: data16 xchg %ax,%ax

    0x00000000038c0914: nopl 0x0(%rax,%rax,1)

    0x00000000038c091c: data16 data16 xchg %ax,%ax

    [Verified Entry Point]

    0x00000000038c0920: mov %eax,-0x6000(%rsp)

    0x00000000038c0927: push %rbp

    0x00000000038c0928: sub $0x20,%rsp ;*synchronization entry

    ; - java.lang.String::hashCode@-1 (line 1466)

    0x00000000038c092c: mov %rdx,%rbx

    0x00000000038c092f: mov 0x10(%rdx),%eax ;*getfield hash

    ; - java.lang.String::hashCode@1 (line 1466)

    0x00000000038c0932: test %eax,%eax

    0x00000000038c0934: jne 0x00000000038c0a25 ;*ifne

    ; - java.lang.String::hashCode@6 (line 1467)

    这样就能看到java文件编译后的汇编代码。

    展开全文
  • 普通的Java代码执行,无法看到汇编指令,若要查看,需要下载hsdis动态链接库。一般网上介绍的都是mac下的hsdis.dylib,这里介绍是win10下的dll。 这个工具需要放在jdk安装目录下的jre/bin目录下。 ...
  • 查看Java代码对应的汇编指令又一利器,JITWatch纠错13 May 2015接着上一篇文章查看Java代码对应的汇编指令利器,hsdis。JITWatch提供了更好的显示方式,还有各种图表,称得上又一利器。github地址:JITWatchgit ...
  • 1.首先下载hsdis-amd64.dll文件 ... 2.解压放到java11\bin\...3.准备一段Java代码 public class Visibility { private static volatile boolean flag = true; public static void main(String[] args) throws Inte
  • 我们知道一个Java类要想被Java虚拟机加载,必须先生成相应的二进制文件,即class文件,而一个方法或一段代码在运行期要么被解释执行,要么被编译器编译成汇编码,编译执行,那如何去查看这些转换后的代码呢?...
  • } 查看汇编步骤: step0 在一行上设置断点,鼠标挪到最左边 竖着的条条 处,点击一下即可设置断点 step1 按F5或者 调试->开始调试 step1 show: step2: 点击 调试->窗口->反汇编 step2 show: 这个就是C语言对应的...
  • JAVA 汇编语言查看

    2021-03-06 01:10:51
    Java性能优化权威指南-读书笔记(三)-JVM性能调优-内存占用新生代.老年代.永久代的概念不多说,这三个空间中任何一个不能满足内存分配请求时,就会发生垃圾收集. 新生代不满足内存分配请求时,发生Minor GC,老年代.永久...
  • GCC生成的汇编代码

    2021-04-17 08:59:52
    }这是用echo命令输入源码的效果,简单的就是最好的:)一、查看GCC生成的汇编代码在命令行上用“-S”选项,就能看到C编译器产生的汇编代码:#gcc -S code.c注意:这里是大写的-S,如果用小写g...
  • 小编典典Java使用字节码。最相似的是javap,每个链接的Oracle文档,该 javap的 命令拆卸一个或多个类文件。其输出取决于所使用的选项。package com.stackoverflow;class Main {public static void main(String[] ...
  • Java汇编语言么

    千次阅读 2021-02-12 17:27:58
    本篇文章将解决你的疑惑,让你明白Java与...汇编语言是将由0、1组成的机器语言用具有简单语义的英文代码表示,以便于理解和程序员编程。汇编语言通常用于对硬件的直接操控。由于汇编语言编写的程序很小,所以通常在...
  • 如果这是真的那么JIT和我的解释器的最终结果应该是相同的汇编指令,此时我不明白为什么我需要我的/usr/bin/java解释器.如果我的陈述有任何错误,请更正.解决方法:Java字节码是一种相当高级的语言,与汇编指令的关系远...
  • wh_651x-s_69732783.jpg (165.51 KB, 下载次数: 0)2020-11-3 14:16 上传当我们在研究java的内部实现时,经常会需要查看java方法的字节码,有时为了确定一些问题,甚至还需要查看某些方法在jit编译后的汇编代码。...
  • IDEA--java打印汇编信息javap -cIDEA--java打印汇编信息javap -c在IDEA 上如何打印汇编信息:==>==>==>==>==>==>==>==> 结束如何使用:1. 找到你需要编译的类:待运行的代码:public class ...
  • 202\jre\bin\server 注意 提示汇编代码在控制台的量会比较大,如果需要全部的输出日志,可以在idea上的File —》Settings —》 Editor —》 General —》 Console去设置调大控制台打印缓存,就可以全部打印日志到...
  • java汇编 | 学步园

    2021-03-10 07:15:38
    本文通过介绍用Javap反汇编帮你理解Java特性,使用 Javap 深入查看类文件。Java开发人员熟悉在一个循环中使用StringBuffer 来代替串联 String对象能获得最佳性能。然而,多数开发人员从来没有比较两种方法产生的字节...
  • 查看JIT工作情况publicclassVolatileBarrierExample{longa;volatilelongv1=1;volatilelongv2=1;voidreadAndWrite(){longj=v1;longi=v2;a=i+j;v1=i+1;longv=v1;v2=j*2;}publicstaticvoidmain(String[]args)...
  • 一、Linux 环境:Linux localhost 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86...从如下地址下载 hsdis-amd64.so 文件并拷贝到路径{JAVA_HOME}/jre/lib/amd64/server 下。http://...
  • 先吐槽几句:总是有人说,门门通不如一门精。也不知道,这话到底是不是真的如其所言,感觉自己就像武侠里习武的少年,总想把世界上所有的武学全部学会,到最后却...Java?拉倒吧,这么多的类库、函数。C#? 你在开玩笑...
  • 在寻找源代码,字节码,汇编代码,机器代码,编译器,链接器,解释器,汇编器以及所有其他含义之间的各种差异时,我仅对字节码和汇编代码之间的差异感到困惑。特别是,这篇维基百科文章中描述CIL的介绍使我感到困惑...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼importjava.util.Scanner;publicclassLab1{publicstaticvoidmain(Stringarg[]){inta,i,j,n;booleanflag=true;Scannerinput=newScanner(System.in);System.out.printf(...
  • 查看Java汇编指令

    2021-03-11 14:31:04
    如通过下面的命令:javap -c Xxxx.class而有时候想看某些JDK底层实现,发现反编译得到的代码并没有什么帮助,因此本文介绍如何查看Java汇编指令,查看Java代码最真实的运行细节。Java本身提供这个支持,但需要引入...
  • 汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。 在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)...
  • 使用 Hsdis 执行代码,输出反汇编内容 javac Test.java java -server -XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+PrintAssembly -XX:+LogCompilation -XX:LogFile=live.log Test # A是java文件...
  • 不想废话,直接上代码TestJavap.javapublic class TestJavap {public static void main(String[] args){int i = 0;i = i++;System.out.println(i);}}编译> javac TestJavap.java得到 TestJavap.classpublic class...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 85,923
精华内容 34,369
关键字:

java查看汇编代码

java 订阅