美文网首页
对象的创建及内存分布

对象的创建及内存分布

作者: 饺子呀呀 | 来源:发表于2018-01-24 19:43 被阅读0次

下面简单总结一下对象的创建及其内存分布(以下只讨论普通Java对象,不包括数组和Class对象)


知识结构

1.了解对象的内存分布

  1. 对象内存分配在堆中(绝大部分普通Java对象,像Class对象是分配在方法区中的)
  2. 对象开始的部分是对象头,包括两部分信息
  • 第一部分是自身运行时数据,存放了跟对象有关的信息,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等
  • 第二部分是类型指针,即对象指向它的类元数据的指针。可以通过它知道该对象是哪个类的实例
  1. 中间是实例数据,就是在程序代码中定义的各种类型的字段内容。包括从父类继承下来的。执行<init>的时候也要执行父类的初始化
  2. 最后是对齐填充,没有特殊含义,就是为了让对象大小为8的整数倍

2.实例化前先找类,相当于“模板” (检查该类是否被加载过)

当虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用(注:这个的作用是检查你想实例化的类是否真的存在,具体怎么检查可以自己去了解一下类文件结构中常量池部分,简单来说就是编译期的时候执行new指令的这个类在编译成Class文件的时候,它的常量池已经存放了想实例化的类名了),然后再检查这个类是否已经被加载、解析、初始化过了。若没有则先进行类加载。

3.有了类,就把类实例化,就是对象的创建

  1. 分配内存,先在堆中开辟空间,对象大小在类加载完之后可完全确定。
  2. 内存分配完之后,把空间都初始化为零值。
  3. 设置对象头,对象头存放了关于这个对象的信息。
  4. 初始化,根据代码,执行<init>方法,给字段赋值

相关文章

  • 对象的创建及内存分布

    下面简单总结一下对象的创建及其内存分布(以下只讨论普通Java对象,不包括数组和Class对象) 1.了解对象的内...

  • 【JVM】2、对象(Hot Spot虚拟机)

    对象的创建类加载分配内存方式方案对象初始化对象头(Object Header)设置创建完成 对象的内存分布对象头实...

  • 深入理解引用与引用传递

    1.引用的本质 比如示例代码: 该代码内存及引用创建过程 (1) 在堆内存创建object对象,对象地址为40f1...

  • Java对象创建与内存分布

    本文主要讲述Java对象在虚拟机中创建,分配内存,初始化的过程,以及分配内存,引用对象的几种常见方式。 对象创建 ...

  • 对象的内存布局、创建及对象的访问

    1.对象内存布局 1)对象头: 1>第一部分:用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线...

  • isa的理解及对象的内存地址分布

    栈内存分布是连续的,在创建对象开辟内存的过程中,isa是对象的第一个成员变量。isa到底是什么看看官方解释:Eve...

  • Effective Objective-C读后笔记(1)

    1、Objective-C中的内存分布 对象类型内存分布在堆里面,是直接管理内存。 指针类型分布在栈里面系统帮我们...

  • JVM 常见内容汇总

    面试题 对象 对象的创建 分配内存 对象头 内存溢出 内存溢出与内存泄漏 内存溢出:系统无法再分配内存空间。 内存...

  • iOS性能优化方方面面

    参考文章: iOS内存、缓存及存储优化 懒加载 视图控制对象通过alloc和init来创建,但是视图控制对象不会在...

  • Matplotlib 循环绘制多个图,内存溢出merroy er

    内存错误的原因是figure对象重复建立。要在for循环外创建一个fig对象,循环利用,最后利用。cla()及.c...

网友评论

      本文标题:对象的创建及内存分布

      本文链接:https://www.haomeiwen.com/subject/veqpaxtx.html