一、对象的创建过程

对象的创建过程大致可以分为六步,其中对象的分配尤为重要:

二、对象分配内存

一般来说对象分配内存有两种方式:

第一种是指针碰撞,这是一种比较理想的方式:如果Java堆是绝对规整的:一边是用过的内存,一边是空闲的内存,中间一个指针作为边界指示器;分配内存只需向空闲那边移动指针,这种分配方式称为"指针碰撞"(Bump the Pointer);

第二中方式是空闲列表,这中方式没有指针碰撞那么理想,但是也有他自身的优势:如果Java堆不是规整的:用过的和空闲的内存相互交错; 需要维护一个列表,记录哪些内存可用;分配内存时查表找到一个足够大的内存,并更新列表,这种分配方式称为"空闲列表"(Free List);

这两种方式各有各的优势,具体选用方式,需要根据垃圾收集器来进行选择,主要是根据垃圾回收器有无压缩来选择。

三、线程安全问题

在进行并发操作时,上面两种方式分配内存的操作都不是线程安全的,所以考虑到解决这种线程安全问题:

第一种:加锁,这种方式是开发过程中最容易使用的方式,也是最简单的方式,但是这种方式的缺点就是执行效率太低。

第二种:本地线程分配缓冲区(TLAB):把分配内存的动作按照线程划分在不同的空间中进行:在每个线程在Java堆预先分配一小块内存,称为本地线程分配缓冲区(Thread Local Allocation Buffer,TLAB);哪个线程需要分配内存就从哪个线程的TLAB上分配。

四、对象的结构

对象的结构分为三部分:

第一部分:Header(对象头),对象头又有两给部块组成

1.自身运行时数据(Mark word),这部分数据是对象主要存储的数据,主要有:

a.哈希值:这个值是通过一个native方法获取

b.GC分代年龄:这个是垃圾回收算法使用

以上介绍两种作用是太相同的,至于剩下的:c.锁状态标志、d.线程持有的锁、e.偏向线程ID、f.偏向时间戳都是作用于线程优化的

2.类型指针:对象指向类对象本身数据的指针

第二部分:实例数据(InstanceData):

实例数据部分是对象真正存储的有效信息,也既是我们在程序代码里面所定义的各种类型的字段内容,无论是从父类继承下来的,还是在子类中定义的都需要记录下来。 这部分的存储顺序会受到虚拟机分配策略参数(FieldsAllocationStyle)和字段在Java源码中定义顺序的影响。HotSpot虚拟机 默认的分配策略为longs/doubles、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Pointers),从分配策略中可以看出,相同宽度的字段总是被分配到一起。在满足这个前提条件的情况下,在父类中定义的变量会出现在子类之前。如果 CompactFields参数值为true(默认为true),那子类之中较窄的变量也可能会插入到父类变量的空隙之中。

第三部分:对齐填充(Padding)

第三部分对齐填充并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。由于HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说就是对象的大小必须是8字节的整数倍。对象头正好是8字节的倍数(1倍或者2倍),因此当对象实例数据部分没有对齐的话,就需要通过对齐填充来补全。

五、对象的访问定位

对立对象是为了使用对象.Java程序需要通过在栈上的reference数据操作堆上的具体对象. 由于reference类型在Java虚拟机规范中只规定了一个指向对象的引用,并没有定义这个引用应该通过何种方式去定位,访问堆中的对象的具体位置,所以对象的访问方式取决于虚拟机的实现而定的.。简单来说 栈指向堆中只会指向地址,至于地址存储的是否对象,我们是无法知道的,

    解决这一问题目前有两种方式:

第一种:句柄指针:栈指向堆中的句柄池,句柄池中有实例对象的地址,通过句柄池指向对象

优点:栈地址永远不会改变,或者说引用地址不会改变

第二张:直接指针:reference中存储直接对象的地址,但是必须考虑放置访问类型数据的相关信息

优点:效率快,节省了一次指针定位的时间开销

转载于:https://www.cnblogs.com/daijiting/p/9960783.html

