在Windows上运行-XX:CompileCommand

HotSpot JVM提供了几个与即时 ( JIT )编译有关的命令行参数。 在本文中,我介绍了开始应用命令行标志-XX:CompileCommand所需的步骤,以查看对单个方法执行的即时编译。

JIT概述

Nikita Salnikov-Tarnovski的博客文章您是否能及时编译? 很好地概述了JIT编译器以及为什么需要它。 以下是该描述的摘录:


欢迎–热点。 该名称源自JVM识别应用程序中“热点”(经常执行的字节代码块)的功能。 然后将它们作为目标,以进行广泛的优化并将其编译为处理器专用指令。 …JVM中负责这些优化的组件称为即时编译器(JIT)。 …Java HotSpot VM不会及时编译所有代码,而是立即使用解释器运行程序,并在运行时分析代码以检测程序中的关键热点。 然后,它将全球本地代码优化器的注意力集中在热点上。

IBM文档JIT编译器概述还提供了JIT的简要概述,并指出以下内容:


实际上,方法不是在第一次调用时编译的。 对于每种方法,JVM维护一个调用计数,每次调用该方法时,该计数都会增加。 JVM解释一个方法,直到其调用计数超过JIT编译阈值为止。 因此,经常使用的方法在JVM启动后立即进行编译,而较少使用的方法则在以后编译,或者根本不编译。 JIT编译阈值可帮助JVM快速启动,并仍具有改进的性能。 精心选择了阈值,以在启动时间和长期性能之间获得最佳平衡。

识别JIT编译方法

因为JIT编译仅在调用和解释了-XX:CompileThreshold指定的次数( 针对服务器JVM 10,000以及针对客户端JVM 5,000 )指定的次数之后才针对特定方法“启动”,所以并非所有方法都将被编译JIT编译器。 HotSpot命令行选项-XX:+ PrintCompilation对于确定哪些方法已达到此阈值并已进行编译非常有用。 使用此选项显示的任何输出方法都是已编译方法,可以使用-XX:CompileCommand收集其编译详细信息。

以下屏幕快照演示了如何使用-XX:+PrintCompilation标识JIT编译的方法。 所显示的方法都不是简单应用程序本身的方法。 所有方法运行的时间足以满足从解释到实时编译的阈值,是“系统”方法。

20160903-printCompilation显示JIT编译方法

使用-XX:CompileCommand “ 在指定方法的编译后打印生成的汇编代码 ”的前提条件之一是使用-XX:+ UnlockDiagnosticVMOptions “ 解锁用于诊断JVM的选项 ”。

针对查看JIT编译创建的“生成的汇编程序代码”的方法运行-XX:CompileCommand所需的另一个依赖项是包含反汇编程序插件 。 Project Kenai包含用于热点下载的Basic Disassembler插件页面 ,可用于访问这些插件 ,但是Kenai Project正在关闭 。 在线资源“ 如何在Windows上构建hsdis-amd64.dll和hsdis-i386.dll”详细介绍了如何为Windows构建反汇编程序插件。 Lukas Stadler记录了对反汇编程序插件的需求,并提供了指向“ Windows x86预编译二进制文件” hsdis-i386.zip

我发现访问Windows兼容反汇编程序插件的最简单方法是从http://fcml-lib.com/download.html的免费代码操纵库 (FCML)下载页面下载该插件。 撰写本文时,最新下载版本为fcml-1.1.1(04.08.2015) 。 可以为“用于64位Java VM的可从外部加载的反汇编程序插件”下载hsdis-1.1.1-win32-amd64.zip并提供其他下载选项,如下一个屏幕快照所示。

fcmlDownload-hsdis-amd64_dll_64BitJar

下一个屏幕快照演示了一个错误,如果未下载此反汇编程序插件并将其放置在正确的目录中,将会发生此错误。

20160903-couldNotLoad_hsdis_amd64_dll

错误消息指出:“ 无法加载hsdis-amd64.dll; 库不可加载; PrintAssembly已禁用 ”。 ZIP文件hsdis-1.1.1-win32-amd64.zip有一个hsdis-amd64.dll ,可以从FMCL下载 。 现在,我们只需要从ZIP文件中提取hsdis-amd64.dll文件,然后将其复制到相应的JRE目录中即可。

需要将反汇编程序插件JAR放置在与运行Java启动器( java )时应用的JRE相关的jre/bin/serverjre/bin/client目录中。 就我而言,我知道我的路径已定义为可以根据我的JAVA_HOME环境变量设置从JRE获取Java可执行文件(包括Java启动器)。 下一个屏幕快照显示了哪个目录,我将需要将反汇编程序插件JAR复制到JDK的“ jre”目录中,而不是复制到非JDK的“ jre”目录中。

