普通对象的创建(不包括数组和class对象)

  当虚拟机遇到new指令时,会在常量池中检查是否包含这个类的符号引用(全限定名),通过这个确定是否经过类加载的过程,如果true,为该

对象分配内存,对象大小在类加载过程就已经确定。如果false,需要进行类加载。

分配内存

1、分配内存的方式:

  指针碰撞:如果内存是绝对规整的,使用过的在一边,未使用过的在另一边,中间有个指针作为分界点的指示器,为对象分配内存的时候,只需

要向未使用过的一边移动与对象大小相同的距离完成内存分配

  空闲列表:内存非规整的情况下,jvm通过维护一个列表记录哪些内存可用,在分配内存的时候,从列表里面找到一个大于对象大小的内存进行

分配,并且更新列表记录使用哪种内存分配方式取决于使用哪种垃圾收集器:

  Serial、ParNew等带有Compact过程,采用指针碰撞

  类似CMS这种基于Mark-Sweep算法的收集器,采用空闲列表

2、并发环境下分配内存

  如果给对象A分配内存的时候,指针还没来及修改,对象B使用原来的指针来分配内存(类似脏读)

解决方案

  ①.对分配内存的动作进行同步处理--通过CAS+失败重试的方式保证操作的原子性(了解CAS机制可以查看Atomic源码)

  ②.使用本地线程缓冲区TLAB,就是为每个线程在堆中预先分配一小块内存,各个线程分配内存相互不影响(类似ThreadLocal变量概念),只

有在TLAB用完重新分配新的TLAB时,才需要进行同步处理。通过-XX:+/-UseTLAB参数配置是否使用TLAB

  上述分配内存动作完成。

初始化内存

  此时,jvm将分配的内存空间初始化为零值(不包含对象头),如果使用TLAB,在分配TLAB时提前完成这一步

作用:

  为了保证用户没有赋初值的情况下也是可以使用

  然后设置对象头保存的一些信息,例如:这个对象是哪个类的实例,如何找到类的元数据信息、对象的哈希码、GC分代年龄等。
  都完成之后,VM角度来看,一个对象已经产生,但程序的角度,对象创建才刚开始——<init>方法还没执行,所有字段都是零值,初始化过程,

一个真正的对象才完成

对象的内存布局(HotSpot)

1、对象头Header

  ①存储对象本身的运行时数据,如hashcode,GC分代年龄、锁状态标志、线程持有的锁等

  ②类型指针:对象指向本身类元数据的指针,虚拟机就是通过类型指针确定对象是哪个类的实例。但不是所有的对象都保存类型指针,所以查

找类的元数据也不一定通过对象本身

  针对数组,Header还要一个记录数组长度的数据,因此无法通过数组的元数据确定数组大小,但是普通java对象是可以的

2、实例数据Instance Data

  对象真正存储的有效数据,也就是代码定义的各种类型字段,无论是从父类继承的,还是子类本身定义的。相同宽度的字段被分配到一起。满

足这个条件前提下,父类定义到子类前,但是如果CompactFields=true,子类较小的变量也可能插入到父类变量的空隙

3、对齐填充Padding

  不是必然存在的,没有特别的意义,起着占位符的作用,对象起始地址要是8字节的整数倍,就是对象的大小必须是8字节的整数倍,对象头是8

字节的1倍或2倍,当对象实例数据部分没有对齐时,需要对齐填充来补全。

对象的访问定位

  java程序通过栈中的reference操作堆中的具体数据。

定位方式:

  ①.句柄访问(间接):堆中维护一个句柄池,本地变量表中reference存储的就是对象的句柄地址,句柄池包含了对象实例数据(堆)和类型数

据(方法区)各自的地址信息

  ②.直接指针访问:reference中存储的就是对象实例数据,实例数据有指向方法区中的对象类型数据的指针

对比

  句柄访问的优点:reference中保存的只是句柄地址,如果对象GC被移动只需要改变实例数据指针,reference本身不需要改变

  指针访问的优点:速度更快。节省一次指针定位的时间开销,因为对象访问在java很频繁,所以节省的时间开销是很客观的。HotSpot采用指针访问

