0

0

Java对象的创建与销毁机制

P粉602998670

P粉602998670

发布时间:2026-01-07 14:19:11

|

811人浏览过

|

来源于php中文网

原创

java中new触发类加载、堆分配、默认初始化、构造器执行;对象销毁需满足无gc roots可达、被判定不可达且经gc标记,非立即回收。

java对象的创建与销毁机制

new 关键字触发的内存分配与初始化流程

Java 中 new 不只是语法糖,它会依次触发类加载(若未加载)、堆内存分配、默认字段初始化、构造器执行。关键点在于:对象实际在堆上分配,但 JIT 可能通过逃逸分析做上分配优化(对开发者透明,但影响 GC 压力)。

常见误区是认为 new 后立即“可用”——其实若构造器抛异常(如 NullPointerException 或自定义异常),对象创建就失败,JVM 会清理已分配内存,不会留下半初始化对象。

  • 构造器中避免调用可被子类重写的方法(可能访问到未初始化的字段)
  • 静态工厂方法(如 LocalDateTime.now())比直接 new 更灵活,也便于返回缓存实例或子类
  • 大量短生命周期对象(如循环内 new String())会快速填充年轻代,触发 Minor GC

finalize() 已被废弃,替代方案是 Cleaner 和 PhantomReference

finalize() 自 Java 9 起标记为 @Deprecated,Java 18 彻底移除。它不可靠(不保证何时执行、甚至不保证执行)、性能差、易导致对象复活(resurrection),且与现代 GC 算法(如 ZGC、Shenandoah)不兼容。

真正需要资源清理(如关闭文件句柄、释放 JNI 内存)时,应优先使用 try-with-resources;若必须异步清理,用 Cleaner

立即学习Java免费学习笔记(深入)”;

巨蟹星云网上商城
巨蟹星云网上商城

一套自助创建网上商店的软件系统,具有界面变幻多彩、功能强大,使用傻瓜化、运行自动化的特点,任何人基本上不用学习,都能快速创建自己的网上商店,用这套系统做一个购物网站,就象做填空题一样容易。采用「巨蟹星云」可以建立诸如:网上花店、网上化妆品店、网上服装店、网上书店、网上点卡店、网上成人用品店、网上玩具店、网上书店、网上手机店、网上数码产品销售店、网上保健品店、网上玩具店、网上车模店、网上音像制品店等

下载
private static final Cleaner cleaner = Cleaner.create();
private static class State implements Runnable {
    private final FileDescriptor fd;
    State(FileDescriptor fd) { this.fd = fd; }
    public void run() { close(fd); }
}
private final Cleaner.Cleanable cleanable;
public Resource(FileDescriptor fd) {
    this.cleanable = cleaner.register(this, new State(fd));
}
  • Cleaner 基于 PhantomReference,不阻止 GC,无复活风险
  • 不要在 Cleanerrun() 中执行耗时操作(如网络调用),它运行在专用线程池中
  • 显式调用 cleanable.clean() 可提前触发清理,适用于确定性释放场景

对象何时真正“销毁”:GC 回收的三个必要条件

对象被回收不是因为“不再使用”,而是满足三个条件:没有 GC Roots 可达路径、被判定为不可达、且经过至少一次 GC 标记阶段(取决于 GC 算法)。即使满足,也不代表立即回收——ZGC 的回收是并发的,G1 的 Mixed GC 是分批次的。

典型误判场景:

  • 静态集合(如 public static List<string> cache = new ArrayList();</string>)长期持有对象引用,造成内存泄漏
  • ThreadLocal 变量未调用 remove(),导致线程结束时对象仍被持有(尤其在线程池中)
  • 内部类隐式持有外部类引用,若内部类对象生命周期长于外部类,会阻止外部类回收

System.gc() 是建议而非指令,多数情况下应忽略

调用 System.gc() 仅向 JVM 发出“建议”执行 Full GC,但 HotSpot 默认忽略该请求(除非启动参数加 -XX:+ExplicitGCInvokesConcurrent)。生产环境主动调用它,往往掩盖了真正的内存问题,还可能引发 STW 暂停。

真正需要干预 GC 的情况极少,更合理的做法是:

  • jstat -gc <pid></pid> 观察 GC 频率与停顿时间
  • -Xlog:gc*:file=gc.log 开启 GC 日志,定位晋升失败(Promotion Failure)或元空间溢出(Metaspace OOM)
  • 调整堆大小或 GC 策略(如从 Parallel 改为 G1)前,先确认是对象分配速率过高,还是内存泄漏

对象生命周期管理的核心不在“怎么杀”,而在“谁在持有着它”。排查时优先检查引用链,而不是盯着构造和 finalize

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

442

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

442

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

764

2023.08.10

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

494

2023.08.14

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.1万人学习

Java 教程
Java 教程

共578课时 | 80.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号