20160903-jreBinIsJdk安装

知道我的Java启动器( java )已用完JDK的“ jre”安装后,我知道需要将反汇编程序插件JAR复制到该目录下的相应子目录中。 在我的情况下,有一个“服务器”子目录,没有“客户机”子目录,因此我想将反汇编程序插件JAR复制到%JAVA_HOME%\jre\bin\server

看到JIT编译方法生成的汇编代码

通过将反汇编程序插件JAR复制到我的JRE的bin/server子目录中,我现在可以包括命令行选项-XX:CompileCommand =print并带有特定的方法名称,以查看JIT编译时该方法生成的汇编代码。 就我而言,由于我自己的简单应用程序没有任何方法可以解释足够的时间来触发JIT,因此我将监视“系统”方法。 在这种情况下,我指定选项“ -XX:CompileCommand=print,java/lang/String.hashCode ”打印出String.hashCode()方法生成的汇编代码。 下一个屏幕快照对此进行了演示。

20160903-codeDisassembledWith-hsdis-amd64-dll-jar-in-jdkJreServerDir

此屏幕快照包括几个确认,我们已经使用-XX:CompileCommand正确设置了必要的依赖-XX:CompileCommand 。 这些确认包括消息的存在,“从...加载反汇编程序”和“解码编译方法...”。 仅仅存在比以前更多的输出以及存在汇编程序代码,这些都是对成功使用-XX:CompilerCommand来打印方法生成的汇编程序代码的明显验证。

解密汇编代码

至此,真正的工作开始了。 现在可以分析已打印的生成的汇编代码,并且可以基于此分析来更改方法。 当然,这类工作需要汇编语法的知识。

我没有在本文中介绍选项-XX:+ PrintAssembly ,因为一次查看所有生成的汇编代码与查看特定选择的方法的汇编代码很少有用。 我喜欢马丁·汤普森(Martin Thompson) 阐明的问题,“ [使用-XX:+PrintAssembly ]会使您处于无法看到森林的状况。”

结论

HotSpot JVM选项-XX:CompileCommand对于影响和监视即时编译器的行为很有用。 这篇文章展示了如何使用“ print ”命令在Windows环境中应用该选项,以查看为该方法生成的汇编代码,该方法已经被解释了足够多次,可以被编译为汇编代码,以便日后访问。

翻译自: https://www.javacodegeeks.com/2016/09/running-xxcompilecommand-windows.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

匹配中文字符的正则表达式: [u4e00-u9fa5](

匹配双字节字符(包括汉字在内):[^x00-xff]评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)匹配空白行的正则表达式:ns*r评注:可以用来删除空白行匹配HTML标记的正则表达式&…

python define function的顺序_Python怎么根据一个函数来决定列表顺序

