JVM编译时间与代码缓存

斯坦:

我一直在基准我的应用程序,并与江铃对其进行分析。我注意到,在负载下,它会执行相当多的JIT编译的。如果我发送了大量的每秒事务,编译时间尖峰。在编译的时候总是对应用程序的任何重负载测试按比例增长。

我还注意到,代码缓存缓慢上升为好。所以我决定代码缓存储备500MB提升到测试。糟糕的动作!现在,它的花费更多的时间进行JIT。

然后,我明确禁用代码缓存刷新通过-XX:-UseCodeCacheFlushing然而,我注意到,峰值码缓存使用比当前的大小更大。这使我几个问题:

在这里输入图像描述

  1. 是否JVM尝试缓存每JIT编译?
  2. 为什么峰值码缓存大小比当前的大小,即使我禁用冲洗更大?
  3. 是否有这就是函数结束后自动删除“临时”编译的代码?
apangin:

在热点JVM中CodeCache所有JIT编译的方法停留,直到它们被回收。UseCodeCacheFlushing影响的冷(但仍然有效)编译的方法回收。然而,CodeCache还可以包含过时或无效的方法(“僵尸”),其受到吹扫在甚至与下一个扫描周期-XX:-UseCodeCacheFlushing

  • 在一个分层的汇编模式(默认自JDK 8)的方法,可以与不同级别的优化的被编译多次。一旦安装的方法的优化(第4层)的版本,以前的版本变得过时,并可以在完整版本的所有激活之后被回收。
  • 当投机失败时,推测编译的方法可能会变得无效(例如,一个新的类加载后)。这样的方法也变得僵尸和稍后​​可以被回收。
  • 另一个例子是OSR汇编这是是专门编译的方法运行时,从解释执行转移到编译代码的方法的版本。在回答你的问题3,这是一种“暂时”的方法是安装编译的方法的完整版后变得过时和所有OSR激活完成。

有一个单独的JVM标志-XX:-MethodFlushing,以防止共扫CodeCache,包括僵尸方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JVM为什么不缓存JIT编译代码?

JVM 代码缓存超过 ReservedCodeCacheSize

jvm-关于代码缓存区

Jvm本机代码编译的疯狂之处-即使在编译代码后,我似乎也会在一段时间内受到性能的影响。为什么?

代码编译正常,但 JVM 抛出 NullPointerException

从Java代码转换为jvm字节代码会被视为编译或编译?

如何在JVM中查看JIT编译的代码?

JVM JIT编译器如何优化“重复的” Java代码?

将Kotlin代码编译为JVM和JavaScript

双重编译C代码以减少执行时间

热点JVM是将代码编译为机器代码还是直接运行它

有什么方法可以监视Java中已编译的代码缓存吗?

实例休眠后,Google App Engine是否缓存已编译的go代码?

是否可以使编译时代码不缓存在Perl 6中?

缓存Java编译

JVM C1 和 C2 编译时间基准

为什么Javac无法编译Java 1.5代码以在Java 1.4 JVM上运行?

可以将Java 8代码编译为在Java 7 JVM上运行吗?

JVM的JIT编译器是否生成使用矢量化浮点指令的代码?

Redshift:查询结果缓存与查询编译缓存

为JVM编译C ++

时间在哪里缓存

什么是“缓存友好”代码?

说明:jQuery缓存代码

Java双冒号运算符从编译时间到字节代码生成?

Swift3:为什么这个简单的代码块需要很长时间才能编译

如何减少编译时间以及此代码将在哪些情况下失败

代码块在编译后需要很长时间才能执行

编译此代码时出现此错误“超出时间限制您的程序花费的时间比预期的多。”