深入理解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. javascript json的使用

    转自:http://blog.csdn.net/lushuaiyin/article/details/7061483 对于js使用json,首先到官网拷贝json.js文件,地址http://www. ...

  2. SIP协议分析

    - SIP流程 一个标准的SIP通话流程如下: 1. A向B发送一个INVITE消息,邀请B通话. 2.B振铃,向A回复一个RING消息,通知A振铃中,A等待. 3.B提机,向A发一个OK消息,  通 ...

  3. linux远程桌面连接 VNC Server

    更新源 # sudo apt-get update 安装vnc4server # sudo apt-get install vnc4server 修改vnc远程连接密码 # vncpasswd 编辑v ...

  4. linux下搭建jenkins

    为了配合上一篇的ant+jenkins做持续集成,需要在linux环境下搭建一个jenkins平台.网上有很多安装的例子,我主要记录一下自己遇到的问题,真真的是特别惆怅的,每次我遇到的问题都格外多. ...

  5. vue中点击按钮复制内容

    <el-button type="primary" round size="mini" @click="copyUrl">复制u ...

  6. redis做持久化的两种方式,RDB、AOF讲解

    redis的两种持久化方式: 1.RDB方式 概念:在指定的时间间隔内保存数据快照 实现方式: 找到redis的安装目录,修改redis的配置文件(redis.conf):① 修改备份的时间间隔:sa ...

  7. [PHP] 基于redis的分布式锁防止高并发重复请求

    需求:我们先举个某系统验证的列子:(A渠道系统,业务B系统,外部厂商C系统) (1)B业务系统调用A渠道系统,验证传入的手机.身份证.姓名三要素是否一致. (2)A渠道系统再调用外部厂商C系统. (3 ...

  8. SpringCloud学习笔记(九、SpringCloud Stream)

    目录: 什么是SpringCloud Stream 如何使用SpringCloud Stream 消息分流 什么是SpringCloud Stream: SpringCloud Stream是一个用于 ...

  9. 七,专著研读(Logistic回归)

    七,专著研读(Logistic回归) 分类:k-近邻算法,决策树,朴素贝叶斯,Logistic回归,支持向量机,AdaBoost算法. 运用 k-近邻算法,使用距离计算来实现分类 决策树,构建直观的树 ...

  10. 浅谈C++ STL queue 容器

    浅谈C++ STL queue 容器 本篇随笔简单介绍一下\(C++STL\)中\(queue\)容器的使用方法和常见的使用技巧.\(queue\)容器是\(C++STL\)的一种比较基本的容器.我们 ...