
对象实例化与访问---JVM(十)
发布日期:2021-05-10 06:29:24
浏览次数:18
分类:精选文章
本文共 1655 字,大约阅读时间需要 5 分钟。
对象的创建方式
在编程中,对象的创建是开发工作中的基本操作之一。以下是几种常见对象创建的方式以及它们的特点和适用场景。
使用 new 关键字
这是最常用的对象创建方式。通过new 关键字
调用类的构造器,来初始化对象。具体来说,就是通过 new Class()
的形式来创建对象。这种方式简单直观,是大多数开发者最熟悉的方式。 使用反射机制
反射可以通过Class.newInstance()
或者 Constructor.newInstance()
来创建对象。需要注意的是,反射创建对象时,必须使用空参数的构造器,并且构造器必须是公有权限。如果构造器是私有的或有参数的,则无法通过反射创建对象。但反射机制可以绕过一些语言层面的限制,有时在特定场景下非常有用。 使用 Cloneable
接口的 clone()
方法
clone()
创建拷贝也不需要调用构造器。这种方式节省了内存,但需要确保类实现了 Cloneable
接口,并且 clone()
方法本身是公有的。 使用反序列化
反序列化是从二进制流中恢复对象的方式。可以从文件中加载对象,或者从网络上下载二进制流,再通过反序列化方法恢复对象。这种方式在某些特定的场景下非常有用,比如需要从持久化存储中读取对象时。使用第三方库 Objenesis
Objenesis
是一个强大且灵活的反射工具,能够以更灵活的方式创建对象。支持调用有参数的构造器,甚至可以绕过某些字段的访问控制(如私有字段或方法),对开发者非常有帮助。 对象的创建步骤
对象的创建过程在虚拟机内部涉及许多复杂的步骤。以下是具体步骤的描述。
类加载
当虚拟机执行new
关键字时,首先会检查目标类是否已经被加载。如果尚未加载,类加载器会根据需要加载类。类加载包括了验证、准备、解析和初始化等阶段。 内存分配
为新对象分配内存。虚拟机会根据需要使用不同的内存分配策略。目前主流的有两种方式:规整分配(用指针碰撞)和空闲列表分配。规整分配性能更好,而空闲列表分配则提供了更好的空间局当itudity兼容性。对象初始化
初始化对象所占空间中的内容。对于引用 член变量,虚拟机只需要分配引用变量的空间(通常是4字节)。对象头中将存储类的元数据、哈希码、GC标记信息以及锁信息等。执行构造器
调用类的定制构造器来初始化对象。如果没有显式调用new
关键字,或者是通过反射方式创建对象,则需要确保构造器是可访问的。 设置对象头
在对象头中存储元数据、哈希码、GC标记信息,以及锁信息等。这些信息对于垃圾收集和同步操作至关重要。完成对象创建
只有在以上所有步骤顺利完成后,才能称得上一个对象被完整创建。对象的结构
一个典型的对象在内存中的结构如下:
对象头
包含元数据(如类信息、哈希码)、垃圾收集标记等。实例数据部分
根据对象的需求,包含成员变量和方法零值。对于大对象,通常存储在堆中;对于小对象,可能直接存放在方法区中。其他资源
包括同步锁、finalizer 等必要的支持结构。在实际应用中,虚拟机会根据垃圾收集器的选择(如标记-清除、复制、标记-整理)采用不同的内存分配策略。
对象访问的方式
在程序中访问对象可以使用两种方式:句柄访问和直接引用。
句柄访问
采用引用(Reference)来间接访问对象。句柄操作非常高效,因为只需修改句柄中的指针不需要修改整个引用。这种方式也是垃圾回收所常用的方式。直接引用
使用对象本身作为引用。这在方法参数中非常常见,因为它简单直观。但是问题在于,当对象被移动(GC进行回收)时,所有引用都会被更新吗?其实不是,只有强引用才不会被回收。如果是弱引用或柔性引用,则可能被回收,但不会阻止对象的垃圾回收。使用 Hotspon 及其它高级机制
当应用程序需要频繁地访问对象时,可以采用 Hotspon( 热链)机制来缓解性能问题。通过缓存对象的访问路径,减少频繁的对象访问开销。发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月29日 23时20分38秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
程序员就地过年,怎样才能更有意义?
2019-03-15
一文带你看懂菜鸟程序员和大神的区别!
2019-03-15
Bugku CTF-web6
2019-03-15
解决Burpsuite中文或提交数据显示乱码问题(详细附图)
2019-03-15
Bugku CTF-web10 头等舱
2019-03-15
Bugke CTF-Crypto 这不是MD5
2019-03-15
路由器和交换机简单总结(cisco设备)
2019-03-15
【软工视频】-用户界面
2019-03-15
UML-配置图
2019-03-15
JS高级面向对象(二)-构造函数和原型
2019-03-15
Vue学习(二)-胡子({{}})语法
2019-03-15