Tag: jit

堆栈消费的变化来自何处?

在从这个问题运行测试代码并摆弄JVM的线程堆栈大小的同时,我发现结果不一定是可重复的:存在堆栈大小的值,程序有时会抛出java.lang.StackOverflowError ,但有时不会 。 我的问题是:“导致堆栈空间消耗变化的原因是什么?” 此外,中断的堆栈可以放在该程序的主线程上吗? 对于其他JVM实现和/或操作系统,结果是否同样不确定? 测试代码 public class PointlessRecursion { private static final long N = 1 << 15; private static long addOne(long n) { return (n < 2) ? n : 1 + (addOne(n – 1)); } public static void main(String[] args) { try { long x = addOne(N); System.out.println(x); assert(x == N); […]

没有JIT优化

看看这个问题 : 代码: class test { public static void main(String abc[]) { for( int k=1; k<=3; k++) { for( int N=1; N<=1_000_000_000; N=N*10) { long t1 = System.nanoTime(); int j=1; for(int i=0; i<=N; i++) j=j*i; long t2 = System.nanoTime() – t1; System.out.println("Time taken for "+ N + " : "+ t2); } } } } […]

JVM是否会内联对象的实例变量和方法?

假设我有一个非常紧凑的内循环,每次迭代访问并改变一个簿记对象,该对象存储有关算法的一些简单数据,并具有操作它的简单逻辑 簿记对象是私有的和最终的,它的所有方法都是私有的,最终的和@inline。 这是一个示例(在Scala语法中): object Frobnicate { private class DataRemaining(val start: Int, val end: Int) { @inline private def nextChunk = …. } def frobnicate { // … val bookkeeper = new DataRemaining(0, 1000) while( bookeeper.hasData ) { val data = bookkeeper.nextChunk // …… } } } JVM是否会将整个DataRemaining对象内联到Frobnicate.frobnicate ? 也就是说,它会将start和end视为局部变量并将nextChunk代码直接内联到frobnicate吗?

JIT / Hotspot技术书

有没有人知道任何有关各种JVM或其他虚拟机环境(python / ruby​​ ……)正在使用的JIT技术或热点技术的好书或长篇网页文章(或研究文章?) 看起来这将是一个非常有趣的阅读imho(虽然有关细节的东西很难在互联网上找到……)

如何禁用JIT编译器的内在函数用法?

我正在对JVM进行一些性能测试,我想测量内在函数使用的影响。 我想在不进入解释模式的情况下禁用JIT对某些方法使用内在函数。 有没有办法做到这一点 ? 谢谢

将值存储为变量还是再次调用方法更好?

最近,我开始学习一些Java。 从我已经了解的JVM开始,看起来JIT在需要CPU周期的操作(即调用方法)上使得它非常快,但也使它对内存感到饥饿。 因此,当我需要与之前相同的方法输出相同的输出时,通常更好的方法是将输出存储在变量中并再次使用它 – 同时将其保存在内存中 – 或者再次调用相同的方法?

如何在低(汇编)级别捕获和处理exception?

我有这个代码 – try { doSomething(); } catch (Exception e) { e.printStackTrace(); } 这将如何实际由编译器实现。 实际放入汇编代码生成的exception检查在哪里? 更新 我知道上面的代码是如何转换为字节码的 。 字节码仅将try-catch转换为相应的try-handler块。 我感兴趣的是它将如何转换为汇编/并由jvm处理。

Java如何内联虚拟function边界?

我正在阅读一些关于Java是否比C ++更快的材料,并且看到了以下引用: Java可以比C ++更快,因为JIT可以内联虚拟function边界。 为什么Java总是比C ++慢 (返回链接 ) 这是什么意思? 这是否意味着JIT可以内联虚函数调用(因为可能它可以访问运行时信息)而C ++必须通过其vtable调用函数?

JVM JIT诊断工具和优化技巧

我听到很多关于JVM JIT 可以做什么,但是没有看到很多关于如何分析JIT在程序的给定运行中实际执行的操作的信息。 有很多关于使用-XX:+PrintCompilation和-XX:+PrintOptoAssembly但它会导致很难解释的真正低级别的信息。 一般来说,在优化期间,我喜欢使用具有专用JIT预热时间等的常用操作的基准套件,但我希望能够看到哪些优化实际上触发了我的代码。 也许我的JVM考虑内联一个特定的方法调用,但它的一些东西使它决定不,或者JIT无法避免我的循环中的数组边界检查,因为我的措辞我的不变量和循环条件太模糊。 我希望像YourKit这样的工具能够支持某些forms的“JIT正在发生的事情”,但我无法在YourKit或其他任何地方找到支持。 理想情况下,我只是喜欢在我的程序运行期间JIT优化器正在思考的大脑转储。 假设我已经充分预热了我的function,它决定将三个方法内联到我的内循环中并将循环分成三个部分,中间部分没有数组边界检查,我想要总结这些决定和动机对他们来说 我错过了一些明显的东西吗? JVM性能感知程序员在优化紧密内循环以确定正在发生的事情时会做些什么? 当然,低级-XX标志不是唯一的选择,可以吗? 我很欣赏有关如何最好地处理JVM上的这种低级内容的提示。 不,这个问题不是因为过早优化而产生的! 🙂 编辑:我想我想要的一些东西是由-XX:+LogCompilation给出的,但是如果人们有这种活动的一般提示和工具,我仍然很好奇。

类文件格式的最终​​变量

类文件格式是否支持最终关键字,以便将其与变量一起使用? 或者它只是从代码中推断出变量的有效终结性而JIT编译器基于它执行优化? 这里 ,在类文件格式文档中,他们提到了关于final关键字,但仅限于将其与final块和final类一起使用的情况。 最终变量没有任何内容。