java虚拟机(三)--HotSpot 对象的更多相关文章

  1. 深入理解Java虚拟机(二)——HotSpot对象创建、内存、访问

    对象的创建 虚拟机遇到一条字节码new指令时,开始对象创建过程. 首先去检查这个指令的参数是否能在常量池定位到一个类的符号引用: 检查这个符号引用代表的类是否已被加载.解析和初始化,如果没有就必须执行 ...

  2. Java虚拟机三:OutOfMemoryError异常分析

    根据Java虚拟机规范,虚拟机内存中除过程序计数器之外的运行时数据区域都会发生OutOfMemoryError(OOM),本文将通过实际例子验证分析各个数据区域OOM的情况.为了更贴近生产,本次所有例 ...

  3. 深入理解java虚拟机(三)-----类加载机制

    类加载机制jvm把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被jvm直接使用的java类型.在java中,类型的加载.连接和初始化都是在程序运行期间完成的 ...

  4. 深入理解Java虚拟机(三)——垃圾回收策略

    所谓垃圾收集器的作用就是回收内存空间中不需要了的内容,需要解决的问题是回收哪些数据,什么时候回收,怎么回收. Java虚拟机的内存分为五个部分:程序计数器.虚拟机栈.本地方法栈.堆和方法区. 其中程序 ...

  5. 深入理解Java虚拟机(四)——HotSpot垃圾收集器详解

    垃圾收集器 新生代收集器 1.Serial收集器 特点: 单线程工作,收集的时候就会停止其他所有工作线程,用户不可知不可控,会使得用户界面出现停顿. 简单高效,是所有收集器中额外内存消耗最少的. 没有 ...

  6. Java虚拟机三 Java堆和栈

    Java堆是和Java应用程序关系最为紧密的内存空间,几乎所有的对象都存放在堆中.并且堆是完全自动化管理的. 根据垃圾回收机制的不同,Java堆有可能有不同的结构.最为常见的一种就是将整个Java堆分 ...

  7. 虚拟机性能监控与故障处理工具(深入理解java虚拟机三)

    JDK自带的工具可以方便的帮助我们处理一些问题,包括查看JVM参数,分析内存变化,查看内存区域,查看线程等信息. 我们熟悉的有java.exe,javac.exe,javap.exe(偶尔用),jps ...

  8. 深入理解Java虚拟机(三)、垃圾收集算法

    1.第一门真正使用内存动态分配和垃圾收集技术的语言:Lisp 2.程序计数器.虚拟机栈.本地方法栈这3个区域随线程而生灭,这几个区域的内存会随着方法结束或线程结束而回收,GC关注的是Java堆和方法区 ...

  9. 基于Java的三种对象持久化方式

    1:序列化技术: 序列化的过程就是将对象写入字节流和从字节流中读取对象.将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,可以通过管道或线程读取,或通过网络连接将对象 ...

随机推荐

  1. 关于hive

    这两天在研究了hbase,hadoop,hive,spark 由于spark.py不支持clust(jar才支持,但是太麻烦了>_<) 所以最终决定使用hive 在hive中用create ...

  2. 利用 C# dynamic 减少创建模型类

    C# 的 dynamic 关键字可以是C#可以像 javascript 这种弱类型语言一样具有随时可以添加属性的能力.C# 是一种强类型语言,dynamic 要摆脱类型的限制,自然是有代价的.这里不讨 ...

  3. go语言---for

    go语言---for https://blog.csdn.net/cyk2396/article/details/78873930 执行以下代码,发现无法跳出for循环: func SelectTes ...

  4. 【POJ 2983】 Is the information reliable?

    [题目链接] 点击打开链接 [算法] 差分约束系统,SPFA判负环 [代码] #include <algorithm> #include <bitset> #include & ...

  5. 第六周 Leetcode 446. Arithmetic Slices II - Subsequence (HARD)

    Leetcode443 题意:给一个长度1000内的整数数列,求有多少个等差的子数列. 如 [2,4,6,8,10]有7个等差子数列. 想了一个O(n^2logn)的DP算法 DP[i][j]为 对于 ...

  6. Line: 220 - com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1

    转自:http://blog.51cto.com/alinazh/1276363 在启动tomcat的时候出现错误: Line: 220 - com/opensymphony/xwork2/sprin ...

  7. 私有CA和证书

    证书类型 证书授权机构的证书 服务器 用户证书 获取证书两种方法 使用证书授权机构: 生成签名请求(csr ) 将csr发送给CA 从CA处接收签名 自签名的证书: 自已签发自己的公钥 openSSL ...

  8. js中return的作用及用法

    这里面的return含有一些细节知识: 例如:onClick='return add_onclick()'与 onClick='add_onclick()'的区别 JAVASCRIPT在事件中调用函数 ...

  9. Python机器学习算法 — 支持向量机(SVM)

    SVM--简介 <α∗j<C,可得:          构造决策函数:  5.求最优解         要求解的最优化问题如下:          考虑使用序列最小最优化算法(SMO,se ...

  10. bzoj 1638: [Usaco2007 Mar]Cow Traffic 奶牛交通【记忆化搜索】

    震惊!记忆化搜索忘记返回map值调了半小时! 边(u,v)的经过次数是:能到u的牛数*v到n的方案数.正反两次连边,dfs两次即可 #include<iostream> #include& ...