意外分配– JIT编译抖动

在研究ByteWatcher时 (请参阅我的上一篇 文章 ),我遇到了一些非常奇怪的事情。

这是实际的代码段,用于找出特定线程上的分配量:

return (long) mBeanServer.invoke(name,GET_THREAD_ALLOCATED_BYTES,PARAMS,SIGNATURE
);
  • 有关完整上下文,请参见此处 。

(ByteWatcher的工作方式是定期调用此方法以监视分配。)

需要注意的一个重要方面,尤其是当想要为程序的分配提供准确的数字时,就是调用上面的代码本身–导致分配。

此调用引起的分配必须从返回的数中扣除,以便我们隔离程序导致的分配,即, 调用meanBeanServer =程序线程分配+调用开销

我注意到的是,此分配量通常为336个字节。 但是,当我在循环中调用此方法时,发现了一些有趣的东西。 每隔一段时间,它将分配不同的金额。

对于此测试:

@Testpublic void testQuietMeasuringThreadAllocatedBytes() {ByteWatcherSingleThread am = new ByteWatcherSingleThread();System.out.println("MeasuringCostInBytes = " + am.getMeasuringCostInBytes());long[] marks = new long[1_000_000];for (int i = 0; i < 1_000_000; i++) {marks[i] = am.threadAllocatedBytes();}long prevDiff = -1;for (int i = 1; i < 1_000_000; i++) {long diff = marks[i] - marks[i - 1];if (prevDiff != diff)System.out.println("Allocation changed at iteration " + i + "->" + diff);prevDiff = diff;}}

这是典型的结果:

MeasuringCostInBytes = 336
Allocation changed at iteration 1->336
Allocation changed at iteration 12->28184
Allocation changed at iteration 13->360
Allocation changed at iteration 14->336
Allocation changed at iteration 1686->600
Allocation changed at iteration 1687->336
Allocation changed at iteration 2765->672
Allocation changed at iteration 2766->336
Allocation changed at iteration 5458->496
Allocation changed at iteration 5459->336
Allocation changed at iteration 6213->656
Allocation changed at iteration 6214->336
Allocation changed at iteration 6535->432
Allocation changed at iteration 6536->336
Allocation changed at iteration 6557->8536
Allocation changed at iteration 6558->336
Allocation changed at iteration 7628->576
Allocation changed at iteration 7629->336
Allocation changed at iteration 8656->4432
Allocation changed at iteration 8657->336
Allocation changed at iteration 9698->968
Allocation changed at iteration 9699->336
Allocation changed at iteration 11881->1592
Allocation changed at iteration 11882->336
Allocation changed at iteration 12796->1552
Allocation changed at iteration 12797->336
Allocation changed at iteration 13382->456
Allocation changed at iteration 13383->336
Allocation changed at iteration 14844->608
Allocation changed at iteration 14845->336
Allocation changed at iteration 36685->304
Allocation changed at iteration 52522->336
Allocation changed at iteration 101440->400
Allocation changed at iteration 101441->336

鉴于程序中肯定没有分配,所以为什么同一调用有时分配不同的金额对我来说是一个谜。

总的来说,超过1,000,000次运行,该程序分配了大约25次不同的数量。 值得注意的是,经过10万次迭代后没有峰值。

我与亨氏·卡布兹(Heinz Kabutz)和克里斯·纽兰(Chris Newland)分享了这个问题。 Chris注意到分配是由JIT编译抖动引起的。 通过使用标志-Xint重新运行测试可以很清楚地看出这一点(仅以解释模式运行,即没有JIT编译)。 现在只有2个峰值。

MeasuringCostInBytes = 336
Allocation changed at iteration 1->336
Allocation changed at iteration 12->28184
Allocation changed at iteration 13->360
Allocation changed at iteration 14->336

同样使用-Xcomp标志运行(仅编译):

MeasuringCostInBytes = 336
Allocation changed at iteration 1->336
Allocation changed at iteration 12->29696
Allocation changed at iteration 13->360
Allocation changed at iteration 14->336

因此,现在我们可以非常有信心,正是导致准入分配的JIT编译抖动。

我不完全理解为什么会这样,但是我想这是可以理解的。 为了弥补这一点,我在ByteWatcher的构造函数中引入了一个校准阶段,Heinz进一步完善了该校准阶段。

