jvm需要多长时间才能进行转义分析? 可能比您想象的要长。

这篇文章着眼于转义分析,特别是jvm在运行的程序中执行转义分析需要多长时间。 我做了一些观察,但目前还没有全部解释。

作为介绍,让我们绕道看看jvm -Xcomp中一个鲜为人知且使用更少的标志(这将是一件好事)。

该标志的行为在jvm 文档中定义为:

-Xcomp在第一次调用时强制编译方法。 默认情况下,客户端VM( -client )执行1,000个解释方法调用,服务器VM( -server )执行10,000个解释方法调用,以收集信息以进行有效的编译。 指定-Xcomp选项会禁用解释的方法调用,从而以提高效率为代价来提高编译性能。

乍一看,这似乎是一个极好的选择。 在10,000个周期内预热jvm的快捷方式–我们可以直接编译代码。 我们是否应该始终默认启用此选项?

但是文档确实警告说,这将“以牺牲效率为代价”。

jvm在10,000个预热周期中了解代码行为,以便在编译时以最有效的方式进行编译。 立即编译代码意味着可以,确实可以编译代码,但是编译后的代码可能不是最有效的。 您可以在此博文中阅读有关它的更多信息-但这并不是本文的主题。

如果使用-Xcomp,则不会发生的其他事情是转义分析。 实际上,这非常令人惊讶,因为jvm不需要通过运行程序来了解是否可以进行转义分析。 这应该通过对代码的静态分析来证明。

看看这个代码(我被思想的启发本博客):

import java.io.IOException;
import java.util.Optional;/*** Created by daniel on 17/12/2015.*/
public class Test {private static String NAME;public static void main(String[] args)throws IOException {new Test().test();}public void test() throws IOException {Name name = new Name("Steven");int iterations = 1_000_000;for(;;){countOptional(name, iterations);System.out.println("Press any key to continue");System.in.read();}}private static void countOptional(Name name, int iterations) {for (int i = 0; i < iterations; i++) {NAME = name.getOptionalName().get();}System.out.println(iterations + " optional iterations " + NAME);}class Name {private final String name;public Name(String name) {this.name = name;}public Optional<String> getOptionalName() {return Optional.ofNullable(name);}}
}

我们需要确保程序在没有gc的情况下运行(我建议使用这些标志):

-verbosegc -Xmx4g -Xms4g

当程序等待输入时,请执行堆转储以查看已创建了多少个Optional对象。 然后按任意键以恢复程序。

要执行堆转储,请先运行jps以确定程序的pid,然后运行:

jmap -histo pid | head

一次不使用-Xcomp标志,一次使用-Xcomp标志。

没有-Xcomp标志

第一次迭代后:

图片1

在第二次迭代之后:

图片2

所有后续迭代都是相同的,不再创建其他对象:

在234k次迭代之后,显然有转义分析开始了-不知道为什么要花这么长时间,通常(例如,使用编译代码)10k次迭代就足够了吗? 同样在第二次迭代中,它在逃逸分析开始之前又创建了约40万个对象,这也有些神秘。

使用-Xcomp标志

第一次迭代后:

图片3

在第二次迭代之后:

图片4

每次迭代后, Optional对象的数量增加1m。

摘要

  • -Xcomp是几乎绝对不应在生产中使用的开关。 我可以想象在某些情况下您可能想禁用解释器,但是这些情况非常特殊。
  • 逃脱分析似乎至少需要进行20万次迭代才能有效。 因此,您需要允许超过10k的迭代时间以进行完全预热。
  • 还有另一个阶段,在逃避对象之后,似乎需要再次执行此操作。 这需要进一步的理解。
  • 如果通过在两次调用Optional之间进行一些工作来减慢程序速度,则对象数量会减少。 例如,我发现对Math.sin的调用将Optional对象减少了约50%。

翻译自: https://www.javacodegeeks.com/2015/12/long-take-jvm-effect-escape-analysis-maybe-longer-think.html

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

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

相关文章

Linux常用操作指令整理,这个操作服务器实在是太方便了

目录 前言 常用指令 系统管理命令 打包压缩相关命令 关机/重启机器 Linux管道 Linux软件包管理 vim使用 用户及用户组管理 更改文件的用户及用户组 文件权限管理 更改权限 前言 由于在银行工作&#xff0c;一个项目需要在云桌面、SIT、UAT、小版本、联调环境、准生产…

http invoker_Http Invoker的Spring Remoting支持

http invokerSpring HTTP Invoker是Java到Java远程处理的重要解决方案。 该技术使用标准的Java序列化机制通过HTTP公开服务&#xff0c;并且可以看作是替代方法&#xff0c;而不是Hessian和Burlap中的自定义序列化。 而且&#xff0c;它仅由Spring提供&#xff0c;因此客户端和…

前端实现数字快速递增_天正CAD教程之递增文字应用实例

好课推荐&#xff1a;1、CAD2014&#xff1a;点击查看 2、室内&全屋&#xff1a;点击查看 3、CAD2019&#xff1a;点击查看4、CAD2018&#xff1a;点击查看5、Bim教程&#xff1a;点击查看 6、室内手绘&#xff1a;点击查看7、CAD三维&#xff1a;点击查看8、全屋定制&…

模板设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

账号被暂时禁用使用VScode不能上传代码的解决办法

