精华内容
下载资源
问答
  • JVM(二)JVM 创建对象过程分析

    千次阅读 2018-01-19 11:15:11
    首先来看一下JVM创建对象时的流程图: Created with Raphaël 2.1.2开始JVM 执行 new 指令类已加载?为新生对象分配内存内存规整?指针碰撞并发处理:同步或TLAB将分配到的内存空间初始化为零值JVM

    在语言层面上,创建对象通常仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢?首先来看一下JVM创建对象时的流程图:

    Created with Raphaël 2.1.2开始JVM 执行 new 指令类已加载?为新生对象分配内存内存规整?指针碰撞并发处理:同步或TLAB将分配到的内存空间初始化为零值JVM 对对象进行设置结束空闲列表执行类加载过程yesnoyesno

    接下来对上面的流程图进行一个大概的说明。

    一、类加载检查

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

    二、分配内存

    分配内存时主要注意两个问题:1.如何分配空间。2.修改指针时如何实现线程安全。

    2.1 分配内存

    内存的分配存在两种实现方式:

    • 指针碰撞:假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”(Bump the Pointer)。
    • 空闲列表:如果Java堆中的内存并不是规整的,已使用的内存和空闲的内存相互交错,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为“空闲列表”(Free List)。选择哪种分配方
    2.2 线程安全

    保证修改指针时线程安全也存在两种实现方式:

    • 同步处理:对分配内存的空间动作进行同步处理(采用CAS配上失败重试的方式保证跟新操作的原子性);
    • 本地线程分配缓冲:把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,叫本地线程分配缓冲(Thread Local Allocation Buffer,TLAB),哪个线程需要分配内存,就在那个线程的TLAB上分配,只有TLAB用完并分配新的TLAB时,才需要同步锁定。

    三、初始化和设置

    内存分配完成后,虚拟机将分配到的内存初始化为零值(除对象头外),如果使用TLAB分配,也可提前值TLAB分配时进行。

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

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

    展开全文
  • JVM创建对象过程

    2019-07-21 14:56:26
    JVM创建对象过程如下:

    JVM创建对象的过程如下:
    在这里插入图片描述

    展开全文
  • JVM对象创建过程

    2018-09-08 14:21:01
    问题:在语言层面,通过new一个关键字就可以创建一个对象,那么在底层jvm是如何进行一个对象的创的?? 1)首先程序计数器在收到这个new得到指令时候,先到方法区的常量池检查有没有这个类的符号引用,然后检查类...

    问题:在语言层面,通过new一个关键字就可以创建一个对象,那么在底层jvm是如何进行一个对象的创的??
    1)首先程序计数器在收到这个new得到指令时候,先到方法区的常量池检查有没有这个类的符号引用,然后检查类是否加载解析初始化过没有就进行类加载
    2)类加载完成后,JVM就要在java堆上为对象分配内存,这个内存大小是在类加载的时候就确定的,从java堆中分配内存有两种方式一个指针碰撞,一个空闲列表方式,两种方式各有优点
    3)初始化,JVM将分配到的内存区域初始化为零值,这个操作保证了对象的实例字段可以不赋初始值就可以使用,然后对对象头数据进行设置(对象分为3部分内容)
    4)执行方法,这个方法其实就是实现构造函数的赋值内容,对数据进行初始化,到此一个对象的创建就完成了

    扩展点:
    java堆内存分配的两种方式:
    1)指针碰撞,什么是指针碰撞,我们假设java堆是规整的,用过的内存放一边,没用的放另一边当需要分配内存时移动指针
    2)空闲列表,当java堆是不规整的,JVM维护一个列表,上面记录着哪些内存块是可用的,当需要分配内存就从上面取一块下来
    3)那么选择哪种分配方式,首先看java堆是否规整,java堆是否规整取决了选择了哪种垃圾收集器,有些垃圾收集器带有压缩整理的功能比如serial parNew垃圾收集器,那么他的java堆就是规整的,就采用指针碰撞方式像CMS收集器都采用空闲列表方式

    对象的内存布局
    1)对象在内存中的布局可分为3个部分,对象头,实例数据,对齐填充
    2)首先对象头有两部分数据Mark word 和类型指针,Markword 存储了哈希码 GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID等 ,这部分数据的长度在32/64虚拟机中分别为32bit和64bit,Mark word被设计成一个非固定数据结构,根据对象的状态复用自己的空间;类型指针指向类元数据的指针,用来确定这个对象是哪个类的实例;如果对象是一个数组,对象头还要有一个块用于记录数组长度的数据
    3)实例数据,其实就是对象中定义的字段以及从父类继承的数据
    4)对齐填充只是起到占位作用目的是为了使对象的大小是8字节的整数倍,这是因为HotSpotVM 的自动内存管理系统要求对象起始地址必须是8字节的整数倍

    对象访问定位
    1)对象创建完后放在java堆中 ,那么用的时候虚拟机怎么找到这个对象,句柄方式和直接指针方式
    2)句柄的话,java堆中会划分一个区域叫句柄池,那么引用类型reference中存储的就是对象的句柄地址,句柄包含了对象实例数据类型的具体地址信息
    3)直接地址方式,reference存储的就是对象的地址
    4)两种方式对比,句柄的话,reference存的是句柄地址,对象移动只是修改句柄中的对象地址,reference内的数据就不用改,直接指针的方式就是速度更快

    展开全文
  • JVM——对象创建过程

    千次阅读 2018-03-23 20:11:51
    对象创建过程:我们在Java代码中new 一个对象时,我们很难看到对象创建过程,尤其是在jvm内存中的过程,下面来介绍一下对象创建jvm中的过程: 对象实例在jvm中是存在于java堆中的,每一个对象实例都会占用...

    对象的创建过程:

    我们在Java代码中new 一个对象时,我们很难看到对象创建的过程,尤其是在jvm内存中的过程,下面来介绍一下对象创建在jvm中的过程:

        对象实例在jvm中是存在于java堆中的,每一个对象实例都会占用一定的内存空间,

        当new执行时,首先会加载new的类

        当类加载完成之后,实例对象所占的大小就确定了。

        此时,jvm会在java堆中为实例对象开辟一块内存空间,用于存储对象实例。并且设置对象属于哪个类、如何找到对象(指针或地址)、对象的哈希码、对象的GC分代年龄等信息,这些信息存储在对象头中,还进行了对象属性的零值初始化。

        此时对于虚拟机来说已经完成了创建对象,但是对于java程序来说才好刚刚开始,对象初始化的init方法还没有执行。但是此时虚拟机已经进行了对象得零值设置,所以即使不执行init方法,程序中也是可以正常是用对象实例的。

    实例化对象过程中的注意事项以及方法:

    jvm为实例对象分配空间主要有两种方法

            一:指针碰撞:这种方法是在java堆中,将已用内存和未用的内存分开成两部分,两部分内存之间放这一个指针作为分界点,当有新的实例对象需要分配内存空间时,指针向未用内存一侧移动相应大小的距离,将新的实例对象存储在该内存空间上。这种方式需要内存是规整的。

            二:空闲列表:这种方法分配空间是随机,每次分配内存空间都是从空闲的内存中选取一块分配给实例对象。那么就需要一个列表来存放这些空闲的内存空间地址,每当有实例对象需要空间,就从这个列表中选取出一块内存分配给实例对象。这种情况下内存是不规则的。

            两种方法的选择取决于内存的结构是否规整,而内存结构是否规整则取决于采用的垃圾回收器是否带有压缩整理功能。

            例如:Serial、ParNew等带有compact过程的收集器,就是带有压缩整理功能的

                        CMS这种基于Mark—Sweep算法的收集器就是没有压缩整理功能的

        有些时候,创建对象操作很频繁,这样就有可能导致指针刚刚分配好,还没来得及创建对象,就被另一个线程抢先,先占用了指针,这时候就会产生问题,解决这种问题主要有两种办法:

            一:对创建对象动作行为进行同步处理,这种同步处理实质是CAS配上失败重试的方式实现保证更新操作的原子性的。

            二:把每一个创建对象的动作行为按照线程划分为不同的空间中进行,这种方式就是将创建对象行为放入到线程中,为每一个线程分配一小块内存空间(TLAB),每个线程要分配内存就在自己的TLAB上运行分配,只有当TLAB满了,需要重新分配TLAB时,才需要进行同步锁定。

            TLAB方式的开启需要通过-XX:+/-UseTLAB参数设定。

    展开全文
  • jvm对象创建过程

    千次阅读 2014-04-30 10:04:05
    2虚拟机为新生对象分配内存,分配方式有指针碰撞,空闲列表.(这里对象创建是非常频繁的,需要考虑原子性问题)3内存分配后,jvm要将分配到的内存初始化为零值。4jvm对象进行必要的设置,入对象是哪个类的,对象的...
  • JVM创建对象示例放在堆中,那么当JVM执行new语句时,具体是如何操作的呢? (1)首先在方法区的常量池中查看是否有new 后面参数(也就是类名)的符号引用,并检查是否有类的加载信息也就是是否被加载解析和...
  • 一、对象创建过程 二、对象的内部结构(内存分配) 1、对象头 hashcode GC分代年龄 线程编号 锁编号 时间戳 引用计数 … 2、实例数据   存储所定义的各种类型字段内容,无论是从父类继承下来,还是在子类中...
  • 关于JVM创建对象的解读

    千次阅读 2009-08-31 17:11:00
    JAVA 实例化的过程 --RayC2009-08-31 以下情况发生一个新的class被显示的创建:1. 一个class 创建的语句创建了一个新的class,class 名字在语句中声明了。2. 调用Class 的new Inst
  • JVM对象创建过程

    千次阅读 2016-07-21 07:07:15
    在虚拟机遇到一条new的指令时,先会在常量池中定位这个...上面步骤完成后,在虚拟机的角度 对象已经创建完成,但在程序员的角度对象创建才刚刚开始,之后按照程序员的意愿,初始化一些值,之后这个对象才真正创建完成了
  • JVM对象的回收过程

    千次阅读 2019-02-28 00:14:47
    而这是需要占用我们的存储空间的,因为创建一个新的对象需要分配对应的内存空间,显然我的内存空间是固定有限的,所以我们需要对没有用的对象进行回收,本文就来记录下JVM对象的销毁过程。 1.怎么判断对象是没用...
  • JVM】Java对象创建过程

    千次阅读 2021-05-08 16:36:23
    对象所需内存大小在类加载完成后即可确定,从Java堆中划分一块确定大小的内存。 内存分配的两种方式: 2.1 指针碰撞 适用场合:堆内存规整 原理:用过的内存放一边,没用过的放另一边,中间有一个分界值指针。向着...
  • JVM类加载机制和创建对象过程

    千次阅读 2018-02-13 14:29:39
    1、JVM运行和类加载过程一、类的加载机制类加载机制:JVM把class文件加载到内存,并对数据进行校验,解析和初始化,最终形成JVM 可以直接使用的Java类型的过程。主要有三步:加载、连接、初始化。其中连接又可以细分...
  • JVM 类加载机制、对象创建过程

    千次阅读 2020-06-03 11:48:51
    目录类加载的过程类加载器类加载机制类加载时机类加载方式对象创建过程对象的内存布局对象的访问方式   类加载:jvm读取.class文件,解析获取类的信息,生成对应的Class对象。   类加载的过程 主要分为...
  • JVM对象创建与内存分配机制--JVM系列(3)

    万次阅读 热门讨论 2020-11-12 10:52:38
    前言:学习本章前先阅读之前我写的关于JVM系列的前两篇文章: JVM类加载机制深入浅出分析 -- JVM系列(1) JVM内存模型 -- JVM系列(2)
  • 1、用户创建了一个Student对象,运行时JVM首先会去方法区寻找该对象的类型信息,没有则使用类加载器classloader将Student.class字节码文件加载至内存中的方法区,并将Student类的类型信息存放至方法区。 2、接着JVM...
  • JVM对象创建流程

    千次阅读 2017-12-21 19:32:37
    上章介绍完java虚拟机的运行时数据区之后,我们大致了解了java虚拟机的概况,java虚拟机...在语言层面上,创建对象(例如克隆,反序列化)通常仅仅是一个new关键字而已,而在虚拟机中,对象(限于普通java对象,不包
  • JVM之内存和对象创建过程

    千次阅读 2018-08-29 14:32:10
    并发创建对象(非线程安全)  方案1:对分配内存空间的动作进行同步处理--实际上JVM采用CAS配上失败重试的方式保证更新操作的原子性  方案2:把内存分配的动作按照线程划分在不同的空间中进行,即每个线程在...
  • 下面我们详细了解Java程序中new一个普通对象时,HotSpot虚拟机是怎么样创建这个对象的,包括5个步骤:相应类加载检查过程、在Java堆中为对象分配内存、分配后内存初始化为零、对对象进行必要的设置、以及执行对象...
  • JVM源码分析之Java对象创建过程

    千次阅读 2017-03-22 16:36:30
    接着上篇《JVM源码分析之Java类加载过程》,本文将基于HotSpot实现对Java对象创建过程进行深入分析。 定义两个简单的类AAA和BBB通过“javap -c AAA“`查看编译之后的字节码,具体如下:Java中的new
  • JVM】一个Java对象创建过程

    千次阅读 2020-05-18 21:49:00
    Java中创建对象时,需要经过5个阶段,分别是:类加载检查、分配内存、初始化零值、设置对象头、执行init方法。 1、类加载检查 当JVM执行到一条new指令时,先检查这条指令的参数是否能在常量池定位到这个类的符号引用...
  • JVM 如何创建Java对象

    千次阅读 2015-08-04 20:38:02
    在Java程序中,创建一个对象通常需要一个new关键字就够了,但是在虚拟机中,这个过程却有点复杂,这里面包括了类加载、内存分配、初始化零值等等一系列的步骤。 下面来看看JVM如何创建一个对象(这里面的对象仅仅...
  • JVM中Java对象创建

    千次阅读 2016-04-17 17:06:23
    1. JVM中对象的创建过程在语言层面上创建对象通常仅仅是一个new关键字,而在虚拟机中,对象(普通对象,不包括数组和Class对象)的创建时怎样的过程呢?当JVM遇到一个new指令时, 首先,检查这个new指令的参数能否在...
  • 如果没有,那必须先执行相应的类加载过程。 Step2:分配内存 在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从...
  • JVM源码分析之Java对象创建过程 接着上篇《JVM源码分析之Java类加载过程》,本文将基于HotSpot实现对Java对象创建过程进行深入分析。 定义两个简单的类AAA和BBB 通过``javap -c AAA```查看...
  • 运行时内存模型 相关内容参见 java 运行时内存模型 直接内存 特征 ...本机的 Native 堆(直接内存) 不受 JVM 堆内存大小限制。 可能出现 OutOfMemoryError 异常。 nio JDK1.4 加入了新的 NIO...
  • jvm内存分配及对象创建和回收过程

    千次阅读 2018-06-08 00:25:42
    对象创建对象分配内存的方法 指针碰撞 空闲列表 可能会出现线程安全性问题 如何解决 线程同步 缺点:效率低 本地分配缓冲 对象的结构 header (对象头) 自身运行时数据(Mark...
  • JVM的内存对象介绍[创建和访问]

    千次阅读 2019-02-18 23:32:34
    java程序中创建对象的常用方式是: Object obj = new Object(); 该行代码的执行过程如下: 从图中我们可以发现对象创建的步骤如下 执行new执行 检查这个指令参数是否能够在常量池中定位到一个类的符号引用,并且检....
  • JVM从小白学成大佬》系列推出到现在,收到了很多小伙伴的好评,也收到了一些小伙伴的建议,在此表示感谢。...1 创建对象 在Java程序运行过程中无时无刻都有对象被创建出来,java中对象可以采用new或反射或clo...
  • 对象创建、内存布局、访问  这里会深入探讨HotSpot虚拟机在java堆中的对象分配、布局和访问的全过程。一.对象创建  虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 226,420
精华内容 90,568
关键字:

jvm创建对象的过程