简介

在进行Java编程时,我们通常需要通过new创建一个对象的实例。

Object obj = new Object();

做了三件事

(1)为对象创建了对象空间;

(2)调用类的构造方法;

(3)将生成对象的地址返回。

具体步骤

1,首先到常量池中找类的带路径全名,然后检查对应的字节码是否已被加载,解析,验证,初始化,如果没有先执行类加载过程(class.forname())。

2,类加载过程完成后,虚拟机会为对象分配内存。分配内存有两种方式,根据使用的垃圾收集器的不同使用不同的分配机制。

(1)指针碰撞,当虚拟机使用复制算法或标记整理算法实现的垃圾收集器时,内存区域都是规整的,这时候使用指针碰撞分配内存,用过的内存放在一边,空闲的内存在另一边,中间用一个指针作为分界点,当需要为新对象分配内存时只需把指针向空闲的一边移动一段与对象大小相等的距离。

(2)空闲列表,当虚拟机使用标记清除算法实现的垃圾收集器时,内存都是碎片化的,那虚拟机就要记录哪块内存是可用的,当需要分配内存时,找一块足够大的内存空间给对象实例,并更新记录。

3,设置对象头信息,如所属类,元数据信息,哈希码,gc分代年龄,等等。

4,调用对象的init()方法,根据传入的属性值给对象属性赋值。

5,在线程栈中新建对象引用,并指向堆中刚刚新建的对象实例。

注意

如果类首次加载及new对象:
1、先执行父类的静态代码块和静态变量初始化,并且静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。 (静态函数只初始化,函数被动调用,代码块是主动调用)
2、执行子类的静态代码块和静态变量初始化。

开始new对象

3、执行父类的实例变量初始化
4、执行父类的构造函数
5、执行子类的实例变量初始化
6、执行子类的构造函数

如果类已经被加载及new对象:
则静态代码块和静态变量就不用重复执行,再创建类对象时,只执行与实例相关的变量初始化和构造方法。

如果大家对java架构相关感兴趣,可以关注下面公众号,会持续更新java基础面试题, netty, spring boot,spring cloud等系列文章,一系列干货随时送达, 超神之路从此展开, BTAJ不再是梦想!

浅析new一个对象的过程相关推荐

  1. 浅析I/O处理过程与存储性能的关系

    浅析I/O处理过程与存储性能的关系 https://community.emc.com/docs/DOC-28653 性能"这个词可以说伴随着整个IT行业的发展,每次新的技术出现,从硬件到软 ...

  2. Java之new一个对象简单过程

    1 问题 new一个对象简单过程 2 过程 1)类加载过程(第一次使用该类) 先看这个类有没有加载到内存,没有的话下面操作 (1).加载:类加载器(双亲委派模式)通过全限名读取类的二进制流到jvm内部 ...

  3. new一个对象的过程中发生了什么

    本文来说下new一个对象的过程中发生了什么 文章目录 概述 类加载过程(第一次使用该类) 创建对象 本文小结 概述 Java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话 ...

  4. 我国计算机的创新,浅析计算机技术的创新过程

    <浅析计算机技术的创新过程>由会员分享,可在线阅读,更多相关<浅析计算机技术的创新过程(5页珍藏版)>请在人人文库网上搜索. 1.浅析计算机技术的创新过程浅析计算机技术的创新过 ...

  5. PDD面试题:new一个对象的过程中发生了什么?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:沉默哥 来源:https://url.cn/5V55xBu ...

  6. Java:new一个对象的过程中发生了什么?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:沉默哥 cnblogs.com/JackPn/p/93861 ...

  7. .net 把一个对象赋值给一个参数_Java:new一个对象的过程中发生了什么?

    作者:沉默哥http://cnblogs.com/JackPn/p/9386182.html java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定 ...

  8. 面试官:new一个对象的过程中发生了什么

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"加入公众号专属技术群 作者:沉默哥 来源:http://uee.me/c3PR6 ...

  9. java new一个对象的过程中发生了什么

    java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载.加载并初始化类完成后,再进行对象的创建工作. 我们先假设是第一次使用该类,这样的话n ...

  10. idea查看一个类的所有子类_java new一个对象的过程中发生了什么

    java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载.加载并初始化类完成后,再进行对象的创建工作. 我们先假设是第一次使用该类,这样的话n ...

最新文章

  1. div+css多浏览器测试方法
  2. WINCE6.0+S3C2443的启动过程---eboot2
  3. vue transition
  4. ARM版本系列及家族成员梳理
  5. 如何快速部署一个Elasticsearch集群?
  6. 某一年某一年_一年关于开放组织的对话
  7. sqlserver日志文件在哪_用友SQL SERVER数据库置疑修复实例
  8. 【BZOJ】1969: [Ahoi2005]LANE 航线规划
  9. python操作excel命令_python excel操作总结
  10. 测试用例设计——软件测试基础
  11. Windows下USB驱动开发入门小结
  12. 招商银行信用卡中心18秋招题解
  13. 微信公众号 修改 应用签名 不生效
  14. 朱威廉假收购真炒作的背后企图
  15. R语言给数据集创建新变量
  16. Wireshark使用(捕获过滤器、显示过滤器、TCP交互抓包示例、抓取本地回环数据包等)
  17. Vue-router props 如何传递参数 ,传参请看这里
  18. Unity HDRP云渲染锯齿、UI拖影、字体清晰度问题
  19. 实景三维在自然资源地质环境监测预警的应用
  20. keras框架入门学习(一)——argparse传参模块调用

热门文章

  1. 变维分形预测matlab,【求助】请大家帮我该该求一维曲线分形维数的matlba程序好吗!!...
  2. Word中如何输入花体数学字符
  3. 基于java的小区物业报修管理系统
  4. 使用Project进行项目管理
  5. oracle 查询优化
  6. ffmpeg音视频剪辑常用操作
  7. Homography单应性矩阵原理
  8. unity相机自由移动
  9. 调试 STM32F429 + USB3300
  10. Seaweedfs 详细说明