def__init__(self,function):self._queue[]self.functionfunction然后要写一往列表里增加元素的方法,按照function排序,function类型为函数defadd(self,item):"""AddtothisP...def __init__(self,function):self._queue []self.function…

excel单元格内容合并

这几天在整理数据,有时候数据都在表格的不同单元格中,想把两格内容合并为一格,于是验证了两种方法方法一:(1)在B1输入公式A1&B1(2)做完第一步后,选中B1后,鼠标移到单元格右下出现“”符号是下拉,就能得到结果,如图:方法二(1)在B1输入公式…

主分区与逻辑分区的区别

硬盘分区有三种,主磁盘分区、扩展磁盘分区、逻辑分区。 一个硬盘可以有一个主分区,一个扩展分区,也可以有一个主分区和若干逻辑分区。(图1为大家最常见硬盘分区类型) 主分区 主分区是硬盘的启动分区&#xff0c…

wxpython图形编程_wxpython  图像编程

1)目前遇到一个问题,就是wxpython显示一个图片,然后可以在图片上画矩形,点,line,circle and soon,最后保存矩形的坐标.但是现在可以在屏幕上画矩形,无法在图片上做标记,我反思的原因…

如何利用火狐获取网址中的提交链接

1、添加firebugz组件 2、用火狐打开你要的获取链接的网址例如 http://www.dce.com.cn/dalianshangpin/xqsj/tjsj26/jdtj/jdcjpm/index.html 3、按F12 4、点击你查询的按钮如点击如图下中的年月然后在firebug上点击网络获取里面的post链接 5、点击HTML 中的一个post &#xf…

python-22 eval json pickle shelve 之间差别

1.eval:可以转化字符串,字典,元组,列表等一般类型,不能转化类,函数 2.json:可以转化一般类型外,还可转化函数,可以在任何语言间转化,转化为字符串,可以写入文本&#xff…

打破冷漠僵局文章_研究僵局–第1部分

打破冷漠僵局文章我敢肯定我们都去过那里:太晚了,您饿了,您的服务器已挂起,或者您的应用程序正在以蜗牛的速度运行,并且有人喘着粗气想要您解决问题,然后再去解决。 您的应用程序意外挂起的可能原因之一是称…

vs2008下设置.h, .lib和 .dll 的路径配置全图及其意义

文件夹: 类型文件 include: .h (头文件) lib: .lib (库) 前面二者在vs2008中通过属性来配置。 bin: .dll (动态链接库) 动态链接库是通过系统路径来配置的。 添加库(libs)文件目录 …

按键精灵调用迅雷下载文件

Set ThunderAgent CreateObject("ThunderAgent.Agent") 建立迅雷接口对象ThunderAgent.AddTask "http://10.10.10.10/电影世界/12新电影/随风而逝.rmvb", "随风而逝.rmvb", "", "", "", - 1 , 0, - 1 Ca…

POJ1821 Fence

传送门 这道题是一道很好的单调队列优化DP的例子。 题目大意是有n个工人,每个人可以粉刷一段长度不超过l[i]的墙,如果一个人粉刷了那么他必须要粉刷第s[i]块墙,一个人粉刷一块墙能得到p[i]的钱,求所有工人得到的钱的最大值。 我们…

使用Spring Security和jdbc的Spring Boot

Spring安全性是一个很棒的框架,可节省开发人员的大量时间和精力。 此外,它还具有足够的灵活性,可以自定义并满足您的需求。 使用JDBC和Spring Security非常容易,并且许多操作是自动化的。 这将是一个最小的展示。 gradle文件包含…

map 循环_被问到Spring循环依赖怎么解决?秀给面试官看!内附图解

不知道最近有没有被一道Java面试题刷爆朋友圈,Spring框架的循环依赖如何解决。我收到了不少粉丝的提问,在了解到之后,也去网上查询了一些资料,自己也询问了身边的同事,总结出以下几个方面,今天就和我来看一…

调用ThunderAgent 迅雷局域网版的开发

P2P方式的下载,为我们获取互联网资料提供了一个强有力的工具,它可以争取最大的带宽,获取最大的下载速度。最早采用P2P方式下载的工具有BT、电骡等,后来许多传统“多线程断点续传类”软件,也增加了对的支持,…

详解虚拟机中为Linux添加硬盘

Linux添加硬盘是在原来安装的硬盘空间不够或者需要使用其他硬盘上的东西时候的解决办法,因为大多数初学者习惯使用虚拟机,这里以在Vmware虚拟机中实现Linux添加硬盘的具体步骤来详细介绍说这个问题。 Vmware中为linux增加硬盘 1. 在vmware的setting中为虚…

vue 常用功能和命令

1. vue-cli 构建项目 # 全局安装 vue-cli $ npm install --global vue-clif # 创建一个基于 webpack 模板的新项目 $ vue init webpack your-project-name # 安装依赖 $ npm install # 进入项目 $ cd your-project-name # 开发版本打包并运行 $ npm run dev# 线上环境整个项目打…

项目管理最佳实践方法_项目管理:控制项目进度最佳实践

5分钟站立会议5 MinutesStand-up Meeting(5分钟站立会议)是实践中项目进度管理的好办法。5分钟站立会议时,项目团队成员在固定时间(如每天上午8:30~8:35)、固定地点,每天站着围在一起&#xff0…

《海龟交易法则》经典梳理

序言,第一~第三章 海归交易法则序言本书是历史上最好的5本交易学著作之一的理由:1,重要的不是交易系统而是交易者贯彻交易系统的能力。2,用浅显易懂的语言阐述行为金融学的某些原理如何用于交易和影响交易。3&#xff…

Unix下C程序内存泄漏检测工具Valgrind安装与使用

Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。 Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Google-OReilly开源代码奖。 Valgrind遵守GNU通用公共许可证条款,是一款自由软件。 官网…

hibernate保存失败_Hibernate:保存与保存并保存或更新

hibernate保存失败save和saveOrUpdate之间的区别是什么或save和persist之间的区别是任何Hibernate面试中常见的面试问题,就像Hibernate中get和load方法之间的区别一样。 Hibernate Session类提供了几种通过save , saveOrUpdate和persist等方法将对象保存…