首页 > 解决方案 > 如何启用 java HotSpot VM 编译器

问题描述

我正在使用 java 1.8.0_05,Java HotSpot(TM) 64 位服务器 VM 我在 tomcat 8.0.43 上运行 java Web 应用程序

我最近.war通过将文件放到 webapps 文件夹中来部署我的文件。

这导致记录以下消息:

Java HotSpot(TM) 64 位服务器虚拟机警告:CodeCache 已满。编译器已被禁用。Java HotSpot(TM) 64 位服务器 VM 警告:尝试使用 -XX:ReservedCodeCacheSize= CodeCache 增加代码缓存大小:size=245760Kb used=244058Kb max_used=244079Kb free=1701Kb bounds [...] total_blobs=48344 nmethods=47669适配器 = 584 编译:禁用(没有足够的连续可用空间)

如何检查编译器的当前状态,看看它是否仍然被禁用?

如何启用编译器?我可以简单地重新启动tomcat吗?

我的应用程序的运行方式似乎没有任何明显的不同(例如:在速度方面)。

有趣的是,将相同的应用程序部署到相同的服务器时,我没有收到此消息。这就是为什么我想首先重新打开编译器,而不是按照消息的建议更改设置(例如: ReservedCodeCacheSize)。

然后,如果问题仍然存在,我可以查看需要更改哪些设置。

标签: javatomcatjvmjit

解决方案


解决您的个人问题 + 1 条建议:

  • 如何检查 JIT 编译器是否仍然被禁用?

最简单的做法是启动一个 jvisualvm(JDK 已经附带),然后检查使用的代码缓存空间。如果您的 CodeCache 已满,JIT 编译器将保持禁用状态。检查代码缓存内存空间:

  1. 安装 MBeans JVisualVM 插件。
  2. 去Mbeans
  3. 打开 java.lang/MemoryPool/代码缓存
  4. 检查变量“Usage”(双击)

这将为您提供您所在位置的概览。

  • 如何启用编译器?我可以简单地重新启动tomcat吗?

是的,重启肯定会重置缓存的状态。重新启动编译器的唯一另一种方法是,如果您已经使用正确的参数启动了 JVM。(启用UseCodeCacheFlushing

  • 我的应用程序的运行方式没有区别吗?

JIT 会优化您的代码,但根据您的应用程序和您使用它的方式,您可能看不到任何明显的差异。假设您运行一个 webapp(因为 Tomcat),网络传输速度或您的浏览器渲染页面可能比 JIT 在核心 Java 速度方面为您带来的速度要慢几个数量级。

  • “部署相同的应用程序时我没有收到此消息”

JIT 编译取决于当时正在执行的代码。在 JIT 工作的级别上,同一应用程序的运行方式可能完全不同。当涉及到低级函数时,您使用的第 3 方库越多,您就越无法确定在您无法控制的所有线程上发生了什么。

  • 建议:

请升级该 Java 版本。在这么早的JDK8版本上是非常罕见的(u_05),而且相当危险。Java8 发布时并不是最稳定的版本,即使在以后的版本中也存在容易重现的错误。JDK8已经修复了 1000 多个错误。其中许多是直接解决 JIT 问题。如果您对正在与之交谈的环境有任何控制权,请升级它。如果您不这样做,请通知负责人。


推荐阅读