我想知道为什么JVM的JIT编译器在编译时忽略“巨大的方法”。(除非DontCompileHugeMethods标志设置为false。)与此同时,大多数关于Java的JIT编译器的讨论都指出内联是一种super优化,因为它允许增长大量需要编译的指令。这个更大的编译上下文可以更好地优化执行的代码。有了这个,我会假设一个巨大的方法与一个大量内联的方法没有太大区别,并且应该是JIT编译的一个很好的目标。我在这里缺少什么? 最佳答案 基本上编译大量方法的投资返回率很低。热点代码通常很短。即使一个巨大的方法被频繁执行,热点部分也不太可能覆盖整
我广泛使用jProfiler,它是一个很棒的工具,但我想知道jProfiler如何处理JIT编译的效果。我是否能够观察到例如方法内联?如果一个方法是内联的,它在快照中根本不可见,或者jProfiler是否仍然能够计算它的执行时间?同样,没有副作用并且可以完全优化掉的方法也不会在jProfiler中显示。这是正确的吗?我通常会在相当长的预热时间后分析我的应用程序,因此我希望尽可能对代码进行JIT编辑/优化。因此,我怀疑应该优化掉但在配置文件中可见的方法对我来说总是一个很大的谜。 最佳答案 IusejProfilerextensivel
我有一个每天运行的JAVA进程,在它被JIT完全优化之前需要大约1,000或2,000次点击。我想做的是保存JIT信息,以便第二天它可以以优化状态启动。看起来这应该是可能的,但我还没有找到任何方法。 最佳答案 您可以使用像JET或GCJ这样的提前编译器,但我认为没有任何标准方法可以保存JIT形式。请记住,这会将您的程序与您正在运行的架构联系起来,但听起来您已经意识到并接受了这一点。 关于java-有没有办法为下次运行保存JAVAJIT信息,这样我就不用每天都预热代码了?,我们在Stack
我读到,Java源代码被编译成“字节码”,然后由JIT再次“编译”成“机器码”。也就是说,源代码首先被编译成平台无关的字节码,然后再次编译成机器特定的代码。那为什么它又被称为解释型和编译型语言呢?解释发生在哪里? 最佳答案 这里有点误会。在正常情况下java编译器(javac)将java代码编译成字节码,java解释器(java)逐行解释这些字节码,将其转换成机器语言并执行。JIT(Justintime)编译器是一个有点不同的概念。JVM维护函数执行的次数。如果它超过了限制,那么JIT就会出现。java代码被直接编译成机器语言,然后
我用Java8编写了一个服务器应用程序,并使用java1.8.0u25运行它。前几个小时它工作正常,但在它收到大约5k~10k请求后,VM进程的一个线程使用了一个CPU的100%。所以我为VM进程尝试了jstack来检查有问题的线程是什么,它显示线程(线程id为14303=0x37df)是“C2CompilerThread0”:"C2CompilerThread0"#6daemonprio=9os_prio=0tid=0x00002aaabc12a000nid=0x37dfrunnable[0x0000000000000000]java.lang.Thread.State:RUNNAB
(注意:正确答案必须超越复制)。在数百万次调用之后,quicksort1肯定比quicksort2快,除了这1个额外的arg之外,它们具有相同的代码。代码在帖子的最后。剧透:我还发现jit代码胖了224个字节,即使它实际上应该更简单(就像字节代码大小说明的那样;请参阅下面的最新更新)。即使在尝试使用一些微基准测试工具(JMH)消除这种影响之后,性能差异仍然存在。我在问:为什么生成的native代码有如此大的差异,它在做什么?通过向方法添加参数,它会使其更快......!我知道gc/jit/warmup/etc的影响。您可以按原样运行代码,也可以使用更大/更小的迭代计数。实际上,您甚至应
我正在尝试为对延迟敏感的Java应用程序编写预热例程,以优化前几个事务,否则这些事务会因动态类加载和JIT(主要)而变慢。我面临的问题是,即使我的预热代码加载了所有类并通过多次调用它们(至少100次-XX:CompileThreshold)来练习它们,稍后当实际用户登录这些相同的函数时仍然标记为“非进入者”并再次重新编译,这会导致延迟命中。JVMflags如下(我只加了-XX:+PrintCompilation-verbose:classtptroubleshoot,其他都是legacy):-Xms5g-Xmx5g-server-XX:+AggressiveHeap-XX:+UseFa
什么时候JavaJIT内联方法调用?它是基于调用者方法被调用的#times(如果是,那个数字是多少?),还是其他一些标准(那是什么?)我读到JIT可以内联“final”方法,但它也会根据运行时统计信息内联非final方法,所以想知道触发条件是什么。我想答案会根据JVM实现而有所不同,但也许所有这些都有一些共同点? 最佳答案 简短的回答是随时都可以。JITC经常会自动内联小型final或伪final方法,而无需先收集任何统计信息。这是因为很容易看出内联实际上节省了代码字节,而不是对调用进行编码(或者至少它几乎是一个“清洗”)。内联真正
在Hotspot中关于JIT的讲座中,我想尽可能多地举例说明JIT执行的特定优化。我只知道“方法内联”,但应该知道更多。为每个示例投票。 最佳答案 好吧,您应该浏览BrianGoetz的文章以获取示例。简而言之,HotSpot可以并且将会:内联方法在同一对象上加入相邻的同步block如果其他线程无法访问监视器,则消除锁定消除无用代码(因此大多数微基准测试毫无意义)放弃对非volatile变量的内存写入将只实现一次的方法的接口(interface)调用替换为直接方法调用等等 关于java-
我正在编写相当低级的代码,必须针对速度进行高度优化。每个CPU周期都很重要。由于代码是用Java编写的,因此我不能像用C那样编写低级别的代码,但我想尽可能地从VM中获取所有内容。我正在处理一个字节数组。目前我主要对代码的两个部分感兴趣。第一个是:intkey=(data[i]&0xff)|((data[i+1]&0xff)第二个是:key=(key>>17);从性能来看,我猜测这些语句没有按照我预期的方式进行优化。第二条语句基本上是ROTL15,key。第一个语句将4个字节加载到一个int中。0xff掩码仅用于补偿如果访问的字节恰好为负,则隐式转换为int所导致的添加符号位。这应该很容