Tag: 编译器优化

热点JIT优化

在关于Hotspot中的JIT的讲座中,我想尽可能多地给出JIT执行的特定优化的示例。 我只知道“方法内联”,但应该有更多。 为每个例子投票。

默认变量的值与初始化的默认值

我们都知道,根据JLS7第4.12.5节,每个实例变量都使用默认值进行初始化。 例如(1): public class Test { private Integer a; // == null private int b; // == 0 private boolean c; // == false } 但我一直认为,这样的类实现(2): public class Test { private Integer a = null; private int b = 0; private boolean c = false; } 绝对等于例子(1)。 我预计,复杂的Java编译器会发现(2)中的所有这些初始化值都是冗余的并且省略了它们。 但突然之间,这两个类我们有两个不同的字节码。 例如(1): 0: aload_0 1: invokespecial #1; […]

在链接构造函数时,JVM的隐式内存屏障如何表现?

参考我之前关于不完整构造物体的问题 ,我有第二个问题。 正如Jon Skeet指出的那样,在构造函数的末尾有一个隐含的内存障碍,可以确保所有线程都可以看到final字段。 但是如果构造函数调用另一个构造函数呢? 在每个人的最后是否有这样的记忆障碍,或者只是在第一个被召唤的人的最后? 也就是说,当“错误”解决方案是: public class ThisEscape { public ThisEscape(EventSource source) { source.registerListener( new EventListener() { public void onEvent(Event e) { doSomething(e); } }); } } 正确的一个是工厂方法版本: public class SafeListener { private final EventListener listener; private SafeListener() { listener = new EventListener() { public void onEvent(Event e) { doSomething(e); } } } […]

Java Compiler是否包含String Constant Folding?

我发现Java支持原始类型的常量折叠 ,但是String呢? 例 如果我创建以下源代码 out.write(“” + “” + “” + “Easier to read if it is split into multiple lines” + “” + “” + “”); 什么进入编译代码? 合并版? out.write(“Easier to read if it is split into multiple lines”); 或者效率较低的运行时级联版本? out.write(new StringBuilder(“”).append(“”).append(“”).append(“Easier to read if it is split into multiple lines”).append(“”).append(“”).append(“”));

jit会优化新对象吗?

我创建了这个类是不可变的,并且具有流畅的API: public final class Message { public final String email; public final String escalationEmail; public final String assignee; public final String conversationId; public final String subject; public final String userId; public Message(String email, String escalationEmail, String assignee, String conversationId, String subject, String userId) { this.email = email; this.escalationEmail = escalationEmail; this.assignee = assignee; this.conversationId = […]

内存重新排序如何帮助处理器和编译器?

我研究了Java内存模型并看到了重新排序的问题。 一个简单的例子: boolean first = false; boolean second = false; void setValues() { first = true; second = true; } void checkValues() { while(!second); assert first; } 重新排序是非常不可预测和奇怪的。 此外,它破坏了抽象。 我认为处理器架构必须有充分的理由去做一些对程序员来说太不方便的事情。 这些原因是什么? 关于如何处理重新排序有很多信息,但我找不到任何关于它为什么需要的信息。 在任何地方,人们只会说“这是因为一些性能优势”。 例如,在first存储之前存储second的性能优势是什么? 你能推荐一些关于此的文章,论文或书籍,或者自己解释一下吗?