深入理解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. 被 GANs 虐千百遍后,我总结出来的 10 条训练经验

    一年前,我决定开始探索生成式对抗网络(GANs).自从我对深度学习产生兴趣以来,我就一直对它们很着迷,主要是因为深度学习能做到很多不可置信的事情.当我想到人工智能的时候,GAN是我脑海中最先出现的一个 ...

  2. React教程:4 个 useState Hook 示例

    摘要: React示例教程. 原文:快速了解 React Hooks 原理 译者:前端小智 到 React 16.8 目前为止,如果编写函数组件,然后遇到需要添加状态的情况,咱们就必须将组件转换为类组 ...

  3. 在宿主机上执行docker容器内部的shell或程序

    为了避免反复进入docker容器内部操作,可以将一系列容器内部的指令由宿主机来操作完成. 在宿主机(作者主机为windows7)上执行centos容器(name为centos-1)中/usr目录下的“ ...

  4. envoy的配置文件的样子

    yaml文件 admin: access_log_path: /tmp/admin_access.log address: socket_address: protocol: TCP address: ...

  5. C# 内存管理(一)

    引用地址:https://blog.csdn.net/libohuiyuan/article/details/81030010 一.变量类型 C#的变量类型分为值类型,引用类型.指针类型和指令类型.所 ...

  6. to_sql, to_csv, to_excel, to_json

    1.to_sql def to_sql(self, name, con, schema=None, if_exists="fail", index=True, index_labe ...

  7. monkey和monkeyrunner的区别

    简单来说: 1.monkey是在设备或模拟器直接运行adb shell命令生成随机事件来进行测试 2.monkeyrunner是通过API发送特定的命令和事件来控制设备 为了支持黑盒自动化测试的场景, ...

  8. selenium中driver.close()和driver.quit()的不同点

    driver.quit()与driver.close()的不同:driver.quit(): Quit this driver, closing every associated windows;dr ...

  9. Apex 企业设计模式

    FFLIB 是一个免费的框架,对 Apex 进行了扩展.它的结构实现了 Salesforce 推荐的Apex 企业设计模式. 在学习如何使用 FFLIB 框架之前,我们先来了解一下 Apex 企业设计 ...

  10. [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机

    [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机 题意 给定平面上的 \(n\) 个整点 \((x_i,y_i)\), 一共有两个问题. 第一个问题是从原 ...