首页 Java java教程 为什么可访问的 Java 对象在 Java 8 中最终确定,尽管最佳实践不鼓励'finalize()”?

为什么可访问的 Java 对象在 Java 8 中最终确定,尽管最佳实践不鼓励'finalize()”?

Dec 14, 2024 am 05:44 AM

Why are reachable Java objects finalized in Java 8, despite best practices discouraging `finalize()`?

Java 8 中可访问对象的 JVM 终结:探索

尽管遵循不鼓励使用 Finalize() 的最佳实践,最近从 Java 7 升级到 Java 8 发现了一个意想不到的问题。在这种情况下,当前线程堆栈仍可强访问的对象将在 Java 8 运行时中进行终结。

理解代码和异常

有问题的代码涉及自定义 MIME 库,其中 MIMEBodyPart 类扩展了 HTTPMessage。 HTTPMessage 实现了一个 Finalize() 方法,该方法尝试关闭其关联的输入流,当流在活动 writePart() 操作期间已关闭时会导致异常。

调查原因

由于对意外的最终确定感到困惑,开发人员深入研究了代码和 JVM 行为。发现 MIMEBodyPart 对象确实可以从当前线程的堆栈访问,因此不应该被最终确定。

假设无法访问的可能性

尽管如此尽管该对象明显可达,但理论上 Java 虚拟机 (JVM) 仍然可以将其视为不可访问如果后续代码中没有显式引用。这种“不可达能力”的概念甚至扩展到堆栈上的活动方法调用。

演示不可达性的示例

为了说明此行为,提供了一个简化的代码示例:

class FinalizeThis {
    @Override
    protected void finalize() {
        System.out.println("finalized!");
    }

    void loop() {
        System.out.println("loop() called");
        for (int i = 0; i < 1,000,000,000; 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 对象的实例方法,但由于该对象明显不可达,JVM 仍会完成该对象并对其进行垃圾回收。

将假设应用到原​​始场景

据推测,MIMEBodyPart 对象可能会出现类似的情况。如果它存储在局部变量中而没有任何后续引用,则它可能会变得无法访问并容易被最终确定。

更新和其他观察

通过进一步的测试和分析,很明显,JIT 编译器在这种行为中发挥了作用。通过强制方法在执行前进行 JIT 编译(-Xcomp 选项),过早终结的问题再次出现。这表明简化示例中最初缺乏最终确定是由于解释而不是编译,后者执行更积极的可达性分析。

结论

虽然问题的具体情况可能会因具体的代码结构和执行环境而异,但即使对于可到达的对象,由于感知到的不可达性,潜在最终确定的基本概念也值得注意。它强调了理解对象可达性以及活动对象上终结调用的潜在后果的重要性。

以上是为什么可访问的 Java 对象在 Java 8 中最终确定,尽管最佳实践不鼓励'finalize()”?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

公司安全软件导致应用无法运行?如何排查和解决? 公司安全软件导致应用无法运行?如何排查和解决? Apr 19, 2025 pm 04:51 PM

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

如何将姓名转换为数字以实现排序并保持群组中的一致性? 如何将姓名转换为数字以实现排序并保持群组中的一致性? Apr 19, 2025 pm 11:30 PM

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

如何使用MapStruct简化系统对接中的字段映射问题? 如何使用MapStruct简化系统对接中的字段映射问题? Apr 19, 2025 pm 06:21 PM

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

如何优雅地获取实体类变量名构建数据库查询条件? 如何优雅地获取实体类变量名构建数据库查询条件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本启动Spring...

Java对象如何安全地转换为数组? Java对象如何安全地转换为数组? Apr 19, 2025 pm 11:33 PM

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

电商平台SKU和SPU数据库设计:如何兼顾用户自定义属性和无属性商品? 电商平台SKU和SPU数据库设计:如何兼顾用户自定义属性和无属性商品? Apr 19, 2025 pm 11:27 PM

电商平台SKU和SPU表设计详解本文将探讨电商平台中SKU和SPU的数据库设计问题,特别是如何处理用户自定义销售属...

如何利用Redis缓存方案高效实现产品排行榜列表的需求? 如何利用Redis缓存方案高效实现产品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

Redis缓存方案如何实现产品排行榜列表的需求?在开发过程中,我们常常需要处理排行榜的需求,例如展示一个�...

See all articles