最近项目在开发的过程中突然不能提交代码&#xff0c;然后使用git账号登录gitee&#xff0c;发现账号账号不能登录了&#xff0c;不知道什么原因导致的禁用&#xff0c;这个账号sunjiaoshou01是被行方同步数据导致的禁用&#xff0c;一问管理员就说是可能一个月没登录会自动封禁…

地图库地之图地图窝_「方舆」秦朝地图及行政区划

秦朝是中国历史上一个极为重要的朝代&#xff0c;由战国时期的秦国发展起来的统一大国&#xff0c;它结束了自春秋起五百年来分裂割据的局面&#xff0c;成为中国历史上第一个大一统的中央集权制国家。秦朝统一六国时&#xff0c;国土面积为214万平方公里&#xff0c;后北收河套…

智能柜台C端代码规范

语法上建议&#xff1a;一、建议尽量使用””代替””上述比较好上述HX0188是一个字符串&#xff0c;用!替代比较好二、引用的组件/插件在当前vue文件内并未使用例&#xff1a;chk_bcip\src\business\common\views\ common-auditwait.vueDevice._$和Utils.AppUtils 都未使用&am…

华为云电脑和马云无影比_阿里云打造未来电脑无影,却因为5G限制,很难达到普及...

在9月17日&#xff0c;在2020阿里巴巴云栖大会上&#xff0c;阿里云发布了第一台云电脑"无影"&#xff0c;极致的简约&#xff0c;一张卡片大小的机器就等于一台电脑了。看到这款电脑的宣传片&#xff0c;真的是极致的未来感&#xff0c;随随便便一块小透明玻璃就是电…

SQL SERVER 2016研究三

2016 SQL SEVER 全程加密程式 column encryption settingEnabled; 重点&#xff1a;需要使用.Net Framework 4.6 新建一个程式如下&#xff1a; 1、创建链接数据库&#xff0c;必选栏位&#xff0c;影响加密。 2、或者在web.config文件数据链接字符串增加如下语句&#xff1a; …

小车故障灯亮显示大全_史上最全汽车故障灯大全,留着一定有用!

大家好&#xff0c;我是汽修小诺&#xff0c;喜欢有关汽车知识的小伙伴请关注我哦&#xff0c;感谢大家&#xff01;现在有车的朋友越来越多&#xff0c;开车途中难免会遇到汽车故障显示灯亮&#xff0c;从而不知道什么原因&#xff0c;有的朋友不敢开&#xff0c;等修理厂来检…

策略设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

vscode修改json.maxItemsComputed配置解决提示

由于要测试明细查询打印业务&#xff0c;分页每页显示30行&#xff0c;要打印30页以上的数据&#xff0c;在打印的过程中会出现分页的问题&#xff0c;这里使用仿真工具测试&#xff0c;需要修改mock数据&#xff0c;造数据&#xff0c;超过5000行就有提示了&#xff0c;需要扩…

【面试题系列|前端面试题】前端高频面试题总结(2021年最新版)

面试过不少前端从业者&#xff0c;简历写的平平淡淡&#xff0c;别人会的技能他也都会&#xff0c;看起来什么都掌握一些&#xff1b;有些会请过来当面聊一下&#xff0c;有些就直接拒绝了&#xff08;如果是公司内要求独立完成项目的岗位&#xff0c;简历里放很多学习时候的DE…

观察者设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

震惊!2021年数十个技术领域图谱曝光,包含Golang、区块链、人工智能、架构师等领域学习路线

前言:不知道你是否和我一样,刚开始学习某个技术领域的时候缺乏坚持的动力,没有一个清晰的学习路线,学习的过程中没有人指导,遇到问题没人一起解答,想深入学习某个领域而又无从下手,不知道该从何处学起?这不,你想要的技术图谱来啦。有了这款武功秘籍,不光能开阔视野,…

70多套java必练项目,适合小白上手!

导读&#xff1a;这些项目不管是找工作练手&#xff0c;还是公司使用当作模板进一步改进&#xff0c;亦或者是当作毕业设计&#xff0c;都很有借鉴意义&#xff01; 编译器建议使用&#xff1a;IDEA,Myeclipse,eclipse,HB-X等都可以。 数据库建议使用&#xff0c;mysql,oracle,…

mysql mycat 路由规则_Mycat分库路由规则

Mycat分库路由规则发布时间&#xff1a;2020-06-15 16:54:10来源&#xff1a;51CTO阅读&#xff1a;11651作者&#xff1a;lzf05303774一、Mycat分库路由分为连续路由和离散路由。1、连续路由&#xff1a;(1)、常用的路由方式&#xff1a;auto-sharding-long、sharding-by-date…

孙叫兽CSDN社区云----WebIT已创建,欢迎大家前端全栈小伙伴踊跃加入

目录 社区云是什么&#xff1f; 创建CSDN社区云WebIT的目的 推荐分享的技术点&#xff08;如下图所示&#xff09; 社区成员权益 版主权益 管理员权益 WebIT社区云积分规则 WebIT优质版主及管理员可以申请直播分享前端技术 WebIT社区云将为社区运营者提供&#xff1a; …

迭代器设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

uibinder表单提交_使用UIBinder的GWT自定义按钮

uibinder表单提交这是一个有关如何在GWT上使用UIBinder创建自定义按钮的示例。 public class GwtUIBinderButton implements EntryPoint {public void onModuleLoad() {Button button new Button();button.setText("Button");button.addClickHandler(new ClickHandl…