您可以在此处看到校准代码,但是它包含两个阶段:

  1. 调用该方法以计算线程在紧密循环中分配了多少(我们称其为100,000次)–允许JIT适当地预热代码,以便将其全部编译
  2. 等待50毫秒–这使JVM有机会完成编译抖动

在构造函数中使用此代码,即使没有特殊标志运行也不会出现分配高峰。

结论

  • JIT编译抖动导致一些分配
  • 在没有编译抖动(即仅解释或仅编译)的情况下运行程序会大大减少分配,但并不能完全消除分配。
  • 在100k运行之后,分配停止,这表明需要100k运行才能停止抖动。 这很有趣,因为我们知道代码应该在10k次迭代后进行编译。

翻译自: https://www.javacodegeeks.com/2015/09/an-unexpected-allocation-jit-compilation-jitter.html

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

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

相关文章

fastd java下载_FastReport VCL报表控件

FastReport VCL报表控件是著名的 Delphi 打印控件。含全部源码。支持 Delphi 10.2 Tokyo&#xff0c;FastReport可以在大量的方式报表的创建过程中操纵对象。快速发展的报表和随后的打印&#xff0c;这样的优点&#xff0c;正如预览打印文档的外观。专业版除了报表标准版的功能…

#102030:在30天内运行20 10K来庆祝Java的20年

1995年5月23日是技术史上的重要时刻。 业界似乎并没有意识到当天发布的语言会在未来几年内完全改变技术的格局。 Java将在今年的同一天庆祝20岁生日。 Java 20年&#xff0c;哇&#xff01; 回顾20年前的存储器时代&#xff0c;思考一下Java的发明时间/方式。 万维网专用于精…

View 的 android:visibility属性的讨论

Android VIEW 中的 visibility 属性&#xff0c;在API中的描述为&#xff1a;Controls the initial visibility of the view. [控制VIEW的初始可见性]。 其中包含三个参数&#xff1a; * 默认值为visible&#xff0c;可见。这里需要注意的是 "invisible" 和 "go…

jms java client mq_将Java客户端(JMS)连接到IBM MQ时出现问题

我正在尝试使用基本上通过以下方式构建的Java客户端使用SSL消耗IBM MQ(版本8.0.0.8)&#xff1a;Oracle JKD 8和IBM JRE 7(出于测试目的&#xff0c;我每个都有一个客户端)com.ibm.mq.allclient-9.1.0.0.jarjavax.jms-api-2.0.1.jarspring-jms-4.3.7.RELEASE.jarspring-jms-4.3…

JQuery-Dialog(弹出窗口,遮蔽窗口)

在Ajax中经常用到的弹出窗口和遮蔽窗口。自己写肯定是一个最佳方案&#xff0c;但时间和成本上&#xff0c;还是决定了寻找现成的吧。大概罗列一下。需要我满足我几个条件 一定要简洁方便拥有遮蔽功能&#xff0c;Model Dialog &#xff0c;所谓的模态窗口可以根据HTML弹出窗口…

java 设置系统参数_Java如何设置系统参数和运行参数

系统参数系统级全局变量&#xff0c;该参数在程序中任何位置都可以访问到。优先级最高&#xff0c;覆盖程序中同名配置。系统参数的标准格式为&#xff1a;-Dargnameargvalue&#xff0c;多个参数之间用空格隔开&#xff0c;如果参数值中间有空格&#xff0c;则用引号括起来。其…

HDU 1244 DP

题目大意: 我们需要将一串数字分成多个确定个数的连续段&#xff0c;在得到所有段的和的最大值 定义一个dp[i][j]数组表示在前j个数中取满 i 个段所能得到的最大值 那么也就是说明在这道题目当中每一段都是必须要被取到的 能够取到的前提是 j > cnt[i] //表示前 i 段的数字个…

java怎么生成字母_java自动生成字母

新建一个类SpringContextUtil.java&#xff1a;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;/*** 获取spring容器&#xff0c;以访问容器中定义的其…

一天一块钱第二天翻倍_再把钱翻倍

一天一块钱第二天翻倍总览 很久以前&#xff0c;我写了一篇关于用双倍赚钱的文章。 但是&#xff0c;当解决方案相当简单时&#xff0c;仍然是许多开发人员普遍担心的问题。 用双倍赚钱的问题 double有两种类型的错误。 它存在表示错误。 即它不能精确地表示所有可能的十进制…

