这篇文章着眼于转义分析,特别是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标志

第一次迭代后:

在第二次迭代之后:

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

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

使用-Xcomp标志

第一次迭代后:

在第二次迭代之后:

每次迭代后, 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

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

  1. java何时支持await,内存-为什么Java等待这么长时间才能运行垃圾回收器?

    我注意到图表在下降之前并未严格向上倾斜,但局部变化较小. 尽管我不确定,但是我认为如果没有垃圾回收发生,内存使用不会显示这些小滴. Java中有次要和主要的集合. 次要收藏经常发生,而主要收藏则较为少 ...

  2. 有些牛逼,需要很长时间才能看得出来

    简单的东西,往往更可靠.有些牛逼,往往需要很长时间才能看得出来! 转载于:https://www.cnblogs.com/bbxx111/p/4222802.html

  3. 编程好学吗?多长时间才能学会?需要注意些什么?

    编程好学吗?多长时间才能学会编程? 这个因人而宜.通常情况下,从实现第一个"Hello World",到比较熟练的编写代码,这个过程可能比学习其它的计算机技术要长一些. 比如学习P ...

  4. c1语言水平要多久,对普通人来说,一般需要多长时间才能学会一门外语?

    对普通人来说,一般需要多长时间才能学会一门外语? 外语学习,有人觉得容易,有人觉得难,总的来说,即使在互联网广泛普及,外语资料垂手可得的今天,外语学习对大多数人来讲,依然不是一件轻松的事,对许多正在学 ...

  5. ai杀手级_游戏花了太长时间才能利用stadias杀手级功能

    ai杀手级 On July 1, Crayta, a game that allows people to collaborate on making other games, exclusively ...

  6. edge浏览器需要等待很长时间才能打开?

    最近有网友反映,电脑中的edge浏览器不知道怎么回事,每次启动都需要很长的时间才有反应,使用体验非常不好,有什么方法可以解决edge浏览器需要等待很长时间才能打开?清除一下缓存就好了. edge浏览器 ...

  7. 域名过期多长时间才能注册

    域名过期几个阶段 域名过期要多长时间,才能注册?这个是米虫关心的问题,正巧在经典论坛看到,转过来,做个记号. 一.域名过期后第一阶段 域名过期后1-45天内,将处于注册商保留状态 whois英文状态: ...

  8. ajax加载时间长,如何最好地处理需要很长时间才能完成的ajax请求?

    让我先说这个问题,说我对构建处理器密集型Web应用程序的设计相对较新.我有一个基于LAMP堆栈的功能应用程序,现在我正处于开发阶段,我必须实现扩展. 我有一个运行PHP代码的Web服务器ssh进入远程 ...

  9. linux 查看mysql运行时间_linux – strace显示从mysql socket读取很长时间 – mysql需要很长时间才能执行查询?...

    我的Apache服务器需要很长时间来处理请求.我附上了strace,可以看到以下两个延迟: 1)非常关键(处理143秒) 1335 0.000037 write(16, "\235\0\0\ ...

最新文章

  1. 马斯克很着急:加速打造“月球电梯”,他要从NASA手中抢到这一单
  2. Lingo 优化实例 出版社问题
  3. 【iHMI43 应用演示】之 modbus 协议(从机)通信演示
  4. 机器值计算机组成,计算机组成原理_数据的机器运算.ppt
  5. SQL(八)- python执行SQL语句
  6. Kaggle入门预测赛,手写数字识别Digit Recognizer,使用Kaggle kernel作答,F=0.98
  7. 【底层原理】深入理解Cache (上)
  8. Perl学习笔记(二)--标量数据
  9. 系统辨识理论及应用_液压系统故障智能诊断方法(2)
  10. matlab用正弦做随机信号程序,实验二随机信号的仿真与分析.doc
  11. 调用微信扫一扫接口---实现二维码扫描(微信浏览器)
  12. android 安装在笔记本,笔记本安装安卓系统图解_笔记本电脑如何安装安卓系统-win7之家...
  13. 【数字IC第一步】Linux系统安装(含常用IC软件)
  14. VS2005中(_CRT_SECURE_NO_DEPRECATE)警告
  15. u盘超级加密3000使用方法
  16. python 实现单链表 Lined List
  17. 计算机应用基础操作题文档,《计算机应用基础》操作题
  18. mysql 当前时间小时制_日期函数——MYSQL
  19. 医院IPTV系统搭建 智慧医疗解决方案
  20. git撤销的相关操作

热门文章

  1. 孩子大了真是不好管了
  2. css实现一级下拉菜单
  3. 动态网页开发基础【笔记】
  4. 2015蓝桥杯省赛---java---A---3(九数分三组)
  5. JAVASE阶段流程图
  6. HashMap的实现原理及其特点
  7. ReviewForJob——算法设计技巧(贪婪算法+分治算法+动态规划)
  8. IDEA集成maven流程图详细介绍
  9. JDBC的SQL注入漏洞
  10. micrometer_具有InlfuxDB的Spring Boot和Micrometer第1部分:基础项目