如何启用java HotSpot VM编译器

如何启用java HotSpot VM编译器,java,tomcat,jvm,jit,Java,Tomcat,Jvm,Jit,我使用的是Java1.8.005,JavaHotSpot(TM)64位服务器虚拟机 我正在Tomcat8.0.43上运行一个java web应用程序 我最近将我的.war文件放到webapps文件夹中进行了部署 这导致记录以下消息: Java HotSpot(TM)64位服务器VM警告:CodeCache已满。编译程序 已被禁用。Java HotSpot(TM)64位服务器虚拟机警告:重试 使用-XX:ReservedCodeCacheSize增加代码缓存大小= CodeCache:size=2

我使用的是Java1.8.005,JavaHotSpot(TM)64位服务器虚拟机 我正在Tomcat8.0.43上运行一个java web应用程序

我最近将我的
.war
文件放到webapps文件夹中进行了部署

这导致记录以下消息:

Java HotSpot(TM)64位服务器VM警告:CodeCache已满。编译程序 已被禁用。Java HotSpot(TM)64位服务器虚拟机警告:重试 使用-XX:ReservedCodeCacheSize增加代码缓存大小= CodeCache:size=245760Kb已用=244058Kb最大已用=244079Kb空闲=1701Kb 界限[…] total_blobs=48344 n方法=47669适配器=584编译:已禁用 (没有足够的连续可用空间)

如何检查编译器的当前状态,以查看它是否仍处于禁用状态

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

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

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


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

我不久前就遇到了这个问题,这是我无法告诉您的:

一旦代码缓存变满,编译器将自动禁用

它会自动重新启动吗?

不会。它将一直关闭,直到JVM重新启动

我可以简单地重新启动tomcat吗

对。但它可能会再次发生

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

从长远来看,会有一些问题,因为可以缓存和优化的代码不能再编译和存储在那里

你能做什么?

  • 您可以增加一点-XX:ReservedCodeCacheSize
  • 您可以启用-XX:+useCodeCache刷新。缺点是,如果CodeCache的大小太小,并且不断达到刷新阈值,那么性能将受到影响,因为在刷新过程中需要花费CPU资源
  • 我会增加一点CodeCacheSize,启用刷新,并使用VisualVM或其他可以让您查看CodeCache当前状态的东西来监视应用程序。监控将帮助您了解您是偶尔达到阈值还是经常达到阈值

    请记住,CodeCache与堆是分开的,因此查看HeapSize对您没有帮助

    编辑: 关于VisualVM,以下是连接到远程JVM的正式步骤:

    只要确保启用了JMX,它就可以立即工作

    关于多个应用程序同时运行的问题。。。是的,技术标准的Tomcat为所有应用程序启动一个JVM。缓存空间将被共享

    您还可以通过将VisualVM连接到JVM、取消部署应用程序并检查空间是否已释放来监视这种情况


    你也可以考虑使用一个企业容器,它可以让你为每个应用程序创建一个JVM。

    < P>我刚才有这个问题,这就是我不能告诉你的:

    一旦代码缓存变满,编译器将自动禁用

    它会自动重新启动吗?

    不会。它将一直关闭,直到JVM重新启动

    我可以简单地重新启动tomcat吗

    对。但它可能会再次发生

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

    从长远来看,会有一些问题,因为可以缓存和优化的代码不能再编译和存储在那里

    你能做什么?

  • 您可以增加一点-XX:ReservedCodeCacheSize
  • 您可以启用-XX:+useCodeCache刷新。缺点是,如果CodeCache的大小太小,并且不断达到刷新阈值,那么性能将受到影响,因为在刷新过程中需要花费CPU资源
  • 我会增加一点CodeCacheSize,启用刷新,并使用VisualVM或其他可以让您查看CodeCache当前状态的东西来监视应用程序。监控将帮助您了解您是偶尔达到阈值还是经常达到阈值

    请记住,CodeCache与堆是分开的,因此查看HeapSize对您没有帮助

    编辑: 关于VisualVM,以下是连接到远程JVM的正式步骤:

    只要确保启用了JMX,它就可以立即工作

    关于多个应用程序同时运行的问题。。。是的,技术标准的Tomcat为所有应用程序启动一个JVM。缓存空间将被共享

    您还可以通过将VisualVM连接到JVM、取消部署应用程序并检查空间是否已释放来监视这种情况


    你也可以考虑使用一个企业容器,它可以让你为每个应用程序创建一个JVM。

    < P>处理你的个别问题+ 1个建议:

    • 如何检查JIT编译器是否仍处于禁用状态?
    最简单的方法是启动一个jvisualvm(已经随JDK提供),然后检查使用的codecache空间。如果CodeCache已满,JIT编译器将保持禁用状态。要检查代码缓存内存空间,请执行以下操作:

  • 安装MBeans JVisualVM插件
  • 去姆本斯
  • 打开java.lang/MemoryPool/Code缓存
  • 检查变量“用法”(双击)
  • 这会让你大致了解你现在的处境

    • 如何启用编译器?我可以简单地重新启动tomcat吗?
    是的,重新启动肯定会重置缓存的状态<