深入了解java虚拟机(JVM) 第四章 对象的创建相关推荐

  1. 【深入Java虚拟机JVM 05】HotSpot对象探秘

    说明:文章所有内容均摘自<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> 介绍完Java虚拟机的运行时数据区之后,我们大致知道了虚拟机内存的概况,读者了解了内存中放了些什么后 ...

  2. Java核心技术卷Ⅰ-第四章对象和类

    重点 1.使用预定义类 2.方法参数 3.对象构造 4.包 5.类设计技巧 1.使用预定义类 一个源文件只能有一个公共类,可以有任意数目的非公共类 可以使用通配符调用Java编译器:javac Tes ...

  3. 深入理解java虚拟机 - jvm高级特性与最佳实践(第三版)_JVM虚拟机面试指南:年薪30W以上高薪岗位需求的JVM,你必须要懂!...

    JVM的重要性 很多人对于为什么要学JVM这个问题,他们的答案都是:因为面试.无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎.不管是工作还是面试中,JVM都是必考题.如果不懂JVM的话,薪 ...

  4. [三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符

    说明,本文的目的在于从宏观逻辑上介绍清楚绝大多数的字节码指令的含义以及分类 只要认真阅读本文必然能够对字节码指令集有所了解 如果需要了解清楚每一个指令的具体详尽用法,请参阅虚拟机规范 指令简介 计算机 ...

  5. 深入理解Java虚拟机——JVM垃圾回收机制和垃圾收集器详解

    一:概述 说起垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,顾名思义,垃圾回收就是释 ...

  6. 《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记

    <深入理解Java虚拟机>阅读笔记 本repository为<深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)>阅读笔记,因为第一章主要讲的是Java的发展历史, ...

  7. 深入理解Java虚拟机——JVM类加载机制(类加载过程和类加载器)

    一.什么是类加载机制? 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 二.类加载的时机 类 ...

  8. 【读书笔记】实战JAVA虚拟机JVM故障诊断与性能优化 读书笔记

    文章目录 1.概述 1.1 **第一章:初探java虚拟机** 1.2 认识java虚拟机的基本结构 1.3 常用Java虚拟机参数 1.4 垃圾回收器 1.5 垃圾收集器以及内存分配 1.6 性能监 ...

  9. 实战java虚拟机 百度云_《实战JAVA虚拟机 JVM故障诊断与性能优化》pdf百度云下载...

    内容简介· · · · · · 随着越来越多的第三方语言(Groovy.Scala.JRuby等)在Java虚拟机上运行,Java也俨然成为了一个充满活力的生态圈.<实战Java虚拟机--JVM ...

最新文章

  1. c 找文件服务器文件,Linux C/C++项目:虚拟文件服务器(功能匹配百度网盘)
  2. Linux那些事儿 之 戏说USB(32)驱动的生命线(四)
  3. ComboBox的数据联动
  4. Boost:boost::bimaps::unordered_set_of的测试程序
  5. android刷新时的圆形动画_Android动画篇(一):圆形进度条CircleProgressBar
  6. (10)FPGA面试题多位信号同步问题
  7. 自动工作负载信息库 AWR
  8. kali创建python脚本_kali下编译学习python3
  9. Ubuntu安装SublimeText3
  10. docker 发布springBoot项目
  11. python中的引用怎么理解_浅谈动态类型领域中 Python 的变量、对象以及引用
  12. 微星主板更新BIOS能识别U盘但读取不到BIOS文件
  13. js统计页面刷新次数
  14. VB里怎样使用GetWindowRect、GetClientRect、ScreenToClient、ClientToScreen
  15. 得物(毒)APP,8位抽奖码需求,这不就是产品给我留的数学作业!
  16. java pdf 背景图,Java 设置PDF文档背景——单色背景、图片背景
  17. win7系统访问局域网中的wamp服务器
  18. 泰克MSO2014B|MSO2024B|MSO2022B混合信号示波器使用教程
  19. 当心PayPal,Amazon认真对待付款
  20. 大一c语言程序课程报告,大一C语言课程设计.doc

热门文章

  1. Spring bean 不被 GC 的真正原因
  2. docker 安装mysql_Docker安装MySQL完整版流程
  3. 如何计算_振动筛处理能力如何计算呢
  4. 发生在“注解”@的那些事儿
  5. mysql导出数据意义_11、mysql导出数据
  6. linux子系统安装gromacs,科学网—Windows下GROMACS程序的编译 - 李继存的博文
  7. tsd3dmapper软件使用方法_TOYO模组选型软件使用方法
  8. (bfs)连连看(hdu1175)
  9. (贪心)区间问题大致思路
  10. base64 java php_利用PHP将图片转换成base64编码的实现方法