java对象的加载过程

1检测类是否被加载

虚拟机遇到对象的创建

首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过(类的加载过程)。

如果没有,那必须先执行相应的类加载过程。

2为新生对象分配内存

通过计算对属性计算在堆中分配空间。空间大小固定且不再更改。

由对象头,对象数据,补位码(每个对象位数都是8的倍数,不够的需要有补位码补位)三部分组成。

补充:

空间规整的情况下,在堆中使用指针碰撞

空间不规整的情况下,维护空闲列表,记录每一块的大小。使用空闲列表。

空间是否规整取决于垃圾回收器(GC的回收算法)

3初始化零值

将对象中所有非static属性赋予初值。

避免构造函数没有对所有属性进行赋值。

4进行必要的设置

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

5执行init方法

执行构造函数,对对象属性进行赋值。

补充:

方法的调用/调用

创建一个虚函数表(指针数组)(堆中/还是常量池),其中的指针指向某个类的具体成员函数实现。为每一个类创建一个虚函数表的实例,并在每个对象中保存一个指向虚函数表的指针。

原文地址:https://www.cnblogs.com/Gang-Bryant/p/10815164.html

时间: 2024-08-30 12:04:02

java对象的加载过程的相关文章

JAVA类的加载过程

周末闲来无事,做个小例子去看一下JAVA代码初始化的过程 JAVA代码初始化分为两个步骤:类初始化,对象初始化. 类初始化 1 类初始化是指类加载器将类加载到内存时,对类成员的初始化过程(其中包括static修饰的变量). 2 对于加载完的类,它的类变量都会赋一个默认值,即使你定义时就赋值了. 3 例如int类型就是0,引用类型就是null. 对象初始化 1 其实和类初始化差不多,但是他通过构造函数对对象进行了赋值 其实简单来说 类初始化做了2件事情:1 把所有属性全部赋值为0或者NULL,2

java 类的加载过程

ClassLoader的主要职责就是负责各种class文件到jvm中,ClassLoader是一个抽象的class,给定一个class文件的二进制名,ClassLoader会尝试加载并且在jvm中生成构建这个类的各个数据结构,然后使其分布在对应的内存区域中. 1类的加载过程简介 类的记载过程一般分为三个比较大的阶段,分别是加载阶段,连接阶段和初始化阶段,如下图所示 加载阶段:主要负责查找并且加载类的二进制数据文件,其实就是class文件. 连接阶段:连接阶段所做的工作比较多,细分的话还可以分为如

Java类的加载、链接和初始化

一.Java的类加载机制回顾与总结: 我们知道一个Java类要想运行,必须由jvm将其装载到内存中才能运行,装载的目的就是把Java字节代码转换成JVM中的java.lang.Class类的对象.这样Java就可以对该对象进行一系列操作,装载过程有两个比较重要的特征:层次组织结构和代理模式.层次组织结构指的是每个类加载器都有一个父类加载器,通过getParent()方法可以获取到.类加载器通过这种父亲-后代的方式组织在一起,形成树状层次结构.代理模式则指的是一个类加载器既可以自己完成Java类的

class文件加载过程详解

java类的加载过程. 参考书籍:深入理解JAVA虚拟机 书中错误的地方,p222. 字段解析,在解析一个未解析过的字段时,书中说的是先解析字段表的class_index, 但是,字段表示没有class_index, 跟在字节码指令后边的字段的符号引用是CONSTANT_Field_info. 先对其中的class_index解析. 这个过程,比较复杂,要理解这个过程,你要对Class文件结构比较了解,尤其是字段表. 1.累加载的整体流程 加载--验证--准备--解析--初始化--使用--卸载

【Java基础】Java类的加载和对象创建流程的详细分析

相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下. 实例问题 实例代码 Parent类 1 package mytest.javaBase; 2 3 public class Parent { 4 int a = 10; 5 static int b = 11; 6 // 静态代码块 7 static { 8 System.out.println("Parent静态代码块:b=" + b)

java虚拟机学习(四)类的加载过程

类从虚拟机内存加载到从内存卸载,经历的生命周期是:加载,验证,准备,解析,初始化,使用,卸载这几个阶段, 其中验证,解析,初始化被称为 连接过程(Linking). (打算这块和类加载原理后再看class文件结构那篇) 除了解析和使用,其他的过程基本顺序就是这样, 解析可以是在初始化完成之后,这是为了运行时动态绑定. 在虚拟机规范中定义了5中情况(有且只有)必须对类进行初始化(之前进行过,加载,验证,准备): 1.碰到new,getstatic,putstatic,invokestatic这4条

Java web 加载过程

1.Web容器初始化过程 2.SpringMVC中web.xml配置 3.认识ServletContextListener 4.认识ContextLoaderListener 5.DispatcherServlet初始化(HttpServletBean ? FrameworkServlet ? DispatcherServlet) 6.ContextLoaderListener与DispatcherServlet关系 7.DispatcherServlet的设计 8.DispatcherServ

java 反射,类的加载过程以及Classloader类加载器

首先自定义一个类Person package reflection; public class Person { private String name; public int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int a

Java类的加载和对象创建流程的详细分析

相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下: package com.test; public class Parent { int a = 10; static int b =11; //静态代码块 static { System.out.println("parent静态代码块:b=" + b); b++; } //代码块 { System.out.println("P