精华内容
下载资源
问答
  • Java创建对象的过程

    2017-07-24 16:59:59
    Java创建对象的过程 简单记录一下Java创建对象的过程,就是new一个对象的时候发生了哪些事情。Java程序执行的过程在此不作说明,对象的创建过程只是程序执行过程的一部分。有关整个程序执行的过程,等熟悉了...

     

    Java创建对象的过程

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

    对象创建过程简述

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

    大致过程如下:

    1. 检测类是否被加载
    2. 为对象分配内存
    3. 为分配的内存空间初始化零值
    4. 对对象进行其他设置
    5. 执行init方法

    检测类是否被加载

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

    为对象分配内存

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

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

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

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

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

    • 第一种是采用同步的办法,使用CAS来保证操作的原子性。
    • 另一种是每个线程分配内存都在自己的空间内进行,即是每个线程都在堆中预先分配一小块内存,称为本地线程分配缓冲(TLAB),分配内存的时候再TLAB上分配,互不干扰。

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

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

    对对象进行其他设置

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

    执行init方法

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

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

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

    展开全文
  • java创建对象的过程

    2020-03-20 11:31:44
    对象的创建过程以下五步: 1.判断类是否加载 虚拟机遇到new指令时,首先先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,就...

    对象的创建过程以下五步:

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

    2.分配内存
    为对象分配空间,把一块固定大小的内存从java堆里划分出来。
    如果java堆是那种齐整的,用过的内存在一边,空闲的在另一边,中间有一个指针作为分界点的指示器。
    进行内存分配时,只需要将指针向空白区域移动相应大小空间,就完成了内存的分配,这种方法叫做“指针碰撞”。
    如果已使用内存和未使用内存交错,就需要一个“空闲列表”方法来决定分配在哪里。

    多线程并发时会出现正在给对象A分配内存,还没来得急修改指针,对象B又用这个指针分配内存,这样就出现问题了。
    解决这种问题有两种方案:
    1.对分配内存空间的动作进行同步处理;
    2.把内存分配动作按照线程划分在不同的空间之中进行,即每个线程在java堆中预先分配一小块内存,这种称为本地线程分配缓冲(Thread Local Allocation Buffer, TLAB)。,是否启用TLAB需要通过 -XX:+/-UseTLAB参数来设定。

    3.初始化零值
    内存分配完之后虚拟机将分配到的内存全都初始化为零值。

    4.设置对象头
    设置对象头,包括这个对象是哪个类的实例,如何才能找到该类的元数据信息,对象的哈希码,对象的GC分代年龄等信息。

    5.执行init方法

    展开全文
  • java 创建对象的过程

    2008-11-05 10:35:36
    1、在使用new创建Dog对象时,或者调用Dog类静态方法(类方法)/静态成员(类成员)时,Java编译器会去查找Dog.class文件。 2、接着载入Dog.class文件,在这里静态初始化动作会被执行,静态初始化在类对象首次...

    摘录自《thinking in Java》

    以Dog对象为例。

    1、在使用new创建Dog对象时,或者调用Dog类的静态方法(类方法)/静态成员(类成员)时,Java编译器会去查找Dog.class文件。

    2、接着载入Dog.class文件,在这里静态初始化的动作会被执行,静态初始化在类对象首次加载时进行,且只做一次。

    3、然后new Dog对象时,在堆中为Dog对象分配足够的存储空间。

    4、这块存储空间被初始化,Dog类的成员被设置成默认值。

    5、初始化块初始化。

    6、构造函数初始化。

    展开全文
  • 原文链接 Java创建对象的过程 对象创建过程简述 检测类是否被加载 为对象分配内存 为分配的内存空间初始化零值 对对象进行其他设置 执行init方法 ...

    原文链接

    Java创建对象的过程

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

    对象创建过程简述

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

    大致过程如下:

    1. 检测类是否被加载
    2. 为对象分配内存
    3. 为分配的内存空间初始化零值
    4. 对对象进行其他设置
    5. 执行init方法

    检测类是否被加载

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

    为对象分配内存

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

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

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

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

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

    • 第一种是采用同步的办法,使用CAS来保证操作的原子性。
    • 另一种是每个线程分配内存都在自己的空间内进行,即是每个线程都在堆中预先分配一小块内存,称为本地线程分配缓冲(TLAB),分配内存的时候再TLAB上分配,互不干扰。

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

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

    对对象进行其他设置

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

    执行init方法

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

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

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

    转载于:https://my.oschina.net/dachengxi/blog/864418

    展开全文
  • JAVA创建对象的过程和this的本质 创建一个对象分为四步: 1、分配对象空间,并将对象成员变量初始化为0或空 2、执行属性值的显式初始化 3、执行构造方法 4、返回对象的地址给相关的变量 public class F...
  • 首先,介绍一下java中对象的创建基本知识然后,介绍一下对象初始化的顺序接下来,介绍一下创建对象的几种方式最后,进行一个总结。(从内存角度去分析:重点)重点 一、基本知识 我们知道,一个对象的创建过程...
  • 对象所需内存大小在类加载完成后便可确定,为对象分配空间任务等同于把一块确定大小内存从 Java 堆中划分出来。分配方式有 “指针碰撞” 和 “空闲列表” 两种,选择那种分配方式由 Java 堆是否规...
  • java对象的创建操作其实我在《JVM系列之类的加载机制》一文曾经提到过,包含两个过程:类的初始化和实例化。为此为了理解的深入,我们还需要再来看一下类的生命周期。一张图表示: ...
  • 说在前面的几句废话 前几天我的文章一直没有更新,大概断了4天左右,因为外出有事,所以给耽搁了,有朋友建议,我可以集中花几天,每天只写文章,这样以后觉得哪里不妥还可以修改,觉得言之有理就...java对象的...
  • java创建对象过程

    2019-12-02 17:28:43
    java创建对象过程如图所示 类检查器 虚拟机遇到一条new指令时候,首先将去检查这个指令参数是否能在常量池中定位到这个类符号引用,并且检查这个行号引用代码类是否被加载过、 解析过、初始化过.如果没有,则...
  • Java对象创建的过程

    2019-09-18 06:12:06
    Java对象的创建就是在堆上分配内存空间的过程,此处说的对象创建仅限于new关键字创建的普通Java对象,不包括数组对象的创建 对象的创建大概分为以下几步: 1:检查类是否已经被加载; 2:为对象分配内存空间; ...
  • java创建对象创建过程分析

    千次阅读 2017-11-27 21:10:45
    new Object();的过程
  • JAVA 对象创建过程

    2015-08-05 14:21:28
    以前一直认为自己对JAVA创建对象的过程掌握的十分不错,最近同事小黄给我拿来一道面试题 我竟然答错了,最近正好工作调整,不太忙,决定好好整理一下JAVA基础知识点。就从这道题开始。
  • Java创建对象过程

    2020-03-15 12:40:48
    1.类加载检查 虚拟机遇到一条 new 指令时,首先将去检查这个指令参数是否能在常量池中定位...对象所需内存大小在类加载完成后便可确定,为对象分配空间任务等同于把一块确定大小内存从 Java 堆中划分出来。...
  • 对象创建过程
  • java对象的创建过程

    千次阅读 2016-03-28 09:27:04
    java对象的创建过程java的根本,如下图所示:
  • Java创建对象的过程总体上可分为四步: Java虚拟机遇到字节码new指令时 ①先看看这条指令对应的参数能否在常量池中定位到类的符号引用 ②若没有,则执行类加载的过程(加载,验证,解析,初始化) ②若有,则为对象...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,295
精华内容 5,718
关键字:

java创建对象的过程

java 订阅