深入理解Java对象(理清关系)

1、对象的创建过程:

所有创建过程如下所示:

  • new 类名
  • 根据new的参数在常量池中定位一个类的符号引用。
  • 如果没有找到这个符号引用,说明类还没有被加载,则进行类的加载、解析和初始化。
  • 虚拟机为对象分配内存(位于堆中)
  • 将分配的内存初始化为零值(不包括对象头)
  • 调用对象的<init>方法(包括代码块和构造方法)

2、如何给对象分配内存

  • 1.指针碰撞

    • 系统按照指针移动来分配内存。
  • 2.空闲列表
    • 系统需要维护一个链表,来维护哪些模块可用,以便分配内存

3、线程安全性问题

  • 线程同步

    • 最简单的实现方式,给资源加锁,不过很慢
  • 本地线程分配缓冲(TLAB)
    • 为每个线程都单独的分配一块堆内存。

4、对象的结构

  • Header(对象头)

    • 占用内存如下所示
    • 自身运行时的数据(Mark Word)
      • 哈希值
      • GC分代年龄(为了分代收集算法所服务)
      • 锁状态标志
      • 线程持有锁
      • 偏向线程ID
      • 偏向时间戳
    • 类型指针
  • InstanceData(存储对象的有效信息)
    • 我们经常见的示例数据。
  • Padding(对齐填充)
    • 因为JVM必须要8位字符。实际上这个就是凑数的。

5、对象的访问定位

  • 使用句柄

    • 对象引用指向了一个句柄池,通过句柄池找到对象的真正地址。
  • 直接指针(HotSpot虚拟机采用的就是这种方式)
    • 从对象引用直接指向对象的真正地址。

注:不管是直接使用还是直接指针,都需要保存俩个指针,一个到对象实例的指针,另一个是到对象类型数据的指针。

深入理解Java对象的更多相关文章

  1. 理解Java对象序列化(二)

    关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Th ...

  2. 深入理解Java对象的创建过程:类的初始化与实例化

    摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...

  3. 深入理解Java对象序列化

    关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Th ...

  4. (转)深入理解Java对象的创建过程

    参考来源:http://blog.csdn.net/justloveyou_/article/details/72466416 摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一 ...

  5. 理解Java对象序列化【转】

      原文链接:http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html 关于Java序列化的文章早已是汗牛充栋了,本文是 ...

  6. 彻底理解Java对象与引用

    本文是最近在复习Java的时候读到的来自iteye博客的一篇文章,个人觉得写的很好,但貌似楼主许久没有维护该博客,害怕将来想回顾的时候找不到此文章,故在此重写文章,并修改了一些排版,有助于以后的学习查 ...

  7. 理解Java对象:要从内存布局及底层机制说起,话说….

    前言 大家好,又见面了,今天是JVM专题的第二篇文章,在上一篇文章中我们说了Java的类和对象在JVM中的存储方式,并使用HSDB进行佐证,没有看过上一篇文章的小伙伴可以点这里:<类和对象在JV ...

  8. 并发王者课-青铜5:一探究竟-如何从synchronized理解Java对象头中的锁

    在前面的文章<青铜4:synchronized用法初体验>中,我们已经提到锁的概念,并指出synchronized是锁机制的一种实现.可是,这么说未免太过抽象,你可能无法直观地理解锁究竟是 ...

  9. 理解Java对象序列化

    http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html 1. 什么是Java对象序列化 Java平台允许我们在内存中创 ...

随机推荐

  1. 用canvas画一个时钟

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. cnblogs停止更新,同步到个人博客!

    cnblogs停止更新,同步到个人博客 https://dengpeng.me/!             个人博客地址: https://dengpeng.me

  3. 软工个人项目(Java实现)

    一. Github地址: https://github.com/RuiBingo/PersonalWork 二.个人PSP表格: PSP2.1 PSP阶段 预估耗时(分钟) 实际耗时(分钟) Plan ...

  4. SQL学习_SELECT

    查询列: SQL:SELECT name FROM heros 多列查询: SQL:SELECT name, hp_max, mp_max, attack_max, defense_max FROM ...

  5. 7.JavaCC官方入门指南-例2

    例2:整数加法运算--改良版(增强语法分析器) 1.修改   上一个例子中,JavaCC为BNF生产式所生成的方法,比如Start(),这些方法默认只简单的检查输入是否匹配BNF生产式指定的规范.但是 ...

  6. 《大话处理器》Cache一致性协议之MESI【转】

    转自:https://blog.csdn.net/muxiqingyang/article/details/6615199 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载 ...

  7. 修改postgresql 密码

    sudo -u postgres psql -c "alter user postgres password '123456';"

  8. cannot resolve symbol 'XXX'

    原因:出现这种情况的原因是在IDEA或者myeclipse编译器中没有导入相关的jar包(jar包相当于类的集合,可以使用其中的类): 针对IDEA出现cannot resolve symbol 'X ...

  9. 密度峰值聚类算法(DPC)

    密度峰值聚类算法(DPC) 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 简介 基于密度峰值的聚类算法全称为基于快速搜索和发现密度峰值的聚类算法(cl ...

  10. 8.Python网络编程_多线程死锁

    死锁:指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死 ...