Java创建对象的过程

简单记录一下Java创建对象的过程,就是new一个对象的时候发生了哪些事情。Java程序执行的过程在此不作说明,对象的创建过程只是程序执行过程的一部分。有关整个程序执行的过程,等熟悉了虚拟机之后在作说明。

对象创建过程简述

Java中对象的创建就是在堆上分配内存空间的过程,此处说的对象创建仅限于new关键字创建的普通Java对象,不包括数组对象的创建。

大致过程如下:

检测类是否被加载

为对象分配内存

为分配的内存空间初始化零值

对对象进行其他设置

执行init方法

检测类是否被加载

当虚拟机执行到new时,会先去常量池中查找这个类的符号引用。如果能找到符号引用,说明此类已经被加载到方法区(方法区存储虚拟机已经加载的类的信息),可以继续执行;如果找不到符号引用,就会使用类加载器执行类的加载过程,类加载完成后继续执行。

为对象分配内存

类加载完成以后,虚拟机就开始为对象分配内存,此时所需内存的大小就已经确定了。只需要在堆上分配所需要的内存即可。

具体的分配内存有两种情况:第一种情况是内存空间绝对规整,第二种情况是内存空间是不连续的。

对于内存绝对规整的情况相对简单一些,虚拟机只需要在被占用的内存和可用空间之间移动指针即可,这种方式被称为指针碰撞。

对于内存不规整的情况稍微复杂一点,这时候虚拟机需要维护一个列表,来记录哪些内存是可用的。分配内存的时候需要找到一个可用的内存空间,然后在列表上记录下已被分配,这种方式成为空闲列表。

分配内存的时候也需要考虑线程安全问题,有两种解决方案:

第一种是采用同步的办法,使用CAS来保证操作的原子性。

另一种是每个线程分配内存都在自己的空间内进行,即是每个线程都在堆中预先分配一小块内存,称为本地线程分配缓冲(TLAB),分配内存的时候再TLAB上分配,互不干扰。

为分配的内存空间初始化零值

对象的内存分配完成后,还需要将对象的内存空间都初始化为零值,这样能保证对象即使没有赋初值,也可以直接使用。

对对象进行其他设置

分配完内存空间,初始化零值之后,虚拟机还需要对对象进行其他必要的设置,设置的地方都在对象头中,包括这个对象所属的类,类的元数据信息,对象的hashcode,GC分代年龄等信息。

执行init方法

执行完上面的步骤之后,在虚拟机里这个对象就算创建成功了,但是对于Java程序来说还需要执行init方法才算真正的创建完成,因为这个时候对象只是被初始化零值了,还没有真正的去根据程序中的代码分配初始值,调用了init方法之后,这个对象才真正能使用。

到此为止一个对象就产生了,这就是new关键字创建对象的过程。过程如下:

检测类是否被加载–>为对象分配内存空间–>初始零值–>进行必要的设置–>调用init方法进行初始化。

