在Java里对象是如何创建的_Java对象创建过程解析-java教程

java对象创建包含类加载、内存分配、实例初始化三阶段,任一环节失败会导致noclassdeffounderror等异常;类需先加载链接再初始化,静态异常致exceptionininitializererror;内存分配依gc策略用指针碰撞或空闲列表,tlab提升小对象分配效率;字段默认值赋值早于构造器执行,父类构造中调子类方法易引发npe;new非原子操作,需volatile等安全发布避免半初始化对象可见。

Java对象的创建不是简单的一行 new 就完事——它背后涉及类加载、内存分配、初始化等多个阶段,任一环节出错都会导致 NoClassDefFoundError、ExceptionInInitializerError 或看似“无原因”的空指针。

类加载阶段:对象创建前必须完成的事

执行 new 之前,JVM 必须确保该类已被加载、链接(验证、准备、解析)和初始化。如果类尚未加载,会触发双亲委派机制启动加载流程;若加载失败(如类文件损坏、ClassNotFoundException),new 根本不会执行。

常见陷阱:

  • 静态代码块中抛出未捕获异常 → 类初始化失败 → 后续所有 new 都抛 ExceptionInInitializerError
  • 使用 Class.forName("X") 但没指定 initialize = true → 类已加载但未初始化,此时 new X() 才真正触发初始化
  • 模块系统下包未导出(requires 缺失或 exports 未声明)→ NoClassDefFoundError 而非 ClassNotFoundException

内存分配:堆上哪块空间给新对象?

JVM 在堆中为对象分配内存,具体策略取决于垃圾收集器和对象大小:

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

  • 大多数情况走「快速分配路径」:指针碰撞(Bump the Pointer),前提是堆内存规整(如 Serial / Parallel GC)
  • 并发场景(CMS / G1 / ZGC)下可能用「空闲列表(Free List)」管理不连续内存
  • 大对象(超过 -XX:PretenureSizeThreshold)可能直接进入老年代,跳过 Eden 区
  • TLAB(Thread Local Allocation Buffer)默认开启,避免多线程竞争 Eden 堆指针,小对象优先在 TLAB 分配

可通过 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 观察分配行为;关闭 TLAB(-XX:-UseTLAB)会显著降低小对象分配吞吐量。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 在Java里对象是如何创建的_Java对象创建过程解析-java教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4001406+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4001407+
  • 本周更新: 0+
  • 最后更新: 2026-03-16