移动端回到顶部

PC端回到顶部&#xff0c;很多人都是用js来写的。这样效果比较好一些了&#xff0c;但是在移动端的时候&#xff0c;就没必要搞个animate的动画了&#xff0c;然后实现回到顶部的方法也有&#xff1a;window.scrollTo(0,0)。但是更简单的就是a锚点里面href"#"&#x…

java调用接口实现的方法_java调用接口的实现方法

java调用接口的实现方法发布时间&#xff1a;2020-06-29 11:08:46来源&#xff1a;亿速云阅读&#xff1a;78作者&#xff1a;Leah本篇文章给大家分享的是有关java调用接口的实现方法&#xff0c;小编觉得挺实用的&#xff0c;因此分享给大家学习&#xff0c;希望大家阅读完这篇…

Java EE应用程序的单片到微服务重构

您是否曾经想过将现有的Java EE整体应用程序重构为基于微服务的应用程序需要做什么&#xff1f; 该博客解释了一个简单的购物车示例如何转换为基于微服务的应用程序&#xff0c;以及围绕它的一些担忧。 整体和基于微服务的应用程序的完整代码库位于&#xff1a; github.com/ar…

Java代码韦伯分布_第十五节、韦伯局部描述符(WLD,附源码)

纹理作为一种重要的视觉线索&#xff0c;是图像中普遍存在而又难以描述的特征&#xff0c;图像的纹理特征一般是指图像上地物重复排列造成的灰度值有规则的分布。纹理特征的关键在于纹理特征的提取方法。目前&#xff0c;用于纹理特征提取的方法有很多&#xff0c;最具有代表性…

windows和linux删除文件方法

Windows下bat文件内容如下&#xff1b;复制代码 代码如下: echo offforfiles -p "D:\servers\apache2.2\logs" -s -m *.log -d -15 -c "cmd /c del path"forfiles -p "D:\servers\mysql\logs" -s -m *.log -d -15 -c "cmd /c del path"…

JavaFX真实世界应用程序:欧洲电视网广播联盟

我荣幸地与今年在德累斯顿Saxonia 系统公司工作的Alexander Casall一起在JavaOne上展示了多个JavaFX Real-World应用程序。 在准备本次演讲时&#xff0c;我们向客户和合作伙伴发送了一份调查表&#xff0c;并向他们询问了一些与他们的项目&#xff0c;他们的应用程序以及他们对…

java 三大集合_java中的三大集合入门笔记(简单实用)

为什么使用集合框架如图&#xff1a;集合的好处&#xff1a;集合弥补了数组的缺陷&#xff0c;它比数组更灵活更实用&#xff0c;可大大提高软件的开发效率&#xff0c;而且不同的集合适用于不同的场合。Java集合主要分为以下3种类型Java集合框架提供了一套性能优良、使用方便的…

java POI 写入百万数据到 excel

.xls文件只支持6w的数据写入 .xlsx文件只支持104w数据的写入 在java中jxl工具类只能操作.xls的文件&#xff0c;不能操作.xlsx的文件 POI工具类能够支持.xlsx的文件操作。 excel的数据读写都相应的简单&#xff0c;网上也有很多的代码&#xff0c;我这里要说的是怎么样写入100w…

摆脱困境:将运行时配置作为JSON返回

如果需要确定部署到远程服务器的Spring Web应用程序的运行时配置&#xff0c;则需要读取从远程服务器找到的属性文件。 这很麻烦。 幸运的是&#xff0c;有更好的方法。 这篇博客文章描述了我们如何 启动我们的Web应用程序时&#xff0c;将运行时配置写入日志文件。 返回运行…

网络爬虫依赖的架包

网络爬虫依赖的架包 commons-codec-1.3.jarcommons-httpclient-3.1.jarcommons-logging-1.0.4.jarhtmllexer.jarhtmlparser.jar 转载于:https://www.cnblogs.com/aicpcode/p/4194898.html

调用布尔变量java_关于java的参数的调用,还有布尔的理解,这有一段代码,我有些不太理解,希望能够帮我分析下,谢谢...

第一段代码public class CustomerBiz {String[] namesnew String[30]; //创建学生姓名数组//实现姓名的添加public void addName(String name){for(int i0;iif(names[i]null){names[i]name;break;}}}public void showName(){ //显示姓名for(int i0;iif(names[i]!null){System.o…