dw中创建java程序_Java创建对象的过程简介相关推荐

  1. 【开发环境】Android 命令行中执行 Java 程序 ( IntelliJ IDEA 中创建 Java / Kotlin 工程 | dx 打包 DEX 字节码文件 | dalvikvm 命令 )

    文章目录 前言 一.IntelliJ IDEA 中创建 Java / Kotlin 工程 二.准备 Java 和 Kotlin 代码 三.编译在 PC 上可执行的 Java / Kotlin JAR ...

  2. 在Android Studio中运行Java程序

    在Android Studio中运行Java程序 有时候在开发Android时,由于调试需要,需要写一些Java程序. 由于类库引用等问题,去IntelliJ IDEA新建一个Java程序还要添加类库 ...

  3. 在Eclipse中导入Java程序

    在Eclipse中导入Java程序 在 Eclipse 中导入 Java 程序 在 Eclipse 中导入 Java 程序,分导入Java Project和导入Java源程序 两种情况,简述如下. 情 ...

  4. java编译程序的基本命令是什么,【填空题】Java中编译java 程序的命令是 1 ,执行java程序的命令是 java 。...

    [填空题]Java中编译java 程序的命令是 1 ,执行java程序的命令是 java . 更多相关问题 [多选] 下列骨折中属于关节外骨折的是(). [多选] 骨折早期局部的并发症包括(). [多 ...

  5. 如何在C++中嵌入JAVA程序

    如何在C++中嵌入JAVA程序呢?现在的程序员,不再像以前一样,掌握一种编程语言就可以混得有模有样了,这里为大家讲的,就是C++与Java混合编程.局域网聊天软件举几个简单的例子,一个软件为了快速开发 ...

  6. 编写1个JSP页面,在JSP页面中使用Java程序片输出26个小写的英文字母表。

    编写1个JSP页面,在JSP页面中使用Java程序片输出26个小写的英文字母表. <%@ page language="java" contentType="tex ...

  7. 在VScode中创建Java项目

    在VScode中创建Java项目 1. 配置SDK环境 2.在vscode中下载Java插件 之前使用过idea或者其他IDE编写Java已经下载并配置好了sdk,可以直接跳转到第二步.没有配置过sd ...

  8. 在CMD中运行java程序

    在CMD中运行java程序 运行原理 实际操作 不在项目下的.java运行 在项目下的.java运行 注意事项 运行原理 运行一个编写好的java文件需要两步,第一步是讲我们的.java文件通过jav ...

  9. 怎么在eclipse中调试java程序?

    怎么在eclipse中调试java程序?关于这个问题我已经回答过很多次,但许多朋友可能还没有理解,本篇文章再来详细为大家解答一下怎么在eclipse中调试java程序?等相关问题,希望对大家有所帮助. ...

  10. 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中创建 Python 程序 | 导入 ELFFile 库 | 解析 ELF 文件 )

    文章目录 一.PyCharm 中创建 Python 程序 二.导入 ELFFile 依赖库 三. 解析 ELF 文件 四. 博客源码 一.PyCharm 中创建 Python 程序 在 PyCharm ...

最新文章

  1. 10 个免费的 C/C++ 集成开发环境
  2. cad怎么查找未闭合_CAD无法填充的这四种方法肯定能解你燃眉之急
  3. react组件设计原则_React组件设计规则
  4. Android UI开发第三十三篇——Navigation Drawer For Android API 7
  5. 3.Hadoop的学习(ubuntu安装配置jdk)
  6. ASP.NETCore编程实现基本认证
  7. CSS每日学习笔记(0)
  8. Visual Studio 2012资源管理器里单击打开改为双击打开文件
  9. 推荐一个比吴恩达的还要优质的机器学习课程
  10. 最近做了个【51单片机积木式图形化中文编程软件/c语言代码生成器/电路仿真】
  11. 前后端鉴权之session-cookie
  12. java读properties配置文件中的值
  13. Arch报错日志ACPI BIOS Error (bug): Failure creating named object“INFO: task kworker/2:1H:107 blocked“
  14. 修改putty的缺省值设置
  15. android 手机投屏电视,手机投屏到智能电视上的几种方法
  16. 计算机科学中的递归算法是把问题,从计算思维的视角辨析算法中的递归与迭代...
  17. 给文火慢炖的“少儿美术”加点料
  18. hping3的简单介绍(新手向,大佬勿喷)
  19. 【AAAI 2021】多出口架构的知识蒸馏:Harmonized Dense Knowledge Distillation Training for Multi-Exit Architectures
  20. 超越云存储,用一勺蛋白质保存整个图书馆

热门文章

  1. java中获得IP地址
  2. Redis 安装与简单示例 第一篇
  3. HTMLTestRunner修改Python3的版本
  4. SoftGrid教程——排序服务器
  5. FLASH缓动导航制作方法.
  6. 3.2 如何判断Java对象的存活
  7. Tensorflow2.0.0版本和Keras2.4.3不兼容
  8. 重读你不知道的JS (上) 第一节五章
  9. 通过配置IP SLA跟踪静态路由
  10. Android - 找到当前类的Context