Tag: jit

JIT可以在某些表达式中将两个易失性读取合并为一个吗?

假设我们有一个volatile int a 。 一个线程呢 while (true) { a = 1; a = 0; } 而另一个线程呢 while (true) { System.out.println(a+a); } 现在,JIT编译器发出对应于2*a而不是a+a汇编是不合法 a+a吗? 一方面,易失性读取的目的是它应该始终从内存中消失。 另一方面,两个读取之间没有同步点,所以我看不出primefaces地处理a+a是违法的,在这种情况下我看不出像2*a这样的优化会如何破坏规范。 参考JLS将不胜感激。

Java优化

我想知道是否有任何性能差异 String s = someObject.toString(); 的System.out.println(一个或多个); 和 的System.out.println(someObject.toString()); 看看生成的字节码,它似乎有差异。 JVM是否能够在运行时优化此字节码以使两种解决方案都提供相同的性能? 在这个简单的情况下,当然解决方案2似乎更合适,但有时我更倾向于解决方案1以实现可读性,我只想确保不会在关键代码部分中引入性能“降低”。

如何在HotSpot JVM中实现模运算符?

我知道模数运算可以使用一个小的明智的魔法来优化,其中除数是2的幂… 并且可能这是JIT编译器的优化?

Java jit编译器每次运行时都会编译它的代码吗?

我是java的新手并且正在努力理解以下内容:每次运行代码时jit都会编译吗? (我知道jit优化了经常运行的代码,但我问的不是“热代码”)

是否可以阻止JIT优化远离方法调用?

我们正在构建一个用于Java Byte Code程序的平均案例运行时分析的工具。 其中一部分是测量实际运行时间。 因此,我们将采用任意的,用户提供的方法,可能有也可能没有结果,可能有也可能没有副作用(例子包括Quicksort,factorial,dummy嵌套循环……)并执行它(使用reflection),测量经过的时间。 (无论我们是否正确地进行基准测试,除了这里的要点之外。) 在基准测试代码中,我们显然不对结果做任何事情(有些方法甚至没有结果)。 因此,没有人知道JIT可能会做什么,事实上我们已经观察到它似乎有时会优化整个基准测试方法。 由于基准测试方法实际上并未单独使用,因此基准测试无用。 我们怎样才能阻止JIT这样做呢? 我们不想完全关闭它,因为基准测试需要很长时间,而且我们想要对“真实”运行时进行基准测试(因此我们希望JIT在方法内部处于活动状态)。 我知道这个问题但是给定的场景太窄了; 我们不知道结果类型(如果有的话),因此不能以某种方式使用结果,JIT认为没有用处。

编译器内联的getter和setter的概率

我的问题很简单: 问: Java中的编译器会将getter / setter方法内联的几率是多少? (显然没有明确的答案,但其他信息将不胜感激) 额外:我知道编译器(标准和JIT)总是有可能决定内联方法,而当涉及到getter和setter这通常是程序员想要的。 提前致谢。

有没有办法保存下一次运行的JAVA JIT信息,这样我就不必每天都热身了?

我有一个每天运行的JAVA进程,在JIT完全优化之前需要大约1,000或2,000次点击。 我想要做的是保存JIT信息,以便第二天它可以在优化状态下启动。 看起来这应该是可能的,但我还没有找到任何方法。

Java JIT编译器导致OutOfMemoryError

我们最近开始的一个应用程序偶尔会崩溃,并显示一条消息“java.lang.OutOfMemoryError:Chunk :: new请求8589934608字节。交换空间之外?”。 我在网上四处看看,到处都有建议 恢复到以前版本的Java 摆弄内存设置 使用客户端而不是服务器模式 恢复到以前的版本意味着新的Java有一个bug,但我没有看到任何迹象。 记忆根本不是问题; 服务器有32GB可用,Xmx设置为20而Xms是10.我看不到JVM耗尽剩余的12GB(少于给予机器上少数其他进程的数量)。 由于应用程序和环境的性质,我们一直处于服务器模式。 当我查看应用程序的内存和CPU使用情况时,我看到一整天的内存使用量不变,但是在它崩溃之前突然发生CPU使用率上升到100%,内存使用率从X增加到X + 2GB,到X + 4GB,到(有时)X + 8GB,到JVM死亡。 似乎在JIT编译中可能存在重复数组resize的循环。 我现在已经看到上述8GB请求和16GB请求发生错误。 所有这些,当发生这种情况时编译的方法是相同的。 它是一个简单的方法,具有非嵌套循环,无递归,并在对象上使用方法,这些方法直接返回静态成员字段或实例成员字段,只需很少的计算。 所以我有两个问题: 有人有什么建议吗? 我可以测试在测试环境中编译此特定方法是否存在问题,而不运行整个应用程序,直接调用JIT编译器? 或者我应该启动应用程序并告诉它在一个小得多的调用计数(如2)之后编译方法来强制它几乎立即编译方法而不是在当天的随机点? @StephenC JVM是1.6.0_20(以前是1.6.0_0),在Solaris上运行。 我知道这是由于几个原因造成问题的汇编。 ps在导致它的秒内显示一个id对应于编译器线程的java线程(来自jstack)占用了100%的CPU时间 jstack显示问题出在JavaThread “CompilerThread1” daemon [_thread_in_native, id=34, …] jstack提到的方法总是相同的,并且是我们编写的方法。 如果您查看示例jstack输出,您将知道我的意思,但由于显而易见的原因,我无法提供代码示例或文件名。 我会说这是一个非常简单的方法。 基本上是一些空检查,2是用于执行相等性检查并可能分配值的循环,以及之后的一些简单方法调用。 总而言之,可能有40行代码。 虽然应用程序每天运行并且每天重新启动,但这个问题在2周内发生了2次。 此外,应用程序在任何这些时间都没有处于高负荷状态。

(如何)Java JIT编译器优化我的代码?

我正在编写相当低级别的代码,必须针对速度进行高度优化。 每个CPU周期都很重要。 由于代码是用Java编写的,所以我不能像C中那样写低级别,但是我希望能够从VM中获取所有内容。 我正在处理一个字节数组。 我的代码有两个部分,我现在主要感兴趣。 第一个是: int key = (data[i] & 0xff) | ((data[i + 1] & 0xff) << 8) | ((data[i + 2] & 0xff) << 16) | ((data[i + 3] & 0xff) << 24); 第二个是: key = (key <>> 17); 从性能来看,我猜这些陈述没有按照我的预期进行优化。 第二个陈述基本上是ROTL 15, key 。 第一个语句将4个字节加载到int中。 如果访问的字节恰好为负,则0xff掩码仅用于补偿由隐式转换为int导致的添加符号位。 这应该很容易转换为高效的机器代码,但令我惊讶的是,如果我删除掩码,性能会上升。 (这当然会破坏我的代码,但我很想知道会发生什么。) 这里发生了什么? 最常见的Java VM是否会在JIT期间以期望优秀的C ++编译器优化等效C […]

Java:JITC的反映通胀是什么?

我最近遇到了这个有趣的术语,并在网上搜索了解更多信息。 然而,我发现的信息是粗略的。 有人可以吗。 给我一个详细的解释,这是什么,为什么这有用? 从我发现的信息来看,看起来这种机制使得reflection方法的执行速度更快,代价是创建了大量动态类并占用了perm gen内存区域,但我不确定。