`
BBLLMYD
  • 浏览: 17657 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

1.1)对象创建

JVM 
阅读更多
对象的创建过程
1.当虚拟机遇到new指令时, 首先将去检查这个指令参数能否定位到常量池对应的类的符号引用, 并检查这个符号代表的类是否被加载验证解析过, 如果没有先执行上述过程
2.类加载检查通过后, 接下来虚拟机将为新生对象分配内存, 对象所需的内存大小在类加载完成后便可完全确定
3. 对象在堆中分配内存的方式分为两种, 指针碰撞和空闲列表, 取决于你采用的垃圾收集器的算法实现是否有内存碎片化情况出现, Serial和ParNew等带Compact过程的收集时, 采用的分配算法是指针碰撞, 而是用CMS这种基于Mark-Sweep算法的收集时, 通常采用空闲列表
4.由于堆中大部分内存是线程共享的, 而且创建对象发生的一般都很频繁, 所以一般需考虑并发情况, 虚拟机采用的是CAS方式保证更新操作的原子性, 另一种是TLAB即本地线程缓冲区, 将创建内存的线程隔离开来使线程独立, 这种方式TLAB空间容量有限制, 所以当空间用光之后, 仍需要同步锁
5.内存分配完成后, 虚拟机将初始化的内存空间都初始化为零值
6.接下来, 虚拟机对对象设置一些信息, eg: 此对象是哪个类的实例, 如何才能找到类的元数据信息, 对象的哈希码, 对象的GC分代年龄信息(可通过参数设置阈值), 是否启用偏向锁等, 这些信息存在对象头
到此, 从虚拟机的视角看来, 一个对象已经产生, 而从Java程序角度看, 对象创建才刚刚开始, 字节码的角度看, 也就是new指令执行, 紧接着需要执行<init>方法, 将对象按照客户端程序的意愿进行初始化, 执行后一个对象才算真正创建完成
 
对象的内存布局
对象在内存中大致分为三个部分: 对象头, 实例数据, 对齐填充
1.对象头: 又分两部分信息, 第一部分用于存储对象自身的运行时数据, 如哈希码,GC分代年龄,锁状态标识,线程持有的锁,偏向线程ID,偏向时间戳等等, 另一部分是类型指针, 即对象指向它的类元数据的指针, 但并不是所有的虚拟机实现都在对象头上保留这个指针, 或者说, 查找对象的元数据信息并不一定经过对象本身
2. 实例数据: 也就是程序代码中定义的各种类型的字段内容, 无论是从父类中继承的还是子类中存在的都需要记录下来, 这部分的定义顺序收到虚拟机分配参数策略和Java源码中定义顺序的影响, HotSpot虚拟机默认的分配策略是longs/doubles, ints, shorts/chars, bytes, booleans, oops, 在满足这个条件的前提下, 父类中出现的变量会出现在子类前
3.对齐填充: 由于HotSpot要求对象的大小必须是8字节的整数倍, 而对象头的部分正是8字节的一倍或者两倍, 所以当实例数据没有对齐时, 需要通过对齐补充来不补全
 
对象的访问定位
Java程序中通过栈上的refernce数据来操作堆上的具体对象, 方式一般有两种
1.句柄: 这种方式在Java堆中会划出一块内存作句柄池, 其中包含每个对象的两种指针分别是: 到对象实例数据的指针和到对象类型数据的指针
优点: 在栈中的refernce存储的是稳定的句柄地址, 对象被移动时只会改变句柄中的实例数据指针, 而refence本身不改变


 
 
2.直接指针: reference中存的直接就是对象地址
优点: 速度更快


 
  • 大小: 57 KB
  • 大小: 70.7 KB
分享到:
评论

相关推荐

    1.1C++对象面面观共6页.pdf.zip

    您提供的文件信息"1.1C++对象面面观共6页.pdf.zip"和"赚钱项目"并不包含具体的IT知识点,也没有描述任何技术细节。为了提供一篇关于C++对象的详细文章,我需要更多的上下文或详细信息,例如C++对象的具体概念、特性...

    JMS1.1规范(中文)

    生产者通过调用`Session`对象的`createProducer()`方法创建消息生产者,消费者则通过`Session`创建消息消费者。 4. **消息代理**:也称为消息中间件,是负责存储、路由和传递消息的服务器。常见的消息代理有...

    Direct2D1.1模板

    1. **创建Direct2D工厂**:使用D2D1CreateFactory函数创建ID2D1Factory对象,这是访问Direct2D服务的入口点。 2. **创建渲染目标**:根据应用需求,创建适当的渲染目标,如窗口渲染目标(ID2D1HwndRenderTarget)或...

    opengl-1.1.rar_opengl 1.1

    OpenGL是计算机图形学领域广泛应用的一种跨语言、跨平台的应用编程接口(API),它允许程序员创建复杂的3D图形和视觉效果。OpenGL 1.1版本是该API的一个早期版本,但仍然包含了许多基本的3D图形绘制功能。在这个...

    jms-1.1.jar

    2. 消息生产者(Message Producer):负责创建并发送消息的组件,通常是一个应用程序或服务。 3. 消息消费者(Message Consumer):接收并处理消息的组件,同样可以是应用程序或服务。 4. 消息队列(Queue):FIFO...

    jdk1.1源代码

    在JDK1.1中,多线程是通过`Thread`类实现的,程序员可以直接继承`Thread`或实现`Runnable`接口来创建并运行线程。虽然现在的最佳实践是使用`ExecutorService`,但在JDK1.1的时代,直接操作`Thread`是常见的做法。 ...

    struts1.1 jar包

    6. **性能提升**: Struts 1.1通过优化内部算法和减少不必要的对象创建,提高了框架的运行效率。 7. **兼容性与API稳定性**: Struts 1.1保持了与先前版本的良好兼容性,并且对API进行了一些稳定性的调整,降低了升级...

    JDOM1.1(Jdom文档)

    JDOM1.1是其一个重要版本,提供了高效、灵活且完全基于Java的方式来创建、读取和修改XML文档。 JDOM1.1的核心特性包括: 1. **纯Java实现**:JDOM完全用Java编写,无需依赖其他平台特定的库,因此具有良好的跨平台...

    jms-1.1.jar(jms工具jar包)

    生产者通过`Session`对象创建消息,并使用`MessageProducer`对象将其发送到目的地。 3. **消息消费者(Message Consumer)**:接收并处理来自消息队列或主题的消息。消费者同样需要`Session`对象来创建,而`...

    jQuery 1.1 中文文档

    **jQuery 1.1 中文文档** jQuery 是一个流行的JavaScript库,它简化了HTML文档遍历、事件处理、动画和Ajax交互。jQuery 1.1 版本是该库的一个重要迭代,它提供了许多功能增强和性能优化。在这个离线版的jQuery 1.1...

    ObjectPool_v1.1.zip

    这样可以避免频繁的对象创建和销毁带来的性能开销,尤其是在对象创建和销毁过程昂贵的情况下。例如,Java中的数据库连接池就是对象池的一个典型应用,它减少了创建和关闭数据库连接的次数,提升了系统的运行效率。 ...

    c#.NET1.1 FTP客户端源码

    使用`WebRequest.Create()`方法创建FtpWebRequest对象,然后通过`GetResponse()`方法建立连接。完成后,调用`Close()`或`Dispose()`方法关闭连接。 5. **身份验证**:FTP通常支持匿名登录,也可以使用用户名和密码...

    Winsock 1.1函数参考

    在C++和VC++环境下,你可以使用面向对象的方式来封装这些函数,创建更易用的类,如`Socket`类,将上述功能封装成成员方法。同时,注意线程安全和异常处理,确保在网络通信中的健壮性。 总的来说,Winsock 1.1提供了...

    Terrain Tile Editor 1.1

    《Unity3D地形贴图编辑器1.1详解》 Unity3D作为一款强大的游戏开发引擎,其在3D场景构建、游戏逻辑处理等方面表现出色。在创建大型、复杂的户外环境时,地形系统是必不可少的一部分。"Terrain Tile Editor 1.1"便是...

    JSF1.1入门教程

    **JSF(JavaServer Faces)1.1 入门教程** JSF,全称为JavaServer Faces,是Java EE(现在称为Jakarta EE)平台的一部分,主要用于构建用户界面。它是一种模型-视图-控制器(MVC)框架,简化了Web应用程序的开发。...

    Yii框架1.1版本

    6. **RESTful API开发**:Yii 1.1支持创建RESTful风格的API,这对于现代Web服务和移动应用的开发尤为重要。 7. **模板引擎**:Yii的CWebView和CTemplateView类提供了强大的模板引擎,使得视图层的开发更为灵活和...

    jdom-1.1.zip jdom-1.1.jar jdom.jar jdom库 jdom操作xml

    2. 使用`DocumentBuilder`创建一个空的`Document`对象。 3. 添加`Element`到`Document`中,可以使用`createElement()`方法。 4. 添加属性,使用`setAttribute()`方法。 5. 将`Element`添加到父`Element`中,使用`...

    struts1.1源代码

    通过阅读 Struts 1.1 的源代码,我们可以更深入地理解其内部工作原理,比如请求处理流程、对象的创建和管理、异常处理机制等。对于有基础的开发者来说,这有助于提升应用开发的效率和质量,更好地解决实际问题。希望...

    jms1.1.jar.zip

    6. Message:表示JMS中的消息对象,可以是TextMessage、ObjectMessage、BytesMessage、MapMessage等不同类型。 三、JMS 1.1关键特性 1. 持久化:JMS支持消息的持久化存储,即使在系统崩溃或网络故障后,未被消费的...

    axis1.1lib包

    Axis是一个开源项目,由Apache软件基金会维护,专门用于创建、部署和管理基于SOAP(简单对象访问协议)的Web服务。这个包包含了所有必要的库文件,使得开发者能够方便地实现客户端和服务端的Web服务功能。 Axis1.1...

Global site tag (gtag.js) - Google Analytics