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-19 C#基础 基本数据类型的转换,转义字符,常量

    1.基本数据类型的转换分两种:自动转换(隐式转换)和强制转换(显式转换).自动转换是从只类型转换到引用类型.强制转换是最长用的,是从引用类型转换到值类型或者从浮点型转换到整形.强制转换主要有三种形式: ...

  2. HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(二)

    HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(一) 下面来查看其他对保存HSTS信息的enabled_sts_hosts ...

  3. hibernate系列笔记(2)---Hibernate的核心API

    Hibernate的核心API 一般我们通过hibernate进行操作的时候,都会遵循下面的流程,那么接下来我对每一个步骤进行讲解: 1 public void testInsert() { 2 // ...

  4. Apache2.2以上版本与Tomcat整合配置及负载均衡实现

    apache2.2以上版本,无需使用jk_mod来集成tomcat,直接使用ajp,很方便. 修改apache配置文件httpd.conf 启用mod_proxy_ajp #LoadModule pr ...

  5. 了解 : angular ng-messages

    ng-messages="form['positionTitle' + languageVersion.typeEnum].$error ng-messages="form.pos ...

  6. redis的数据类型 (一) 字符串

    redis中存储方式是以键值对存储的,所以叫做字典试.redis(Remote dictionary server)远程字典服务器 每个redis数据类型,都会有增加.删除,查看的功能,用实例来学习命 ...

  7. Android布局管理详解(1)—— LinearLayout 线性布局

    Android的布局方式共有6种,分别是LinearLayout(线性布局).TableLayout(表格布局).FrameLayout(帧布局).RelativeLayout(相对布局).GridL ...

  8. 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚

    1651: [Usaco2006 Feb]Stall Reservations 专用牛棚 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 566  Sol ...

  9. JavaMail邮件发送不成功的那些坑人情况及分析说明

    [我的Segmentfault原文]https://segmentfault.com/a/1190000008030346 前言   JavaMail的使用本身并不难,网上有不少案例,简单易懂,而且有 ...

  10. 解决此问题:Oracle 删除用户时报 “必须指定 CASCADE 以删除 'SE'”,

    这说明你要删除的oracle 用户"SE" 下面还有数据库对象,如 table, view 等,这样你删除用户时必须加选项 cascade:drop user se cascade ...