Java创建对象的过程

Java是一门面向对象的编程语言,在Java程序运行过程中每时每刻都有对象被创建出来。在语言层面上,创建对象通常仅仅是一个new关键字而已,而在虚拟机中,对象的创建又是怎样一个过程呢?

一、检测类是否被加载

虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。

二、为新生对象分配内存

在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定。

假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那么分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”。

如果Java堆中的内存并不是规整的,已使用的内存和空闲的内存相互交错,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为“空闲列表”。

选择哪种分配方式由Java堆是否规整决定,而Java堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。

三、初始化零值

内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头),这一步操作保证了对象的实例字段在Java代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。

四、进行必要的设置

接下来,虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。这些信息存放在对象的对象头之中。

五、执行init方法

在上面工作都完成之后,从虚拟机的视角来看,一个新的对象已经产生了,但从Java程序的视角来看,对象创建才刚开始,方法还没有执行,所有的字段都还为零。所以一般来说,执行new指令之后会接着执行方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全产生出来。

总结一下上面所说的,创建一个对象的过程就是:

检测类是否被加载没有加载的先加载→为新生对象分配内存→将分配到的内存空间都初始化为零值→对对象进行必要的设置→执行方法把对象进行初始化

这样一个对象就创建完成了,是不是很简单。

本贴是博主对《深入理解Java虚拟机》的书摘,为博主原创。

java创建对象的过程_Java创建对象的过程相关推荐

  1. 安装java过程_Java的安装过程

    记录一下自己在Windowns下安装java的过程 打开网址后要先登录,如果没有号就先注册,然后才能下载 step1:下载JDK (1)将鼠标指向download,会出现如下界面: (2)点击左上角P ...

  2. java通字乱码_Java解决通信过程的中文乱码的问题

    Java解决通信过程的中文乱码的问题 前言: Java的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号. 这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB ...

  3. java list遍历添加元素_java遍历List过程中添加和删除元素的问题

    遍历元素最常见的三种方法: //第三种遍历[利用迭代器] private static void loopList3(List strList) { Iterator itr = strList.it ...

  4. java面试算法总结_java编程面试过程中常见的10大算法概念汇总

    以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念.由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍.本文将从Java的角度看问题,包含下面的这些概念: ...

  5. java 非静态 初始化_Java非静态代码块和实例初始化过程

    1 非静态代码块 非静态代码块特点 ①可以为实例变量(非静态的属性)初始化 ②每次创建对象的时候,都会执行一次,且先于构造器执行 ③若有多个非静态的代码块,那么按照定义的顺序从上到下依次执行 ④代码块 ...

  6. 类java的步骤_java类加载的过程

    类加载就是三个过程:加载.链接.初始化 链接又可以分为验证.准备.解析 1.加载 将class字节码文件通过类加载器装入内存中 2.验证 确保当前class文件的字节流所包含的内容符合当前JVM的规范 ...

  7. Java 中使用反射来创建对象、调用方法

    Java 中使用反射来创建对象.调用方法 反射创建对象 反射调用方法 反射调用私有方法 反射调用可变参私有方法 反射调用的方法自身可以抛出异常的情形   假设已有下面的类: import java.l ...

  8. 面向对象方法的优势简化软件开发的过程_Java面试题说一说你的对面向过程和面向对象的理解...

    点击上方"千锋Java学院",选择"置顶公众号" 每天一道面试模拟真题及解析 课前导读 ●回复"每日一练"获取以前的题目,持续更新! ●我希 ...

  9. JVM基本概念,Java编译方式,Javac编译的过程

    JDK.JRE.JVM之间的关系 JVM是Java 程序的运行环境,它包括class类加载器.JIT动态编译器.执行引擎.以及垃圾收集器等,它可以将java程序生成的字节码文件解释成具体系统平台上的机 ...

最新文章

  1. Java.io包中常用的类
  2. Nginx设置静态页面压缩和缓存过期时间的方法 (转)
  3. Perl、PHP、Python、Java和Ruby的比较(来自知乎)
  4. 反思快速完成功能代码
  5. G6 图可视化引擎——入门教程——使用图布局 Layout
  6. L. Coordinate Paper(CCPC 长春)构造
  7. python程序执行时间毫秒_如何使用python解析包含毫秒的时间字符串?
  8. A - 饭卡(动态规划 01背包)
  9. 如何在小程序wxml文件中编写js代码
  10. mysql alisql_对比!!mysql5.7 mysql8.0 alisql5.6同样插入400万数据的对比
  11. iwemeta元宇宙:阿里首任COO:如何打造销售铁军
  12. 如何安装windows NT虚拟机
  13. python 密码输入显示星号_[145]python实现控制台密码星号输入
  14. windows安装时提醒“缺少所需要的CD/DVD驱动器设备驱动程序”的解决办法
  15. final 和effectively final区别
  16. 云开发表情包制作神器微信小程序源码下载,支持各种自定义
  17. OSI七层网络模型和四层网络模型详解
  18. 引爆全球 新华三首款MANO亮相英特尔网络“航展”
  19. 利用Node-js搭建前端自动化平台
  20. 双基地mimo雷达matlab仿真,双基地MIMO雷达的干扰研究

热门文章

  1. java无参试题_JavaEE基础面试题0
  2. STM32 电机教程 32 - 基于ST X-CUBE-SPN7 无刷无感电机库的电机驱动实现
  3. 树莓派 Ubuntu mate 18.04 下开启vncserver
  4. android init.rc语法标准 .
  5. 【S操作】更新网络视频下载方法详细步骤,m3u8格式文件视频文件下载方法,gohls使用详细步骤...
  6. 十二、linux GPIO初始化
  7. 自测题的整理(持续更新)
  8. Android -- 再来一发Intent
  9. Mysql 存储引擎和事物基础概念
  10. Intel 公开安全新特性:CET