深入理解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. 848. Shifting Letters

    问题描述: 问题规约为:对每一个数组S,移动(shifts[0] + shitfs[1]+...+shitfs[i] )mod 26位 def shiftingLetters(self, S: str ...

  2. android 电容屏(四):驱动调试之驱动程序分析篇 -- FocalTech

    本人用的触摸屏IC是FocalTech公司的ft5306,是一款i2c的电容屏多点触控芯片.对于它的整体驱动官方已经给了,我们就触摸屏和按键部分的代码做相关说明.说明其中应该注意的地方. 对于所有的i ...

  3. CPU 架构SMP/NUMA,调优

    CPU 架构SMP/NUMA,调优 SMP:全称是"对称多处理"(Symmetrical Multi-Processing)技术 . 是指在一个计算机上汇集了一组处理器(多CPU) ...

  4. 使history命令显示时间

      添加环境变量HISTTIMEFORMAT就行了 # export HISTTIMEFORMAT='%F %T ' .csharpcode, .csharpcode pre { font-size: ...

  5. 01-路由跳转 安装less this.$router.replace(path) 解决vue/cli3.0语法报错问题

    2==解决vue2.0里面控制台包的一些语法错误. https://www.jianshu.com/p/5e0a1541418b 在build==>webpack.base.conf.j下注释掉 ...

  6. vue全局路由守卫beforeEach+token验证+node

    在后端安装jsonwebtoken         npm i jsonwebtoken --save 在 login.js文件中引入      // 引入jwtconst jwt = require ...

  7. python 生成sql语句

    1. 别名 s = '' name = ['张三', '李四', '王五'] for i in range(len(name)): s += "'" + name[i] + &qu ...

  8. linux 安装盘作为 repo

    1) CentOS 7.7 安装完之后, /etc/yum.repos.d 下面有很多.repo. 其中有一个CentOS-Media.repo. 编辑文件把enabled 改成 1 . 然后把其他. ...

  9. 记录错误or日记(更新中)

    前言: 从2018.8-17开始记录 本篇随笔记录做题时的小错误(大多数),考试总结(懒得总结了),做过的每个题的错误 2019.12.7 傻逼学校,给我三个小时假期给你们做题挣工资 2019.11. ...

  10. Note | Ubuntu18.04安装与配置

    目标: 在服务器上配置最新的Ubuntu稳定版本18.04 LTS.18.04比16.04好看很多,非常建议. 有3块硬盘:2块4TB机械硬盘,1块2TB固态硬盘.计划将固态硬盘作为主硬盘,其余两块机 ...