Java虚拟机学习--对象实例的创建

1.实例化过程:     在语言层面克隆对象,创建对象,反序列化生成对象都是通过new关键字,虚拟机遇到一条new指令后先检查所实例化的类是否加载(加载后则类存在),是否解析,是否初始化,然后再为新生对象分配内存空间(存放在堆中),设置对象实例的对象头,,将对象体置零,然后执行<init>方法

    2.内存分配:GC收集器的算法--->>(是否带有压缩整理功能)GC收集器的种类--->>java堆内存是否规整(规整是指内存是否是由完整的一整块的小块内存组成,比如已经使用过的内存都在一个地方,未使用的都在另一个地方)--->>java内存分配方式

    2.1  内存分配方式1(空闲列表分配):这种分配方式是因为java堆内存不规整,已使用的和未使用的内存交错,这样的话虚拟机需要维护一个列表,列表中记录内存中哪些内存已使用,哪些内存未使用,在分配空间时,不仅要分配空间,而且要记录在列表中

    2.2 内存分配方式2(指针碰撞分配):这种分配方式就是内存规整的情况,使用过的内存在一边,未使用的在另一边,中间用指针作为分界指示器,假如要分配内存,则指针往空闲内存方向挪动出一个对象实例大小的内存空间来存放实例。

    2.3分配完内存后对象的空间是存在了,但还没有内容(如专属于本对象的内容),因此要执行init方法将对象实例中的属性字段赋值。

  PASS:这里的赋值是通过什么方法呢?是否是通过set方式呢?

    3.实例对象分为3个部分对象头,对象体,对齐填充(不一定存在)

      3.1对象头主要记录对象的hashcode,GC标记,元数据地址,以及关于对象锁的使用,年龄代,偏向线程等。

      3.2对象体记录了我们程序员正常记录到的数据,通常来说,我们只用到这部分数据,即对象中的字段及其值,继承来的字段,如果字段是基本类型,则记录字段名和该字段所指向的基本类型值的地址,如果是引用类型,则指向引用值的地址。

      3.2.1事实上这些值都是在虚拟机栈中的局部变量表中,局部变量表中存放了基本类型数据,引用类型(对象)的起始地址,因此对象体中的字段的值就是指向局部变量表中的地址。

      3.3对齐填充是否存在是得看对象体是否是8的位数,jvm要求对象实例的大小必须是8的位数(内存单位必须是byte),而对象头的大小固定是byte,所以当对象体中的数据不能够填满整个byte大小的内存,就需要对齐填充来补充。

      3.4对象体中的字段存储顺序取决于它在类中定义的顺序和虚拟机分配策略,是分配策略是基本类型在前,oop类型在后(double/long>float>int>short/char>byte/boolean>oop(ordinary object pointer)),在类型相同的情况下,父类字段在前,子类字段在后。

时间: 2024-11-10 10:34:27

Java虚拟机学习--对象实例的创建的相关文章

Java虚拟机学习 - 对象访问

Java虚拟机学习 - 对象访问 分类: JVM2012-09-26 19:36 9280人阅读 评论(17) 收藏 举报 对象访问会涉及到Java栈.Java堆.方法区这三个内存区域. 如下面这句代码: [java] view plaincopyprint? Object objectRef = new Object(); 假设这句代码出现在方法体中,"Object objectRef" 这部分将会反映到Java栈的本地变量中,作为一个reference类型数据出现.而"n

Java虚拟机学习-对象的创建

虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载.解析和初始化过.如果没有,必须先执行相应类的加载过程. 类加载检查通过后,接下来虚拟机将为新生对象分配内存.对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来.假设Java堆中内存是绝对规整的,所有用过的内存放到一边,空闲的内存放到一边,中间放着指针作为分界点的指示器,那所分配内存仅仅是把那个指针

《深入Java虚拟机学习笔记》- 第7章 类型的生命周期

一.类型生命周期的开始 如图所示 初始化时机 所有Java虚拟机实现必须在每个类或接口首次主动使用时初始化: 以下几种情形符合主动使用的要求: 当创建某个类的新实例时(或者通过在字节码中执行new指令,或者通过不明确的创建.反射.克隆和反序列化): 当调用某个类的静态方法时(即在字节码中执行invokestatic指令): 当使用某个类或接口的静态字段,或者对该字段赋值时(用final修饰的静态字段除外,它被初始化为一个编译时常量表达式): 当调用Java API中的某些反射方法: 当初始化某个

《深入Java虚拟机学习笔记》- 第5章 Java虚拟机

一.JVM的生命周期 当启动一个Java程序时,一个Java虚拟机实例就诞生了:当该程序关闭退出时,这个Java虚拟机也就随之消亡: JVM实例通过调用某个初始类的main方法来运行一个Java程序:这个main方法必须是public.static的,而且返回值必须是void:任何一个拥有这样的main方法的类都可以作为Java程序运行的起点: Java程序初始类中的main方法,将作为该程序初始线程的起点,其它任何线程都是由这个初始线程启动的: 守护线程和非守护线程 守护线程通常是由虚拟机自己

《深入Java虚拟机学习笔记》- 第20章 线程同步

1.对多线程的支持是Java语言的一大优势,Java对线程的控制主要集中在对线程的同步和协作上,Java使用的同步机制是监视器. 监视器 java监视器支持两种线程:互斥和协作.java虚拟机通过对象锁来实现互斥,允许多个线程在同一个共享数据上独立而不干扰地工作.协作则通过object类的wait方法和notify方法来实现,允许多个线程为了同一个目标而共同工作.我们将监视器比作一个建筑物,里面有很多房间,房间里面有一些数据,并且同一个时间只能被一个线程占据.一个线程进入房间到离开为止,独占其中

《深入Java虚拟机学习笔记》- 第18章 finally子句

本章主要介绍字节码实现的finally子句.包括相关指令以及这些指令的使用方式.此外,本章还介绍了Java源代码中finally子句所展示的一些令人惊讶的特性,并从字节码角度对这些特征进行了解释. 1.微型子例程 字节码中的finally子句表现的很像"微型子例程".Java虚拟机在每个try语句块和与其相关的catch子句的结尾处都会"调用"finally子句的子例程.finally子句结束后(这里的结束指的是finally子句中最后一条语句正常执行完毕,不包括抛

深入java虚拟机学习 -- 类的加载机制(续)

昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: class Singleton { private static Singleton singleton = new Singleton(); //第一份代码的位置 public static int counter1; public static int counter2=0; private s

《深入Java虚拟机学习笔记》- 第4章 网络移动性

Java虚拟机学习笔记(四)网络移动性 <深入Java虚拟机学习笔记>- 第4章 网络移动性,布布扣,bubuko.com

《深入Java虚拟机学习笔记》- 第13章 逻辑运算

<深入Java虚拟机学习笔记>- 第13章 浮点运算 <深入Java虚拟机学习笔记>- 第13章 逻辑运算,布布扣,bubuko.com