Java千百问_02基本使用(015)_java如何通过汇编方式运行

点击进入_更多_Java千百问-基本使用

1、java如何通过汇编方式运行

java本身不能通过汇编方式运行。但是,我们可以通过某些插件,在运行中将java代码解释为汇编指令,让我们能够通过分析执行的汇编指令来查找一些问题,也可以帮助我们分析和理解JVM是如何解释和编译的(当然java本身的编译和运行和汇编无关)。

PrintAssembly是JVM的一个运行参数,它允许我们获取在控制台打印java代码翻译成的汇编指令。使用PrintAssembly需要一些插件的支持,这些并不是JVM直接提供的,Kenai项目则提供了可用的插件(下载 https://kenai.com/projects/base-hsdis/downloads )。根据不同的环境下在对应的指令集。本人是mac系统,所以下载了hsdis-amd64.dylib。

下载后需要将hsdis-amd64.dylib放在$JAVA_PATH/jre/lib/server/中,与libjvm.dylib同目录。

之后我们就可以通过指定运行参数来运行我们的代码:

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly TestHsdis

例子:

public class TestHsdis {

    public static void main(String[] args) {
        System.out.println("1");
    }
}

编译运行时加入-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly,结果如下:

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

Loaded disassembler from /Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/jre/lib/server/hsdis-amd64.dylib

Decoding compiled method 0x000000010b4fd710:

Code:

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

[Entry Point]

[Constants]

# {method} {0x000000011f270fc8} ‘hashCode‘ ‘()I‘ in ‘java/lang/String‘

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

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

0x000000010b4fd884: shl $0x3,%r10

0x000000010b4fd888: cmp %rax,%r10

0x000000010b4fd88b: jne 0x000000010b445e20 ; {runtime_call}

0x000000010b4fd891: data32 data32 nopw 0x0(%rax,%rax,1)

0x000000010b4fd89c: data32 data32 xchg %ax,%ax

....

2、PrintAssembly is disabled是什么原因

我们在加入参数-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly运行时,可能会报如下错误:

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

Could not load hsdis-amd64.dylib; library not loadable; PrintAssembly is disabled

原因是对应的hsdis-amd64插件没有放入指定路径,导致运行时无法加载。我们一定要将hsdis-amd64.dylib放在$JAVA_PATH/jre/lib/server/中,与libjvm.dylib同目录(mac系统,如果是linux放在与libjvm.so同目录)。

时间: 2024-10-09 13:44:43

Java千百问_02基本使用(015)_java如何通过汇编方式运行的相关文章

Java千百问_02基本使用(014)_mac系统如何管理环境变量

点击进入_更多_Java千百问-基本使用 1.mac系统如何管理环境变量 mac系统中管理环境变量包括系统级和用户级,系统级的环境变量是每个登录到系统的用户都要读取的系统变量,而用户级的环境变量则是该用户使用系统时加载的环境变量.具体配置方法如下: 系统级 通过修改./etc/profile文件来配置,全局(公有)配置,不管是哪个用户,登录时都会读取该文件.不建议修改这个文件. 用户级 ./etc/bashrc,全局(公有)配置,bash shell执行时,不管是何种方式,都会读取此文件. .b

Java千百问_02基本使用(009)_eclipse如何设置BuildPath

点击进入_更多_Java千百问 1.eclipse如何设置BuildPath 我们知道运行java应用需要依赖jre以及程序中使用的第三方jar包,我们使用java命令运行时,一般会手工指定-classpath(默认为操作系统的CLASSPATH环境变量),eclipse提供了方便的引入功能,针对不同工程可以选择加载不同的classpath. 了解java如何运行看这里:[java程序如何运行][2] [2]: 具体配置方法如下: 右击工程–>Preferences–>Java Build P

Java千百问_02基本使用(013)_linux系统如何管理环境变量

点击进入_更多_Java千百问 1.linux系统如何管理环境变量 我们都知道windows的环境变量的配置已经完全被图形化了,我们可以在我的电脑的属性中简单的进行配置,那么对于linux这样没有图形化配置的操作系统应该如何配置呢?我们具体来看: linux中环境变量包括系统级和用户级,系统级的环境变量是每个登录到系统的用户都要读取的系统变量,而用户级的环境变量则是该用户使用系统时加载的环境变量.具体配置方法如下: 系统级 通过修改/etc/profile./etc/environment文件配

Java千百问_02基本使用(010)_java、javax、sun、org包有什么区别

点击进入_更多_Java千百问 1.java.javax.sun.org包有什么区别 java.javax.org.sun包都是jdk提供的类包,且都是在rt.jar中.rt.jar是JAVA基础类库(java核心框架中很重要的包),包含lang在内的大部分功能,而且rt.jar默认就在根classloader的加载路径里面,所以放在classpath是多此一举 .他们之间的区别具体如下: 了解java核心框架看这里:java核心框架是什么样的 java.* java SE的标准库,是java标

Java千百问_02基本使用(008)_eclipse如何关闭代码验证

点击进入_更多_Java千百问 1.eclipse如何关闭代码验证 我们知道eclipse会在编译时对java代码.文本.标记文本等等进行验证,但是,这个过程在文件多的时候非常缓慢,通常会影响我们的开发效率.这里我们介绍一下如何选择性关闭这个功能. 选择性关闭: 具体方法:windows–>Preferences–>Validation 在下面有一个列表,可以根据自己需要选择关闭验证功能(选中状态是需要验证).当然这里还可以自定义验证规则.其中: "Build"列是指文件在

Java千百问_02基本使用(012)_如何编写非阻塞SocketChannel程序

点击进入_更多_Java千百问 1.如何编写非阻塞SocketChannel程序 了解Socket看这里:Socket是什么 了解 SocketChannel看这里:Socket.SocketChannel有什么区别 使用SocketChannel的最大好处就是可以进行非阻塞IO,每次链接后都会直接返回,不会阻塞线程.将需要多个线程的任务通过几个线程就能完成,降低了了性能消耗. 了解阻塞.非阻塞看这里:阻塞.非阻塞有什么区别 要编写SocketChannel,需要了解java.nio包中如下几个

Java千百问_02基本使用(011)_如何编写单线程Socket程序

点击进入_更多_Java千百问 1.如何编写单线程Socket程序 了解Socket看这里:Socket是什么 编写Socket最简单的就是单线程的Socket,但基本上是没有实用意义的,因为在实际的应用中基本上是不止于一个Client的.一般都是多线程Socket程序. 了解多线程Socket看这里:[如何编写多线程Socket程序][3] [3]: 要编写Socket,需要了解java.net包中提供了两个类Socket和ServerSocket,他们分别用来表示Socket的客户端和服务端

Java千百问_02基本使用(006)_eclipse如何保存时格式化

点击进入_更多_Java千百问 1.eclipse如何打开保存时格式化 我们都知道,为了让代码可读性更高,eclipse提供了代码格式化的功能,一般指定了对应format文件(eclipse会默认自带)后,通过快捷键Ctrl+Shift+F来进行格式化. 然而,很多时候并不方便,而且在修改完代码后容易忘记.其实还有一种更好的方法:保存时自动格式化.每次保存都会自动格式化,十分方便. 方法如下: 具体方法:windows–>Preferences–>Java –> Editor–>S

Java千百问_02基本使用(012)_如何编写多线程Socket程序

点击进入_更多_Java千百问 1.如何编写多线程Socket程序 了解Socket看这里:Socket是什么 多线程Socket与单线程类似,只是使用了多线程的方式来管理连接,主线程负责接收连接,在接到连接后变创建新的线程,每个线程负责与自己的客户端进行通信. 了解单线程Socket看这里:如何编写单多线程Socket程序 与单线程Socket例子相比来说,服务端可以与多个客户端进行通信了,不过多线程频繁的创建与销毁便会带来很大的资源开销,而系统的网络资源等都是有限的.因此一般会引入线程池,可