JAVA中创建对象直接new创建一个对象,对么对象的创建过程是怎样的呢?
程序运行过程中有许多的对象被创建出来.那么对象是如何创建的呢?
一 对象创建的步骤
1 遇到new指令时,检查这个指令的参数是否能在常量池中找到一个符号引用
2 如果找到符号引用,就检查这个符号引用是否已经被加载,解析和初始化过
3 如果没有加载过,则执行类加载过程
4 为对象分配内存(对象所需的内存在类加载的时候就可以确定)
  1. 指针碰撞法 : 假设java堆中的内存是规整的,所有用过的内存放在一边,空闲的内存放在另一边中间放着指针作为分界点,那分配内存就是指针向着空闲的那一边移动一段与对象大小相等的距离就行了.
  2. 空闲列表法 : 如果Java堆中的内存不是规整的,已使用的内存和空闲的内存相互交错存放,那就没有办法用指针碰撞法了,虚拟机就需要维护一个列表,记录哪块内存是可用的,哪块内存是空闲的,在分配内存的时候,从列表中找到一块足够大的内存空间划分为对象实例,并更新列表
5 分配完内存后,虚拟机需要将分配到的内存初始化为0
 
问题如下:
上面两种内存分配的方法还带来了另外一个问题,即多个线程同时分配内存的情况下的安全问题
 
例如:
指针碰撞法,指针的指向还没有来得及更改的时候,另一个线程又使用了原来的指针分配内存的情况
 
解决方法:
  1. 对分配内存的动作进行同步加锁处理
  2. 把内存分配的动作在按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,称为 本地线程分配缓冲(Thread Local allocation Buffer, TLAB).哪个线程要分配内存,就先在自己的TLAB中进行,只有TLAB用完了之后并分配新的TLAB时,才需要同步锁定.
注:虚拟机是否需要开户TLAB,可以通过参数来设定
 
 
 
在上面的工作都完成后,从虚拟机的角度来看,一个新的对象已经产生了,但从Java程序员的角度来看,对象创建才刚刚开始,init方法还没有执行,所有的字符还是0,所以一般来说,执行new指令后会接着执行init方法,把对象按照程序员的意愿进行初始化,这样一个真正的对象才算完全产生出来.
 
 

2 Java对象的创建过程的更多相关文章

  1. 图解JAVA对象的创建过程

    前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能 ...

  2. 深入理解Java对象的创建过程:类的初始化与实例化

    摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...

  3. (转)深入理解Java对象的创建过程

    参考来源:http://blog.csdn.net/justloveyou_/article/details/72466416 摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一 ...

  4. Java对象的创建过程:类的初始化与实例化

    一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...

  5. java --- 对象的创建过程

    java 对象创建的过程 存在了继承关系之后,对象创建过程如下: 1.分配空间.要注意的是,分配空间不光是分配子类的空间,子类对象中包含的父类对象所需要的空间,一样在这一步统一分配.在分配的空间的时候 ...

  6. Java对象(创建过程、内存布局、访问方法)

    (Java 普通对象.不包括数组.Class 对象等.) ​ 对象创建过程 类加载 遇到 new 指令时,获取对应的符号引用,并检查该符号引用代表的类是否已被初始化.如果没有就进行类加载. 分配内存 ...

  7. Java对象的创建过程

    //TODO https://www.cnblogs.com/chenyangyao/p/5296807.html

  8. JAVA虚拟机:对象的创建过程

    简要说明的话,Java对象的创建过程分为下面几步: 1.执行相关检查: 2.为对象分配内存,将分配到的内存空间都初始化为零值: 3.进行构造代码块和构造函数的初始化 下面详细介绍这几个步骤: 1.执行 ...

  9. java中对象的创建过程

    public class Test1 { public static void main(String[] args) { new B(); System.out.println("---- ...

随机推荐

  1. 2017-2-20 C#基础 运算符

    C#的运算符主要分五种:算数运算符,关系运算符,逻辑运算符,条件运算符,赋值运算符.算术运算符有 + - * /  %    ++    --;关系运算符有    ==    !=    >   ...

  2. libviso中的姿态解算【转载】

    这篇关于libviso的文章,本人已投稿在泡泡机器人微信公众号中,放到这里,作学习笔记用. libviso一直以来被称为在视觉里程计(VO)中的老牌开源算法.它通过corner,chessboard两 ...

  3. 原来JS是这样的 - 提升, 作用域 与 闭包

    引子 长久以来一直都没有专门学过 JS ,因为之前有自己啃过 C++ ,又打过一段时间的算法竞赛(写得一手好意大利面条),于是自己折腾自己的网站的时候,一直都把 JS 当 C 写.但写的时候总会遇到一 ...

  4. 关于TCP/IP协议栈

    1. TCP/IP协议栈 与OSI参考模型不同,TCP/IP协议栈共有4层,其中网络接口层对应OSI中的物理层和数据链路层,应用层对应OSI中的应用层.表示层和会话层. 在网络接口层的主要协议有:AR ...

  5. apicloud中dialog使用方法

    var dialog = new auiDialog(); function openDialog(type){ switch (type) { case "text": dial ...

  6. Oracle 字符集设置

    因为装Linux系统时选择的是英文版,所以当需要测试中文数据库时会出现乱码,这里记录一下我修改字符集的操作. 一些命令: 1.查看sqlplus客户编码: $ echo  $NLS_LANG 2.查看 ...

  7. Cookie和Session的原理图

    Cookie Session

  8. 当前最上层的视图控制器vc 和 当前最上层的导航控制器nav

    在处理 URL Router 跳转的时候,我们经常需要得到 当前最上层的视图控制器 和 当前最上层的导航控制器 来进行视图跳转或者方法调用.- (UIViewController *)currentV ...

  9. 【阿里聚安全技术公开课】移动APP漏洞风险与解决方案

    阿里云·云栖社区携手阿里聚安全打造阿里安全技术公开课,带你一探互联网安全的风采 关于移动APP安全 移动App是大家使用手机每天接触最多的东西,然而在移动APP开发中,由于一些开发工程师对安全的不重视 ...

  10. Hibernate之关联映射(一对多和多对一映射,多对多映射)

    ~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...