jvm - 关于代码缓存区域

时间:2016-03-07 10:12:57

标签: java jvm jit

以下是关于JVM中缓存区的一些问题:( for hotspot Java8

  • jvm可以运行的所有机器代码都存储在这个区域,或者只有一些热代码存储在这里?
  • 从一些书中,它说客户端编译器(C1)更有可能在缓存区域中耗尽内存,而服务器编译器(C2)则不会。我有点困惑。是因为服务器编译器只编译热部分,并中断其他部分?在这种情况下,服务器编译器不应该很慢吗?
  • 在C1&之前运行代码的次数C2会编译&分别缓存它们吗?

1 个答案:

答案 0 :(得分:2)

请注意,答案可能因实施而异:

  

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

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

  

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

C1编译器编译所有内容。 C2等待直到找到可以应用的一些优化,然后应用这些优化并编译方法(并非总是如此,但主要是)。

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

  

在C1&之前运行代码的次数C2会编译它们   分别?

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

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