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/355711.shtml

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

相关文章

Java补漏(一)

&#xfeff;&#xfeff;第一章前言 在学长的建议下&#xff0c;为了弥补之前学Java漏下的或者不是非常清楚的知识点&#xff0c;买了本蛮好的教科书-《Java学习笔记&#xff08;JDK6&#xff09;》&#xff0c;正式又一次学习。为了记下一些让我恍然大悟的知识。写了本文档。…

子集和问题 算法_子集问题 主要是去重算法

给定一个可能包含重复元素的整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。说明&#xff1a;解集不能包含重复的子集。示例:输入: [1,2,2]输出:[[2],[1],[1,2,2],[2,2],[1,2],[]]

mysql存储引擎使用教程_mysql教程:如何写MySQL存储引擎

在MySQL 5.1中开发一个存储引擎已经是比较方便了。所谓存储引擎实际上是按照MySQL的约定&#xff0c;提供某些接口的实现而已&#xff0c;如MySQL插入一条记录时将调用write_row方法&#xff0c;通过索引检索时将调用index_read和index_next方法等。MySQL与存储引擎之间的接口主…

express中connect-flash中间件的使用

在学习node的时候&#xff0c;flash是困扰我最久的一个中间件&#xff0c;之前一直都没有很好的理解&#xff0c;这里做一个总结。 参考自&#xff1a;http://yunkus.com/connect-flash-usage/ 什么是flash&#xff1f; The flash is a special area of the session used for s…

spring environment_程序员:Spring项目中简单几步实现多个动态数据源切换

每一个请求与其他的用户是面对不同的数据库&#xff0c;这就需要用到动态数据源切换&#xff0c;来满足不同数据库、不同数据表(不同数据源)的灵活调用。动态数据源切换满足mysql、oracle等主流数据库进行动态数据源切换。使用方法在 WEB-INF 目录下建立 lib 目录&#xff0c;并…

算法笔记_163:算法提高 最大乘积(Java)

目录 1 问题描述 2 解决方案 1 问题描述 问题描述对于n个数&#xff0c;从中取出m个数&#xff0c;如何取使得这m个数的乘积最大呢&#xff1f;输入格式第一行一个数表示数据组数每组输入数据共2行&#xff1a;第1行给出总共的数字的个数n和要取的数的个数m&#xff0c;1<n&…

ServletRequest startAsync()的用途有限

前段时间我遇到了Servlet 3.0中AsyncContext.start&#xff08;…&#xff09;的目的是什么&#xff1f; 题。 引用上述方法的Javadoc &#xff1a; 使容器调度线程&#xff08;可能从托管线程池中&#xff09;运行指定的Runnable 。 提醒大家&#xff0c; AsyncContext是Servl…

python3.7下载tensorflow_【AI初体验】在anaconda中python3.7版本安装Tensorflow 与 Keras来玩玩...

哈啰&#xff0c;大家好&#xff0c; 单纯分享自己摸索学习AI的过程&#xff0c; 在自己的文章【Python 超入门】(1) 心原一马从零开始带你学程序中&#xff0c; 记录了安装撰写python的工具-anaconda 的方法&#xff0c; 当时安装的版本是python3.7版&#xff0c; 但是据说目前…

com/mysql/jdbc/sqlerror_com.mysql.jdbc.sqlerror

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)在MYSQL中的BLOB字段中插入图片&#xff0c;提示出错&#xff01;&#xff01;&#xff01;加载MYSQL驱动成功com.mysql.jdbc.JDBC4Connection1479febc:\Users\hjx\Desktop\pic.jpgfile:8202com/search?q38…

Cocos2d-x3.1FileUtilsTest使用

Cocos2d-x3.1中FileUtils的使用&#xff1a;本使用教程是基于HelloWorld的。仅仅需在HelloWorld的init()函数中加入例如以下代码 //头文件 #include "platform/CCFileUtils.h"//FileUtils头文件 #include <stdio.h>//使用文件操作 #include "deprecated/C…

古巴平台上的通用过滤器–类固醇上的excel过滤器

