大佬教程收集整理的这篇文章主要介绍了java:如果我为变量分配与之前相同的值,它是否会更改内存或 JIT 是否识别出这一点?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
例如:
class Main {
public Boolean hasBeenupdated = false;
public voID updateMain(){
this.hasBeenupdated = true;
/*
alternative:
if(!hasBeenupdated){
this.hasBeenupdated = true;
}
*/
}
public voID persistupdate(){
this.hasBeenupdated = false;
}
}
public Main instance = new Main()
instance.updateMain()
instance.updateMain()
instance.updateMain()
instance.hasBeenupdated 是否在内存中更新了 3 次?
我问这个的原因是因为我希望使用 Boolean("hasBeenupdated") 作为标志,理论上这可以在我调用“instance.persistupdate()”之前“改变”很多很多次。
JVM 的 JIT 是否看到并执行优化?
只有当 JIT 可以证明删除代码不会改变行为时,JIT 才会折叠冗余语句。例如,如果您这样做:
int i;
i = 1;
i = 1;
i = 1;
前两个分配被证明是多余的,JIT可以消除它们。如果是
int i;
i = someMethodReturningInt();
i = someMethodReturningInt();
i = someMethodReturningInt();
JIT 无法知道 someMethodReturninTint()
做了什么,包括它是否有任何副作用,因此它必须调用该方法 3 次。它是否实际存储了除最终值之外的任何值并不重要,因为无论哪种方式,代码的行为都是相同的。 (改为声明 volatilE int i;
会强制它存储每个值)
当然,如果您在方法调用之间做其他事情,它将被迫执行分配。
整个主题是语言和 JVM 规范中记录的更一般的“happens-before”和“happens-after”概念的一部分。
优化绝不应该改变程序的行为,除非可能减少其运行时间。曾经有过优化器中的错误 确实 不经意地引入错误的情况,但这种情况很少见。一般来说,您无需担心优化是否会破坏您的代码。
,它可以执行优化,是的。
事实上,它可以发出单次写入,或对updateMain
的单次调用。所有这三个调用都将合并为一个。
但要实现这一点,JIT 必须证明没有其他任何问题,或者更具体地说,代码没有违反 JMM
规则。在这种特定情况下,据我所知,它没有。
鉴于选择是在实现的 JVM 代码之间
move new value to variable
和
compare new value with current value of variable
if not the same
move new value to variable
JVM 必须非常疯狂才能以后一种方式实现它。这是一种悲观,而不是一种优化。
JVM在很大程度上依赖真机做简单的操作,当你告诉真机把值存入内存时,真机将值存入内存。
以上是大佬教程为你收集整理的java:如果我为变量分配与之前相同的值,它是否会更改内存或 JIT 是否识别出这一点?全部内容,希望文章能够帮你解决java:如果我为变量分配与之前相同的值,它是否会更改内存或 JIT 是否识别出这一点?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。