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

    千次阅读 2019-05-07 22:05:39
    Java对象创建的流程 文章目录Java对象创建的流程1.Java普通对象的创建1.1new指令1.2分配内存1.3初始化1.4对象的初始设置1.5\方法2.Java对象内存布局2.1对象头2.2实例数据2.3对齐填充 1.Java普通对象的创建 这里讨论...

    Java对象创建的流程


    1.Java普通对象的创建

    这里讨论的仅仅是普通Java对象,不包含数组和Class对象。

    1.1new指令

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

    1.2分配内存

    ​ 接下来虚拟机将为新生代对象分配内存。对象所需的内存的大小在类加载完成后便可完全确定。分配方式有“指针碰撞(Bump the Pointer)”和“空闲列表(Free List)”两种方式,具体由所采用的垃圾收集器是否带有压缩整理功能决定。

    1.3初始化

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

    1.4对象的初始设置

    ​ 接下来虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。这些信息存放在对象的对象头(Object Header)之中。根据虚拟机当前的运行状态的不同,如对否启用偏向锁等,对象头会有不同的设置方式。

    1.5<init>方法

    ​ 在上面的工作都完成了之后,从虚拟机的角度看,一个新的对象已经产生了,但是从Java程序的角度看,对象创建才刚刚开始—<init>方法还没有执行,所有的字段都还为零。所以,一般来说,执行new指令后悔接着执行init方法,把对象按照程序员的意愿进行初始化(应该是将构造函数中的参数赋值给对象的字段),这样一个真正可用的对象才算完全产生出来。

    2.Java对象内存布局

    ​ 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)、对其填充(Padding)。

    在这里插入图片描述

    2.1对象头

    ​ HotSpot虚拟机的对象头包含两部分信息,第一部分用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。
    ​ 对象的另一部分类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例(并不是所有的虚拟机实现都必须在对象数据上保留类型指针,也就是说,查找对象的元数据信息并不一定要经过对象本身)。
    ​ 如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据。

    • 元数据:描述数据的数据。对数据及信息资源的描述信息。在Java中,元数据大多表示为注解

    2.2实例数据

    ​ 实例数据部分是对象真正存储的有效信息,也是在程序代码中定义的各种类型的字段内容,无论从父类继承下来的,还是在子类中定义的,都需要记录起来。这部分的存储顺序会虚拟机默认的分配策略参数和字段在Java源码中定义的顺序影响(相同宽度的字段总是被分配到一起)。

    2.3对齐填充

    ​ 对齐填充部分并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。由于HotSpot VM的自动内存管理系统要求对象的起始地址必须是8字节的整数倍,也就是说,对象的大小必须是8字节的整数倍。而对象头部分正好是8字节的倍数(1倍或者2倍),因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。

    展开全文
  • 本人是刚学java的菜鸟,之前对“子类对象创建的同时有没有创建父类对象”这一问题非常纠结,于是上网查找各种资料,浏览前辈的博客,个人觉得子类对象创建的同时父类对象没有被创建。 如上图所示,子类...

    本人是刚学java的菜鸟,之前对“子类对象创建的同时有没有创建父类对象”这一问题非常纠结,于是上网查找各种资料,浏览前辈的博客,个人觉得子类对象创建的同时父类对象没有被创建。




    如上图所示,子类对象创建时,this和super的引用是如此指向对象的成员变量和方法。this指向了不仅父类可继承的成员变量和可继承的方法还指向了子类的成员变量和方法,而super只是指向了子类对象中从父类继承的成员变量和方法;如果按此理解,那么父类引用指向子类对象那么就很好理解了.父类引用指向子类对象创建的子类对象时,此父类引用之所以能使用父类中含有的方法而不能使用子类中所含有的方法按照此图就可以理解了。

    光说并不具有说服力,那么我们就可以用一小段代码来测试我之前的猜想:


    如上图所示的代码,show()方法中的打印语句的toString方法是Object的方法,用于输出对象的名称和hashcode(内存地址),如果子类对象创建的同时也创建了一个父类对象,那么super和this的hashcode就不一样,那么两条打印语句输出的内容就不一样,但程序运行时,两条语句输出的内容一样,那么子类对象的同时没有创建父类对象。

    创建一个对象即new一个对象需要两步,首先new创建一个内存地址,然后在调用构造方法初始化成员变量。

    以上都是我的个人意见,如有不对的地方希望各位大神,前辈及时指出。谢谢微笑





    展开全文
  • JVM-JAVA对象创建的五个步骤

    千次阅读 2020-06-29 10:03:01
    对象创建的五个步骤 1、类加载检查 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有...

    对象创建的五个步骤

    • 1、类加载检查

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

    总结为 if(new指令的参数不在常量池 || 此符号引用的类没有被加载、解析和初始化)--------->{执行相应类加载}

    • 2、分配内存

    在类加载检查完成后,虚拟机为new出来的对象分配内存。
    新对象需要的内存大小在类加载完成后就已经确定,现在要做的是吧一块确定大小的内存从Java堆中划分出来。
    分配方式涉及到两种:
    指针碰撞空闲列表
    堆内存规整时堆内存不规整时
    用过的内存放在一边,没用的放一边,中间有个分界值指针JVM维护一个列表记录划分的内存
    GC收集器:Serial、ParNewGC收集器:CMS

    堆内存规整与否取决于GC收集器的算法是标记-清除、还是标记-整理

    创建对象时涉及到的问题:

    线程安全:先TLAB再 CAS+失败重试
    • CAS+失败重试: CAS 是乐观锁的一种实现方式。所谓乐观锁就是,每次不加锁而且假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。虚拟机采用 CAS 配上失败重试的方式保证更新操作的原子性。
    • TLAB: 为每一个线程预先在 Eden 区分配一块儿内存,JVM 在给线程中的对象分配内存时,首先在 TLAB 分配,当对象大于 TLAB 中的剩余内存或 TLAB 的内存已用尽时,再采用上述的 CAS 进行内存分配
    • 3、初始化零值

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

    虚拟机要对对象进行必要的设置,例如这个对象是那个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。 这些信息存放在对象头中。 另外,根据虚拟机当前运行状态的不同,如是否启用偏向锁等,对象头会有不同的设置方式。
    • 5、执行init方法

    经过1-4步骤,从JVM的角度看一个新的对象已经产生,但从Java程序上看,对象创建才刚开始。执行 new 指令之后会接着执行 方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全产生出来。
    展开全文
  • 123.Oracle数据库SQL开发之 数据库对象——对象创建 欢迎转载,转载请标明出处: ORACLE 8数据库发布的时候,在数据库中就可以使用对象了,随后发布的产品中进一步改进了对象特性。  可以是使用CREATETYPE语句用于...

    123.Oracle数据库SQL开发之 数据库对象——对象创建

    欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50087023

    ORACLE 8数据库发布的时候,在数据库中就可以使用对象了,随后发布的产品中进一步改进了对象特性。

             可以是使用CREATETYPE语句用于创建对象类型。

    CREATETYPE t_address AS OBJECT (

      streetVARCHAR2(15),

      city   VARCHAR2(15),

      state  CHAR(2),

      zip    VARCHAR2(5)

    );

    /

    每个属性都是用一种数据库类型定义的。

    CREATE TYPE t_person AS OBJECT (

      id         INTEGER,

      first_nameVARCHAR2(10),

     last_name  VARCHAR2(10),

      dob        DATE,

      phone      VARCHAR2(12),

      address    t_address

    );

    /

    再创建对象类型t_product,用于表示产品。

    CREATETYPE t_product AS OBJECT (

      id          INTEGER,

      name        VARCHAR2(10),

      descriptionVARCHAR2(22),

      price       NUMBER(5, 2),

     days_valid  INTEGER,

     

      --get_sell_by_date() returns the date by which the

      -- productmust be sold

      MEMBER FUNCTION get_sell_by_date RETURN DATE

    );

    /

    其中包括了get_sell_by_date()函数,定义如下:

    CREATETYPE BODY t_product AS

      --get_sell_by_date() returns the date by which the

      -- productmust be sold

      MEMBER FUNCTION get_sell_by_date RETURN DATEIS

       v_sell_by_date DATE;

      BEGIN

        --calculate the sell by date by adding the days_valid attribute

        -- to thecurrent date (SYSDATE)

        SELECTdays_valid + SYSDATE

        INTOv_sell_by_date

        FROM dual;

     

        -- returnthe sell by date

        RETURNv_sell_by_date;

      END;

    END;

    /

     

     

     

     

     

     

     

    展开全文
  • JavaScript 中的所有事物都是对象:字符串、数值、数组、函数... 此外,JavaScript 允许自定义对象。 JavaScript 对象 JavaScript 提供多个内建对象,比如 String、Date、Array 等等。...创建对象有两...
  • 对象创建流程图 总结 逃逸分析 什么是逃逸分析? 对象逃逸状态 逃逸分析优化 TLAB区 对象如何进入老年代 有问题可以直接留言讨论~ 对象创建流程图 1.编译器通过逃逸分析,确定对象是在栈上分配还是在堆上...
  • 无法对sys拥有的对象创建触发器

    千次阅读 2013-08-27 21:19:00
    以sys用户登录oracle数据库创建触发器时,提示无法对sys拥有的对象创建触发器,原因如下: sys拥有的对象大部分是数据字典 数据字典是数据库正常运行的基础 如果在数据字典上创建Trigger,Oracle数据字典的修改会...
  • 对象的创建过程当虚拟机遇到一条含有new的指令时,会进行一系列对象创建的操作: 检查常量池中是否有即将要创建的这个对象所属的类的符号引用;若常量池中没有这个类的符号引用,说明这个类还没有被定义!抛出...
  • ORA-04089: 无法对 SYS 拥有的对象创建触发器 创建触发器时报错 原因是所有的以sysdba登录的账户都不能创建触发器。 解决方法,以normal方式登录建立表、自增长、触发器等,如果之前已经建立了,就删除了重新以...
  • UML、对象创建型模式

    万次阅读 2019-12-03 21:02:20
    是类与类之间最常用的一种关系, 它是一种结构化关系,用于表示一类对象与另一类对象之间有联系。 单线实箭头,可自关联 关联关系中要表明对象间的关联关系,如是一对多还是一对一 依赖关系(Dependency) 一种使用...
  • JS对象创建 Object.create() 方法

    万次阅读 2018-06-07 17:20:50
    Object.create() 方法创建一个拥有指定原型和若干个指定属性的对象。 语法 Object.create(proto, [ propertiesObject ]) 通过Object.create 方法可以创建对象,在这里有两个参数,第一个参数是对象,第二个...
  • R语言—对象创建

    千次阅读 2018-02-05 17:13:51
    对象(元素)的产生和转换 一.对象的产生  1.向量(vector)  mode表示类型,length表示长度  以下三个函数几乎有相同效果  2.因子  函数levels可以用来... 3.... 4.... 另一创建方式是给矩阵维度
  • 今天想记录图形学知识的时候需要用到公式编辑器,就打开了word,...凭着不服输的精神我卸载了office2016,打开时对象中是有公式编辑器3.0选项了,可是提示我 “此对象创建于Equation中,此应用程序不能用来打开.......
  • JAVA对象创建过程内存图解

    千次阅读 多人点赞 2019-06-09 11:40:34
    1、类与对象 类是现实事物的抽象,将现实事物描述成对应的类,类中封装了成员变量、构造方法、成员方法、set/get方法。 比如说人,人都有哪些属性?姓名,年龄,性别...等等这些都属于人的属性,可以将其封装为类...
  • C++对象创建与释放

    万次阅读 2014-04-03 13:30:00
    创建对象有以下四种形式: #include using namespace std; class A{ private: int i; public: A(){ cout调用没有参数的构造函数"; } A(int a):i(a){ cout调用有一个参数的构造函数"; } ~A(){cout成员变量为:...
  • 创建触发器,结果错误提示——ORA-04089:无法对SYS拥有的对象创建触发器。 我该如何解决这个问题 数据库是ORACLE. ORA-04089 cannot create triggers on objects owned by SYS Cause: An ...
  • Spring 容器及对象创建的过程

    千次阅读 2018-06-13 23:57:02
    Spring容器负责对象创建过程,配置并且管理他们的创建过程,从创建到被回收。Spring有多种容器的实现,分为两种类型,bean工厂,最简单的容器,提供DI的支持。应用上下文是基于beanFactory构建的,提供企业极的...
  • ATL揭秘之“对象创建”篇

    千次阅读 2007-07-07 18:43:00
    ATL揭秘之“对象创建”篇程 化1 问题当我们用VC++ ATL工程创建了一个COM工程,实现了一个自己的COM对象,又在另一个程序中CoCreateInstance这个COM对象时,不知你是否想过这样的问题:COM对象是用C++类对象实现的...
  • 对象创建 类和对象的区别 面向对象【java语言的核心机制,最重要的内容,java语言的特色】 * 面向过程和面向对象的区别 -- 面向过程:主要关注点是:实现的具体过程,因果关系 -- 面向对象:主要关注对象...
  • Servlet事件监听器、监听servletContext域对象创建和销毁、监听三个域对象属性变化 监听器 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听...
  • c++对象创建带括号与无括号的区别

    万次阅读 2018-11-27 19:43:44
    转载自:... 有些细节稍作补充: class Test { public:  Test() {}  Test(int a) {} ...1、栈上创建对象 ... // 调用默认构造函数,栈上分配内存创建对象  1.2 有括号  Test a()...
  • 说明:内容复制粘贴https://www.cnblogs.com/cunlau/p/3624878.html而来 Class对象的生成方式如下:1....返回Class的对象2.Class.forName(“类名字符串”) (注:类名字符串是包名+类名) 说明:装入
  • 对象创建过程,初始化顺序

    千次阅读 2015-04-08 17:19:29
    Java虚拟机创建一个对象都包含以下步骤。 (1)给对象分配内存。 (2)将对象的实例变量自动初始化为其变量类型的默认值。 (3)初始化对象,给实例变量赋予正确的初始值。  对于以上第三个步骤,Java虚拟机可...
  • 摘自http://tieba.baidu.com/f?kz=673074802在word/Excel文档中要打开... 点击"是"以后,则出现了这个提示: "此对象创建于package中,此应用程序不能用来打开此对象,请确认此应用程序已正确安装,并未被删除,移动或重命名
  • 操作Word时,有事会提示“此对象创建于package中。此应用程序不能用来打开此对象。请确认此应用程序已正确安装,并且未被删除、移动或重命名。”如下图所示 上面是word2003中的提示,在2007中会稍微有点不同,...
  • 这两天学习oracle的触发器,创建触发器的时候时不时会遇到:“无法对sys拥有的对象创建触发器”的错误提示。  使用的用户登录是自己创建的新用户XXX下登录,之后再XXX用户下创建一个名为MECITY的表空间,接着...
  • JVM之内存和对象创建过程

    千次阅读 2018-08-29 14:32:10
    2.3.1对象创建  虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载 解析和初始化过,如果没有,先执行相应的类加载...
  • Activity对象创建及窗口显示过程源码详解(Android Q) Activity 启动、直到视图显示在屏幕上,经历了很复杂的过程。本章我们将分析 Activity 窗口显示过程。 关于 Activity 的启动过程,请参考前文《Activity启动...
  • 对象创建时机 以上两种情况是默认值,当spring容器启动的时候创建对象在bean有这样一个属性 Default 相当于false 在spring容器启动的时候,创建对象 True 在context.getBean时创建对象 False 在spring容器...
  • Java类及对象创建内存分配过程

    千次阅读 2016-06-10 21:53:38
    Java是面向对象的程序设计语言,而面向对象的程序都是由对象组成的,而类就是该对象的抽象描述。 那么什么类,什么又是对象了? 类:具体事物的属性和行为的抽象,概念上的定义 对象:就是该类的具体事物...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,565,617
精华内容 1,826,246
关键字:

对象的创建