java怎么声明对象强可达

编程入门 行业动态 更新时间:2024-10-21 13:13:09

java怎么声明对象强<a href=https://www.elefans.com/category/jswz/34/1765489.html style=可达"/>

java怎么声明对象强可达

慕森王

这里有点猜测。即使堆栈上的局部变量中有对象的引用,即使存在主动调用堆栈上该对象的实例方法!要求对象是达不到..即使它在堆栈上,如果后续代码没有接触到该引用,它也可能是不可访问的。看见另一个答案例如,当引用对象的局部变量仍在作用域时,如何对象进行GC‘编辑。下面是一个示例,说明如何在实例方法调用处于活动状态时最终确定对象:class FinalizeThis {

    protected void finalize() {

        System.out.println("finalized!");

    }

    void loop() {

        System.out.println("loop() called");

        for (int i = 0; i 

            if (i % 1_000_000 == 0)

                System.gc();

        }

        System.out.println("loop() returns");

    }

    public static void main(String[] args) {

        new FinalizeThis().loop();

    }}而loop()方法是活动的,任何代码都不可能使用引用FinalizeThis对象,所以它是不可触及的。因此,它可以最后确定和GC‘。在JDK 8 GA上,这将打印以下内容:loop() called

finalized!loop() returns每次。可能会发生类似的事情MimeBodyPart..它是否存储在局部变量中?(看起来是这样的,因为代码似乎遵循一种惯例,即字段以m_(前缀)更新在评论中,“任择议定书”建议作以下修改:    public static void main(String[] args) {

        FinalizeThis finalizeThis = new FinalizeThis();

        finalizeThis.loop();

    }对于这一变化,他没有观察到最后定稿,我也没有观察到。然而,如果做了进一步的更改:    public static void main(String[] args) {

        FinalizeThis finalizeThis = new FinalizeThis();

        for (int i = 0; i 

            Thread.yield();

        finalizeThis.loop();

    }最后定稿再次发生。我怀疑原因是如果没有循环,main()方法是解释的,而不是编译的。对于可达性分析,解释器可能不太积极。在收益率循环就位后,main()方法被编译,JIT编译器检测到finalizeThis已变得不可及,而loop()方法正在执行。触发此行为的另一种方法是使用-Xcomp选项,它强制在执行之前对方法进行JIT编译。我不会以这种方式运行整个应用程序-JIT-编译所有东西都会非常缓慢,占用大量的空间-但是它对于在小型测试程序中清除这种情况很有用,而不是修补循环。

更多推荐

java怎么声明对象强可达

本文发布于:2024-02-06 23:29:14,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1751426.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:可达   对象   声明   java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!