java怎么声明对象强可达_在Java 8中调用强可达对象

5c82b0ae871324ac67af16f35717a802.png

慕森王

这里有点猜测。即使堆栈上的局部变量中有对象的引用,即使存在主动调用堆栈上该对象的实例方法!要求对象是达不到..即使它在堆栈上,如果后续代码没有接触到该引用,它也可能是不可访问的。看见另一个答案例如,当引用对象的局部变量仍在作用域时,如何对象进行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-编译所有东西都会非常缓慢,占用大量的空间-但是它对于在小型测试程序中清除这种情况很有用,而不是修补循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值