Java 是什么导致一个方法被归类为';不可编译(已禁用)";通过热点编译器?

Java 是什么导致一个方法被归类为';不可编译(已禁用)";通过热点编译器?,java,jvm-hotspot,Java,Jvm Hotspot,在对应用程序进行一些更改后,它的性能显著下降,并且根据调查,最常调用的方法之一不再被编译。打开:-XX:+LogCompilation显示在更改之前,此方法是:排队进行编译、编译,然后成功内联到调用方;然而,更改后,没有编译尝试的记录,内联尝试显示: 内联\u失败原因=“不可编译(已禁用)” 原始方法如下所示,其中\u maxreats是一个声明为映射的实例变量(没有泛型,代码是很久以前编写的),使用时键是类DadNode的对象,值是整数 private int cnsGetMaxRepea

在对应用程序进行一些更改后,它的性能显著下降,并且根据调查,最常调用的方法之一不再被编译。打开:
-XX:+LogCompilation
显示在更改之前,此方法是:排队进行编译、编译,然后成功内联到调用方;然而,更改后,没有编译尝试的记录,内联尝试显示:

内联\u失败原因=“不可编译(已禁用)”

原始方法如下所示,其中
\u maxreats
是一个声明为
映射的实例变量(没有泛型,代码是很久以前编写的),使用时键是类
DadNode
的对象,值是
整数

  private int cnsGetMaxRepeats(DadNode dn) {
    if (_maxRepeats != null) {
      Integer max = (Integer)_maxRepeats.get(dn);
      if (max != null) {
        return max;
      }
    }
    return dn.getMaxOccurs().getValue();
  }
修正案涉及将
\u maxreats
映射更改为使用泛型:

  Map<Integer, Integer>
使用对
Integer.valueOf
Integer.intValue
的显式调用来避免自动装箱没有任何区别;该方法仍然不可编译


我可以“用棍子戳它”,直到我得到一个满足我需要的解决方案(而且也是可编译的),但是禁用的标准是什么呢?

我认为我犯了一个基本的错误-通过IntelliJ运行调试时产生了带有“编译禁用”方法的日志(尽管断点被禁用)。我希望IntelliJ禁用中带有断点的方法的编译,即使在禁用时也是如此


所以,为了回答我自己的问题,我没有理由认为除了明确禁用编译之外的任何东西都可以做到这一点

由于与代码本身无关的原因,它可能被标记为不可编译。例如,您是否尝试过增加代码缓存大小<代码>-XX:ReservedCodeCacheSize
您使用的是什么版本的Java?操作系统是32位还是64位?您使用的是客户端编译器还是服务器编译器?您使用的是什么版本<代码>日志编译
打印编译
很长一段时间。。。
   private int cnsGetMaxRepeats(int childIdx, DadNode dn) {
    if (_maxRepeats != null) {
      Integer max = _maxRepeats.get(childIdx);
      if (max != null) {
        return max;
      }
    }
    return dn.getMaxOccurs().getValue();
  }