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

    2018-01-21 18:19:27
    JVM对象创建的过程  对于java程序员来说,我们无时无刻不在创建和使用对象。使用new关键字即可快速创建一个对象,其实在new的背后,JVM为我们完成了很多事情。  JVM的字节码解释器在读取到NEW的指令时,会先去常量...

    JVM对象创建的过程
        对于java程序员来说,我们无时无刻不在创建和使用对象。使用new关键字即可快速创建一个对象,其实在new的背后,JVM为我们完成了很多事情。
        JVM的字节码解释器在读取到NEW的指令时,会先去常量区定位对应类的符号引用, 并且检查符号引用指向的类的信息有没有被加载,解析和初始化过。如果没有则会先进行类的加载过程。
        在对类的检查通过后, JVM会去JAVA堆中进行对象的内存分配,对象的内存大小是在类加载后就能提前完全确定的。在JAVA堆中有两种方式分配对象的内存空间:如果JAVA堆的内存空间是规整的,即所有用过的内存放在一边,未使用过的内存放在另外一边, 而中间则是一个指针作为分界线的指示器,分配对象的内存空间就相当于把指针往未使用过的内存那一边挪一点已知对象大小空间,这种方式就叫做”指针碰撞”; 而对于内存空间不规整的JAVA堆来说, 则需要有一个空闲列表,存放可以使用的内存空间的地址, 当分配内存时, 需要从空闲列表里取出一块合适大小的内存地址分配给对象,然后更新空闲列表即可。一般比如Serial、ParNew等自带压缩整理功能的收集器则使用指针碰撞的方式分配对象空间, 还有一些比如CMS这种使用标记清除算法功能的收集器则使用空闲列表的方式进行对象内存空间分配。
        虚拟机中创建对象是非常频繁的行为, 因此也要考虑并发的问题。假如在给某个指针指向的对象分配内存空间并且还未来得及修改指针时,另一个线程又修改了该指针所指向的对象,这个就是并发问题。解决这个问题有两种方案:一种是在对象修改时进行同步锁定处理,保证更新操作的原子性。还有一种方式是使用本地线程缓冲(Thread Local Allcation Buffer),简称TLAB, 即在JAVA堆中为每个线程划分出一块私有的内存区域,每个线程只在自己的缓冲区域进行对象创建。只有当TLAB需要扩展时才进行同步锁定处理。虚拟机是否使用TLAB,可以通过-XX:+/-UseTLAB参数来设定。
        当对象内存分配完毕后, 虚拟机还需要对对象使用到的内存空间进行零值设置。这一操作在使用TLAB的虚拟机中, 可以提前在TLAB中完成, 提高对象创建的速度。这个零值设置是确保JAVA对象在未初始化字段值时也可以使用。
        接下来虚拟机还需要进行对象头信息的设置, 例如一些对象的类信息、哈希码、GC分代年龄信息等。这一系列动作完成后, 对于虚拟机来说,一个对象的创建就完成了。
        但是对于JAVA程序来说, 对象在创建完成后还需要执行init方法, 根据程序员的设定对对象进行一些数据的初始化,这样一个对象的创建才真正的完成。

    展开全文
  • Spring 容器及对象创建的过程

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

       

          Spring容器负责对象的创建过程,配置并且管理他们的创建过程,从创建到被回收。Spring有多种容器的实现,分为两种类型,bean工厂,最简单的容器,提供DI的支持。应用上下文是基于beanFactory构建的,提供企业极的服务。

        常用的几种应用上下文:

       ① AnnotationConfigApplicationContext:从一个或多个基于java的配置类中加载上下文定义,适用于java注解的方式;

        ② ClassPathXmlApplicationContext:从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式;

        ③ FileSystemXmlApplicationContext:从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载xml配置文件;

        ④ AnnotationConfigWebApplicationContext:专门为web应用准备的,适用于注解方式;

        ⑤ XmlWebApplicationContext:从web应用下的一个或多个xml配置文件加载上下文定义,适用于xml配置方式。

    无论以哪种方式加载过程都是类似的,例如加载一个FileSystemXmlApplicationContext,ClassPathXmlApplicationContext

    ApplicationContext fileSystemXmlApplicationContext = new FileSystemXmlApplicationContext("bean.xml");

    ApplicationContext classPathXmlApplicationContext= new ClassPathXmlApplicationContext(Knight.class);

       bean 的生命周期:

         



    展开全文
  • 类加载过程 在java中,类加载是指将类相关信息加载到内存。并且只有第一次使用这个类时才会加载。 一个类信息主要包括以下部分: 类变量(静态变量); 类初始化代码: – 定义静态变量时赋值语句 – 静态...

    一.类加载过程

    在java中,类加载是指将类的相关信息加载到内存。并且只有第一次使用这个类时才会加载。
    一个类的信息主要包括以下部分:

    1. 类变量(静态变量);
    2. 类初始化代码:
      – 定义静态变量时的赋值语句
      – 静态初始化代码块
    3. 类方法(静态方法);
    4. 实例变量;
    5. 实例初始化代码:
      – 定义实例变量时的赋值语句
      – 实例初始化代码块
      – 构造方法
    6. 实例方法;
    7. 父类信息引用。

    类加载过程包括:

    1. 分配内存保存类的信息;
    2. 给类变量赋默认值;
    3. 加载父类;
    4. 设置父子关系;
    5. 执行类初始化代码。

    内存分为栈和堆,栈存放函数的局部变量,堆存放动态分配的对象,还有一个内存区,叫方法区,存放类的信息

    加载之后,java方法区就有了一份这个类的信息。
    例子如下:

    public class Base {
    	public static int s;
    	private int a;
    	static {
    		System.out.println("基类静态代码块,s:" + s);
    		s = 1;
    	}
    	{
    		System.out.println("基类实例代码块,a:" + a);
    		a = 1;
    	}
    
    	public Base() {
    		System.out.println("基类构造方法,a:" + a);
    		a = 2;
    	}
    
    	protected void step() {
    		System.out.println("base s:" + s + ",a:" + a);
    	}
    
    	public void action() {
    		System.out.println("start");
    		step();
    		System.out.println("end");
    	}
    }
    
    
    public class Child extends Base {
    	public static int s;
    	private int a;
    	static {
    		System.out.println("子类静态代码块,s:" + s);
    		s = 10;
    	}
    	{
    		System.out.println("子类实例代码块,a:" + a);
    		a = 10;
    	}
    
    	public Child() {
    		System.out.println("子类构造方法,a:" + a);
    		a = 20;
    	}
    
    	protected void step() {
    		System.out.println("child s:" + s + ",a:" + a);
    	}
    
    	public static void main(String[] args) {
    		System.out.println("---- new Child()");
    		Child c = new Child();
    		System.out.println("\n---- c.action()");
    		c.action();
    		Base b = c;
    		System.out.println("\n---- b.action()");
    		b.action();
    		System.out.println("\n---- b.s:" + b.s);
    		System.out.println("\n---- c.s:" + c.s);
    	}
    }
    
    

    内存布局如图:
    在这里插入图片描述

    二、对象创建的过程

    在类加载之后,创建对象过程包括:

    1. 分配内存;
    2. 对所有实例变量赋默认值;
    3. 执行实例化代码。

    每个对象除了保存类的实例变量之外,还保存着实际类信息的引用。
    例子如下:
    Child c = new Child();会将新创建的Child对象引用赋给变量c,而Base b = c;会让b也引用这个Child对象。
    创建和赋值后,内存布局如下:
    在这里插入图片描述
    引用型变量c和b分配在栈中,他们指向相同的堆中的Child对象。Child对象存储着方法区中Child类型的地址,还有Base中的实例变量a和Child中的实例变量a。

    详解:new一个对象的过程:

    java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载。加载并初始化类完成后,再进行对象的创建工作。

    我们先假设是第一次使用该类,这样的话new一个对象就可以分为两个过程:加载并初始化类和创建对象。

    一、类加载过程(第一次使用该类)
      java是使用双亲委派模型来进行类的加载的,所以在描述类加载过程前,我们先看一下它的工作过程:

    双亲委托模型的工作过程是:如果一个类加载器(ClassLoader)收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委托给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需要加载的类)时,子加载器才会尝试自己去加载。
    使用双亲委托机制的好处是:能够有效确保一个类的全局唯一性,当程序中出现多个限定名相同的类时,类加载器在执行加载时,始终只会加载其中的某一个类。

    1、加载

    由类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例

    2、验证
    格式验证:验证是否符合class文件规范
    语义验证:检查一个被标记为final的类型是否包含子类;检查一个类中的final方法是否被子类进行重写;确保父类和子类之间没有不兼容的一些方法声明(比如方法签名相同,但方法的返回值不同)
    操作验证:在操作数栈中的数据必须进行正确的操作,对常量池中的各种符号引用执行验证(通常在解析阶段执行,检查是否可以通过符号引用中描述的全限定名定位到指定类型上,以及类成员信息的访问修饰符是否允许访问等)

    3、准备
    为类中的所有静态变量分配内存空间,并为其设置一个初始值(由于还没有产生对象,实例变量不在此操作范围内)
    被final修饰的static变量(常量),会直接赋值;

    4、解析
    将常量池中的符号引用转为直接引用(得到类或者字段、方法在内存中的指针或者偏移量,以便直接调用该方法),这个可以在初始化之后再执行。
    解析需要静态绑定的内容。 // 所有不会被重写的方法和域都会被静态绑定

    以上2、3、4三个阶段又合称为链接阶段,链接阶段要做的是将加载到JVM中的二进制字节流的类数据信息合并到JVM的运行时状态中。

    5、初始化(先父后子)
    5.1 为静态变量赋值

    5.2 执行static代码块

    注意:static代码块只有jvm能够调用
       如果是多线程需要同时初始化一个类,仅仅只能允许其中一个线程对其执行初始化操作,其余线程必须等待,只有在活动线程执行完对类的初始化操作之后,才会通知正在等待的其他线程。

    因为子类存在对父类的依赖,所以类的加载顺序是先加载父类后加载子类,初始化也一样。不过,父类初始化时,子类静态变量的值也有有的,是默认值。

    最终,方法区会存储当前类类信息,包括类的静态变量、类初始化代码(定义静态变量时的赋值语句 和 静态初始化代码块)、实例变量定义、实例初始化代码(定义实例变量时的赋值语句实例代码块和构造方法)和实例方法,还有父类的类信息引用。

    二、创建对象
    1、在堆区分配对象需要的内存

    分配的内存包括本类和父类的所有实例变量,但不包括任何静态变量

    2、对所有实例变量赋默认值

    将方法区内对实例变量的定义拷贝一份到堆区,然后赋默认值

    3、执行实例初始化代码

    初始化顺序是先初始化父类再初始化子类,初始化时先执行实例代码块然后是构造方法

    4、如果有类似于Child c = new Child()形式的c引用的话,在栈区定义Child类型引用变量c,然后将堆区对象的地址赋值给它

    展开全文
  • 因此在创建类型为Cat的对象时,或者Cat类静态方法/静态域被首次访问时(被引用),java解释器必须查找类途径(classpath上查找),以定位Cat.class文件。 2,、然后类加载器载入Cat.class,有关静态初始化所有...

    假设有个名为Cat类:

    1、即使没有显示地使用static关键字,构造器实际上也是静态方法。因此在创建类型为Cat的对象时,或者Cat类的静态方法/静态域被首次访问时(被引用),java解释器必须查找类途径(classpath上查找),以定位Cat.class文件。

    2,、然后类加载器载入Cat.class,有关静态初始化的所有动作都会执行。并且,静态初始化只在Class对象首次加载时进行一次(关键字为static,与类绑定,通过类便可以访问这一变量,同时该类的对象共享这一资源。)

    3、当用new Cat()创建对象时,首先在堆上为Cat对象分配好足够的存储空间。

    4、这块存储空间会被清零,这就自动将Cat对象中的所有基本类型数据都设置成默认值(数字为0、布尔型和字符型也相同),引用被置为null。

    5、执行所有出现于字段定义出的初始化动作。(按照语句位置的顺序初始化

    6、执行构造器。

    public static void main(String args[])

    这是java程序执行的入口,是一个静态方法。当执行到这句话的时候,解释器便会寻找改类的.class文件,并将其加载进来(先加载父类、再加载接口等),初始化的时候,将这个类的静态变量先初始化(按照代码的顺序位置)、然后是初始化非静态引用对象、最后执行构造器。

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

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

    千次阅读 2016-03-28 09:27:04
    java对象的创建过程,java根本,如下图所示:
  • Java对象的创建过程详解

    千次阅读 2020-03-30 17:07:27
    本文详细介绍了Java中对象的创建过程,包括对象的创建方式、分配内存、空间初始化、构造方法执行等。
  • Java对象的创建过程

    千次阅读 2017-08-24 14:34:09
    简介在应用层,我们只需要写一个new关键字,就可以创建出一个对象,但实际上虚拟机帮我们做了...3) 如果没有,则进行类加载的过程,第二节会讲到类加载的过程; 4) 如果已经加载过,则虚拟机为对象分配内存; 5) 虚拟
  • 继承关系的对象创建过程

    千次阅读 2016-08-25 19:01:27
    继承关系的对象创建过程
  • 对象创建过程(new 的过程

    千次阅读 2017-08-26 11:07:56
    在Java程序当中每时每刻都有对象创建出来。在语言层面上,创建对象通常仅仅是使用一个new关键字而已,而在虚拟机中,对象(仅限于...如果没有,那就先执行类加载的过程(关于类加载过程在后面的博客中会进行介绍)。
  • JAVA对象的创建过程

    千次阅读 2019-08-01 18:00:16
    在图中可以清楚看到jvm在创建对象时候执行流程,下面具体讨论一下每个步骤: 在程序进行加载时候,他类信息,常量,静态变量等数据就会存放在方法区(常量池)中。 在执行new操作时候,就会去方法区去...
  • Java对象创建的具体过程

    千次阅读 2017-07-09 14:31:59
    Java是一门面向对象的编程...在语言层面上,创建对象(例如克隆、反序列化)通常仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢?
  • 子类对象的创建过程

    千次阅读 2019-04-21 15:47:06
    简单说一说子类创建对象的时候,子类和其父类的创建过程。 如下所示: class A{ int v1=1; static int v2=2; static{} public A(){} } class B extends A{ int v3=3; static int v4=4; static{} public B(){} } 一:...
  • Activity窗口对象创建过程

    千次阅读 2016-12-08 00:10:38
    基于android 7.0代码,分析Activity窗口对象创建过程。   对activity进行初始化时通过Activity.attach接口完成,当时我们只是重点关注着activity运行上下文创建过程,其实还进行了其他相关工作,例如...
  • java new对象的创建过程

    万次阅读 2018-07-29 07:00:54
    关于对象的创建过程一般是从new指令(我说是JVM层面)开始(具体请看图1),JVM首先对符号引用进行解析,如果找不到对应符号引用,那么这个类还没有被加载,因此JVM便会进行类加载过程(具体加载过程可参见我...
  • 在上一篇博文中分析了SqlSessionFactory对象创建的过程,有了SqlSessionFactory对象工厂就可以创建SqlSession了,下面就来具体分析一下SqlSession对象创建的过程。 一、SqlSession对象创建过程分析 入口程序: ...
  • JDK1.8——Java对象的创建过程

    千次阅读 2020-08-16 20:22:20
    对象创建过程概述 对象创建过程如图: 这里解释一下什么是符号引用: 符号引用: 符号引用是一个字符串,它给出了被引用内容名字并且可能会包含一些其他关于这个被引用项信息——这些信息必须足以唯一...
  • 深入理解Java对象的创建过程:类初始化与实例化

    万次阅读 多人点赞 2017-05-18 14:17:45
    在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的。...本文试图对JVM执行类初始化和实例化的过程做一个详细深入地介绍,以便从Java虚拟机的角度清晰解剖一个Java对象创建过程。
  • 前面几篇博文分别介绍了JAVAClass文件格式、JVM类加载机制和JVM内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能真正看明白)。经常有人问...
  • jvm对象的创建过程

    千次阅读 2014-04-30 10:04:05
    2虚拟机为新生对象分配内存,分配方式有指针碰撞,空闲列表.(这里对象的创建是非常频繁,需要考虑原子性问题)3内存分配后,jvm要将分配到内存初始化为零值。4jvm对对象进行必要设置,入对象是哪个类对象的...
  • shiroSubject对象创建过程

    千次阅读 2020-01-05 14:53:58
    文章目录Subject是怎么创建的Subject创建入口具体创建subject方法返回Subject Subject是怎么创建的 首先前面讲了,shiro其实就是一连串的过滤器链,过滤器链的话就是依次执行doFilter方法:我们直接找doFilter的shiro包...
  • Java创建对象的过程简介

    千次阅读 2016-12-02 11:17:42
    简单记录一下Java创建对象的过程,就是new一个对象的时候发生了哪些事情。Java程序执行的过程在此不作说明,对象创建过程只是程序执行过程的一部分。有关整个程序执行的过程,等熟悉了虚拟机之后在作说明。
  • 静态对象作为参数创建一个非静态的对象,当参数对象改变时,非静态的对象会发生改变么?
  • java 对象创建过程

    千次阅读 2014-10-18 23:46:17
    当虚拟机遇到内存创建的指令的时候(new 类名),来到了方法区,找 根据new的参数在常量池中定位一个类的符号引用。 2. 检查符号引用 检查该符号引用有没有被加载、解析和初始化过,如果没有则执行类加载过程,...
  • new创建对象的过程

    千次阅读 2018-07-16 08:21:31
    创建对象;var p= {};2. 设置新对象的__proto__属性指向构造函数prototype对象;p.__proto__ = ClassA.prototype;3. 使用新对象调用函数,函数中this被指向新实例对象: ClassA.call(p); //{}.构造函数(); ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,825
精华内容 19,530
关键字:

对象创建的过程