正如我上次承诺的那样&#xff0c;我计划浏览该平台的某些功能&#xff0c;这些功能我认为非常有价值。 所以我将在这里做一些系列。 从明显的用户界面&#xff0c;过滤&#xff0c;安全性到一些高级功能&#xff08;如Web Portal&#xff0c;可扩展性&#xff0c;审核&#xf…

python关键字详解_Python 中的关键字with详解

在 Python 2.5 中&#xff0c;with关键字被加入。它将常用的 try ... except ... finally ...模式很方便的被复用。看一个最经典的例子&#xff1a; with open(file.txt) as f: content f.read() 在这段代码中&#xff0c;无论with中的代码块在执行的过程中发生任何情况&#…

python interactive window_如果PySide应用程序是从IPython interactive cons运行的,上下文菜单就会消失...

在下面给出的最小示例中&#xff0c;上下文菜单(右键单击gui的白色部分)仅短暂显示&#xff0c;然后消失。如果应用程序是从IPython(0.13.1)控制台启动的&#xff0c;则会出现这种情况。当从shell正常启动时&#xff0c;它可以正常工作。在import sysfrom PySide import QtGui,…

基准测试:Java 8 Lambda和流如何使您的代码慢5倍

与长期的实现相比&#xff0c;Java 8 lambda和流的性能如何&#xff1f; Lambda表达式和流在Java 8中受到了热烈的欢迎。这些是迄今为止很激动人心的功能&#xff0c;很长一段时间以来&#xff0c;它们就已经应用到Java中了。 新的语言功能使我们可以在代码中采用更具功能性的…

ssm框架逻辑删除mysql_MybatisPlus--CRUD接口及主键增长策略、自动填充、乐观锁更新数据...

目录一、insert1、插入操作2、主键策略二、update1、根据Id更新操作2、自动填充3、乐观锁三、select1、根据id查询记录2、通过多个id批量查询3、简单的条件查询4、分页四、delete1、根据id删除记录2、批量删除3、简单的条件查询删除4、逻辑删除一、insert1、插入操作RunWith(Sp…

python对英语的要求_学python需要英语基础吗

在很多人的眼里&#xff0c;学习编程需要英语基础&#xff0c;因为程序代码全是英文字母&#xff0c;如果没有英语基础可能很难学懂编程。程序代码是英文确实没有错&#xff0c;但是也不是必须得懂英语&#xff0c;因为计算机程序有自己语言&#xff0c;并不是我们生活中的英语…

mysql5.6 优点_MySQL5.6复制:GTID的优点和限制(第一部分)_MySQL

bitsCN.com全局事务标示符(Global Transactions Identifier)是MySQL 5.6复制的一个新特性。它为维护特定的复制拓扑结构下服务器的DBA们大幅度改善他们的工作状况提供了多种可能性。然而&#xff0c;你还应该明白当前实现的一些局限。本博文是专门对在生产环境中启用GTID到底意…

python找不到csv文件_Python如何读取csv文件

逗号分隔值&#xff08;Comma-Separated Values&#xff0c;CSV&#xff0c;有时也称为字符分隔值&#xff0c;因为分隔字符也可以不是逗号&#xff09;&#xff0c;其文件以纯文本形式存储表格数据&#xff08;数字和文本&#xff09;。纯文本意味着该文件是一个字符序列&…

jsf 自定义属性_必填字段的自定义JSF验证器

jsf 自定义属性实现EditableValueHolder接口的JSF组件具有两个属性“ required”和“ requiredMessage” –一个标志&#xff0c;指示用户需要输入/选择非空值&#xff0c;以及一个用于验证消息的文本。 我们可以使用它&#xff0c;但是它不够灵活&#xff0c;我们不能直接在视…

Python那些事

Python这几年很火&#xff0c;在这里我用问答的方式来总结一下使用python的一些常见问题&#xff0c;对自己是个总结&#xff0c;也希望对有同样问题的朋友有帮助。Q&#xff1a;Python为什么流行&#xff1f;A&#xff1a;Python是一个比较方便的跨平台脚本语言。对于像我这种…