Java jvm-关于代码缓存区域

Java jvm-关于代码缓存区域,java,jvm,jit,Java,Jvm,Jit,这里有一些关于JVM中的缓存区的问题:(对于热点Java8) jvm可以运行的所有机器代码都存储在这个区域,还是只有一些热代码存储在这里 从一些书中可以看出,客户端编译器(C1)更有可能在缓存区内存不足,而服务器编译器(C2)则不然。我对此有点困惑。这是因为服务器编译器只编译热部分,而中断另一部分吗?在这种情况下,服务器编译器不应该很慢吗 在C1和C2分别编译和缓存它们之前,代码运行了多少次 请注意,对这一问题的答案可能因实施而异: jvm可以运行的所有机器代码都存储在这个区域中,还是仅存储在

这里有一些关于JVM中的缓存区的问题:(对于热点Java8

  • jvm可以运行的所有机器代码都存储在这个区域,还是只有一些热代码存储在这里
  • 从一些书中可以看出,客户端编译器(C1)更有可能在缓存区内存不足,而服务器编译器(C2)则不然。我对此有点困惑。这是因为服务器编译器只编译热部分,而中断另一部分吗?在这种情况下,服务器编译器不应该很慢吗
  • 在C1和C2分别编译和缓存它们之前,代码运行了多少次

请注意,对这一问题的答案可能因实施而异:

jvm可以运行的所有机器代码都存储在这个区域中,还是仅存储在这个区域中 这里存储了一些热代码

代码缓存几乎总是用来缓存热方法(或者曾经被C1+C2(分层编译)认为是热的方法)

从一些书中,它说客户端编译器(C1)更有可能耗尽 缓存区内存不足,而服务器编译器(C2)没有。我是一个 对此有点困惑。这是因为服务器编译器 编译热部分,然后中断另一部分?在这种情况下, 服务器编译器不应该很慢吗

C1编译器编译所有内容。C2会等待,直到找到一些可以应用的优化,然后应用这些优化并编译方法(不一定是真的,但大部分是真的)

注意,C1可以多次编译相同的方法

在C1&C2编译代码之前,代码运行了多少次 分别是

如果C1/C2发现一个方法需要很长时间才能运行,即使只调用一次,也可以编译该方法


您可以使用JITWatch查看C1和C2的运行情况。

Thx,但第一个问题的答案对我来说有点模糊,我主要关注的是java8热点,您能否在此基础上更清楚地说明。
如果C1/C2发现它需要很长时间才能运行,即使只调用一次,也可以编译方法。
不是直接的,而是针对每个loop有一个分支计数,它告诉Hotspot循环已经完成了多少次迭代。如果该计数器达到阈值,则循环本身被编译,即使方法本身仍在运行。@biziclop关于第一个问题,当使用c1时,如果一个方法只运行一次并且对jvm非常快,则该方法仍将被编译,right?它还会被缓存在代码缓存区吗?@EricWang否。默认编译阈值C1为1500,C2为10000(或类似值)。如果组合的branch+调用计数超过该阈值,则该方法将被声明为热并被编译。但是,该计数也会定期减少,因此即使是在应用程序生命周期内被调用一百万次的方法也可能不会被编译,如果调用间隔相当均匀,@biziclop的阈值为1500和10000在分层编译中不起多大作用(JDK 8中的默认值)。编译策略要复杂得多,请参阅。顺便说一句,如果您对性能感兴趣,可以很好地概述它的许多方面。@biziclop很好的建议,谢谢。