程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了java:如果我为变量分配与之前相同的值,它是否会更改内存或 JIT 是否识别出这一点?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决java:如果我为变量分配与之前相同的值,它是否会更改内存或 JIT 是否识别出这一点??

开发过程中遇到java:如果我为变量分配与之前相同的值,它是否会更改内存或 JIT 是否识别出这一点?的问题如何解决?下面主要结合日常开发的经验,给出你关于java:如果我为变量分配与之前相同的值,它是否会更改内存或 JIT 是否识别出这一点?的解决方法建议,希望对你解决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,请注明来意。
标签: