jit编译_意外分配– JIT编译抖动

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

jit编译

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

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

相关文章

网页设计图片向上浮动_利用js实现图片在浏览器中飘动(浮动窗口自由移动)效果...

首先&#xff0c;设置一个将要飘动的窗口&#xff0c;html代码如下:利用js控制span标签在浏览器内移动var xPos 0;var yPos 0; var step 1;var delay 10;var height 0;var Hoffset 0;var Woffset 0; var yon 0;var xon 0; var xon 0; var interval;var img document…

apache camel_学习Apache Camel –实时索引推文

apache camel在大多数软件开发项目中&#xff0c;有一点需要使应用程序开始与其他应用程序或第三方组件通信。 无论是发送电子邮件通知&#xff0c;调用外部api&#xff0c;写入文件还是将数据从一个地方迁移到另一个地方&#xff0c;您都可以推出自己的解决方案或利用现有框架…

让你不再害怕指针——C指针详解(经典,非常详细)

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删前言:复杂类型说明要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型…

dubbo单元测试调用_使用LocalTestServer对HTTP调用进行单元测试

dubbo单元测试调用有时候&#xff0c;您正在对远程服务器进行HTTP调用的单元测试代码。 您可能正在使用诸如ApachesHttpClient或Spring的RestTemplate之类的库。 当然&#xff0c;您不想依靠远程服务进行单元测试。 除了涉及的开销&#xff08;请记住单元测试应该是快速的&…

C语言实现可写入文件的账号密码登录系统

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删账号登录系统在很多系统设计时都时必不可少的&#xff0c;今天这个登录系统功能较全&#xff0c;可以注册&#xff0c;登录&#xff0c;找回密码…

复函数图像怎么画_...1等等.只需大致图象,和大致画法(根据原函数就能画出复合函数的...-复函数的图形-数学-禄凡闷同学...

概述&#xff1a;本道作业题是禄凡闷同学的课后练习&#xff0c;分享的知识点是复函数的图形&#xff0c;指导老师为终老师&#xff0c;涉及到的知识点涵盖&#xff1a;...1等等.只需大致图象&#xff0c;和大致画法(根据原函数就能画出复合函数的...-复函数的图形-数学&#x…

rxjava 循环发送事件_使用RxJava和SseEmitter进行服务器发送的事件

rxjava 循环发送事件Spring Framework 4.2 GA即将发布&#xff0c;让我们看一下它提供的一些新功能。 引起我注意的一个事件是一个简单的新类SseEmitter &#xff0c;它是对Spring MVC控制器中容易使用的发送事件的抽象。 SSE是一项技术&#xff0c;可让您在一个HTTP连接内沿一…

一文搞懂 | Linux 内核的 4 大 IO 调度算法

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删Linux 内核包含4个IO调度器&#xff1a;Noop IO schedulerAnticipatory IO schedulerDeadline IO scheduler CFQ IO scheduler。anticipatory, 预…

众神进入瓦尔哈拉_一时冲动:“通往瓦尔哈拉之路的冒险”

众神进入瓦尔哈拉通过所有有关Java 9和Project Jigsaw的讨论&#xff0c;我们不应忽视Java的另一重大变化。 希望在第10版或第11版中&#xff0c; Valhalla项目能够实现并介绍价值类型和专业化。 那么&#xff0c;这是什么一回事&#xff0c;项目进展如何&#xff0c;面临什么…

当电子工程师十余年,感慨万千!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删当电子工程师也一些年头了&#xff0c;不算有出息&#xff0c;环顾四周&#xff0c;也没有看见几个有出息的。回顾工程师生涯&#xff0c;感慨万…

canva画图 图片居中裁剪_css实现不定宽高的图片img居中裁剪_类似微信朋友圈图片效果...

需求如下&#xff1a;前端需要显示矩形的缩略图&#xff0c;接口返回的图片尺寸大小不一&#xff0c;宽高不相等&#xff0c;需要前端来处理并显示成正方形&#xff0c;类似微信朋友圈图片的效果&#xff0c;等比例正方形显示在列表中&#xff0c;让图片根据宽高来自适应显示在…

哈希策略_优化哈希策略的简介

哈希策略总览 用于哈希键的策略可以直接影响哈希集合&#xff08;例如HashMap或HashSet&#xff09;的性能。 内置的哈希函数被设计为通用的&#xff0c;并且可以在各种用例中很好地工作。 我们可以做得更好&#xff0c;特别是如果您对用例有一个很好的了解吗&#xff1f; 测…

面试大全 | C语言高级部分总结,2.6万字长文

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删一、内存大话题1.0、内存就是程序的立足之地&#xff0c;体现内存重要性。1.1、内存理解&#xff1a;内存物理看是有很多个 Bank&#xff08;就是…

c#设计12星座速配软件_C#设计模式(12)——组合模式

阅读目录1.组合模式在软件开发中我们经常会遇到处理部分与整体的情况&#xff0c;如我们经常见到的树形菜单&#xff0c;一个菜单项的子节点可以指向具体的内容&#xff0c;也可以是子菜单。类似的情况还有文件夹&#xff0c;文件夹的下级可以是文件夹也可以是文件。举一个例子…

hibernate与jpa_将JPA Hibernate与OptaPlanner集成

hibernate与jpa我们一直在改进OptaPlanner与JEE其余部分的集成&#xff0c;因此更容易构建可以正常工作的最终用户应用程序。 让我们看一下改进的JPA Hibernate集成。 基础 JPA Hibernate和OptaPlanner都可以在POJO&#xff08;普通的旧Java对象&#xff09;上工作&#xff0c…

程序如何运行,编译、链接、装入?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删一、地址概念和程序如何运行在多道程序环境下&#xff0c;要使程序运行&#xff0c;必须先为之创建进程。而创建进程的第一件事&#xff0c;便是…

python举两种字符串引号的例子_python里的单引号和双引号的有什么作用

在Python当中表达字符串既可以使用单引号&#xff0c;也可以使用双引号&#xff0c;那两者有什么区别吗&#xff1f;python单引号和双引号的区别简单来说&#xff0c;在Python中使用单引号或双引号是没有区别的&#xff0c;都可以用来表示一个字符串。但是这两种通用的表达方式…

枚举对象注释_如何以及何时使用枚举和注释

枚举对象注释本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题&#xff0c;包括对象创建&#xff0c;并发&#xff0c;序列化&#xff0c;反射等。 它将指导您完成Java掌握的旅程&#xff01; 在这里查看 &#xff01;…

background 互联网图片_cssbackground-image和layer-background-image的区别

layer-background-image语法&#xff1a;layer-background-image : none | url (url)参数&#xff1a;none :  无背景图url :  使用绝对或相对地址指定背景图像说明&#xff1a;设置或检索对象整个区域的背景图像。示例&#xff1a;code {position: absolute;top: 100px; lef…

纪事本 乱码_纪事日记–可自定义的数据存储

纪事本 乱码总览 使任何数据结构或算法尽可能快的方法是使代码完全执行您想要的操作&#xff0c;而无需执行其他操作。 建立一个可以做任何人想做的每件事的数据存储的问题是&#xff0c;它做得特别不好。 自定义数据存储在性能方面可以实现什么&#xff1f; 您可以支持&#…