什么是JIT?怎么优化?
什么是JIT
JIT 是 just in time 的缩写, 也就是即时编译编译器。
在运行时 JIT 会把翻译过的机器码保存起来,以备下次使用,因此从理论上来说,采用该 JIT 技术可以接近以前纯编译技术。下面我们看看,JIT 的工作过程。
备注:寄存器的使用是编译器的一个非常普遍的优化。寄存器的速度比主存快很多。
怎么优化JIT编译
- 初级调优:客户模式或服务器模式
- 中级编译器调优 (-cient,-server 或是-xx:+TieredCompilation)
- 优化代码缓存 (–XX:ReservedCodeCacheSize)
- 编译阈值 (-XX:CompileThreshold)
- 检查编译过程 (XX:+PrintCompilation)
- 高级编译器调优
- 编译线程 (-XX:CICompilerCount)
从优化的角度讲,最简单的选择就是使用 server 编译器的分层编译技术,这将解决大约 90%左右的与编译器直接相关的性能问题。最后,请保证代码缓存的大小设置的足够大,这样编译器将会提供最高的编译性能。
HotSpot中的JIT编译器
1.1 编译器和解释器
HotSpot中有编译器和解释器并存。
HotSpot中内置两个JIT编译器:
JVM根据自身版本和机器硬件性能自动选择
- Client Compiler,简称C1,-client参数强制
- Server Compiler,简称C2, -server参数强制
解释器和编译器搭配使用成为混合模式(Mixed Mode)
- 用-Xint参数强制JVM运行与解释模式,全部用解释方式,编译器不介入
- 用-Xcomp强制JVM运行于编译模式,优先采用编译方式
分层编译:根据比那一起编译,优化的规模耗时,划分出不同的编译层次
- 第0层,程序解释执行,解释器不开启性能监测功能,触发第一层编译
- 第1层,也叫C1编译,将字节码编译为本地代码,进行简单, 可靠的优化,如有必要,加入性能监测的逻辑
- 第2层(或者2层以上),也叫C2编译,将字节码比那一位本地代码,但会开启一些编译耗时较长的优化,甚至根据性能监控信息进行一些不可靠的激进优化
分层编译后,Client Compiler和Server Compiler将会同时工作,代码可能会被多次编译,用Client获得更高的编译速度,用Server获得更好的编译质量,解释执行的时候无需搜集性能监控信息
1.2 编译对象和触发条件
热点代码有两类:
- 多次调用的方法
- 多次执行的循环体,实际上也会以整个方法作为编译对象
判断热点的方法主要有两种:
基于采样的热点探测(Sample Based Hot Spot Detection):周期性检查各个线程的栈顶,发现某个(某些)方法经常出现在栈顶,就是热点方法 有点简单高效,可以获取方法调用关系(将调用堆栈展开即可) 缺点是很难精确确认方法热度,容易受到线程阻塞等外界因素影响 基于计数器的热点探测(Counter Based Hot Spot Detection):为每个方法(甚至代码块)建立计数器,统计方法调用次数,如果执行超过阈值就认为是热点方法。缺点是实现较为困难。优点是结果更精确。
基于计数器的探测: Client模式下默认1500次,Server下默认10000次,根据参数-XX:CompileThreshold设定。 调用一个方法,先检查是否存在JIT编译版本本地代码,存在优先使用本地代码,不存在将计数器加1。然后判断调用计数器和回边计数器之和是否大于阈值,如果超过,用JIT编译器提交编译请求。JIT编译完成后方法调用入口就被系统换成新的。下次调用已编译版本。 计数器热度衰减(Counter Decay超过一定的时间限度,方法的调用次数仍未达到阈值,方法计数器减少一半。在垃圾收集期间执行,用-UseCounterDecay来关闭,以统计绝对次数。用-XX:CounterHalfLifeTime设置半半衰周期。 回边计数器:统计方法中方法体代码执行的次数,在字节码中遇到控制流向后跳动的指令成为回边(Back Edge)。 回边计数器阈值可以用-XX:OnStackReplacePercentage来间接调整。 回边计数器没有热度衰减过程。
1.3 编译过程
JVM默认情况下对于即时编译请求在编译完成之前,都按照解释方式执行,编译动作在后台线程执行
参数-XX:-BackgroundCompilation禁止后台编译,此时编译请求会等待,直到编译完成后直接执行本地代码
- Client Compiler:关注局部优化,简单快速,放弃耗时的长时优化
- Server Compiler:面向服务端,高性能,复杂,较缓慢
本文由猿必过 YBG 发布

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
DrawInstance和完全不做合批情况下的性能差异
1)DrawInstance和完全不做合批情况下的性能差异 2)UWA报告中检测出工程没有的资源 3)精灵设置九宫后,如何不在界面中显示出来 4)关于AssetBundle资源的卸载问题 5)Total Mono突然上涨的原因 这是第236篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。 UWA 问答社区:answer.uwa4d.com UWA QQ群2:793972859(原群已满员) Rendering Q:我做了个测试,环境:Unity 2019.4.15 ,机型:小米5X,绘制1000个物体(顶点数>300,不动态合批),测试顺序是:Unity默认渲染(20 FPS)–>Update中通过Graphics.DrawInstance(16.5 FPS)–>通过CommandBuffer实现的DrawInstance(21.5 FPS),对于第二个测试DrawInstance性能反而降低了不太理解,有大佬帮忙解答吗? 图片和测试工程可通过原问答下载。 A:1.Instancing耗时更高主...
-
下一篇
为DevOps团队新春送福—— JFrog与Docker建立突破性的合作伙伴关系
一、新春送福 值此新春佳节将近之际,JFrog为广大DevOps团队奉上新春福利:我们宣布一项能够为我们的客户和整个DevOps社区带来实质性收益的重大举措,那就是,JFrog与Docker建立开创性的合作伙伴关系,使JFrog DevOps平台的云用户免于Docker Hub的镜像拉取的速度限制。 该协议进一步推动了JFrog充满活力的合作伙伴生态系统。该生态系统建立在“广泛合作从而避免失败”的原则之上,而该原则是JFrog自成立以来的发展基石。我们的首要任务是流水线化、自动化并简化DevOps团队的工作方式,并且追求像这次与Docker-这样的合作伙伴关系,这一直是JFrog的核心价值。 该合作伙伴关系的第一个里程碑是为使用云平台的JFrog Artifactory(我们的通用软件制品管理解决方案)的开发人员提供对Docker Hub和Docker官方镜像的无限制、高性能的访问权限,以简化云原生应用程序的开发。 通过这种合作关系,JFrog和Docker将交付: 使用容器时的最佳、无与伦比的开发人员体验 选择工具集时的自由和灵活性 支持共同客户的专用渠道 企业级的可靠性和性能,以流...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- MySQL数据库在高并发下的优化方案
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS8编译安装MySQL8.0.19
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案