类加载过程和创建对象做了哪些步骤?

简介: 类加载过程和创建对象做了哪些步骤?

A:Java虚拟机运行时数据区域(JVM : Java virtual machine)

1. 程序计数器 Program Counter Register

2. 本地方法栈 Native Method Stack

3. 虚拟机栈JVM Stack(方法栈,栈区)

   1. 作用:执行方法

   2. 程序中所有方法若想执行,必须进栈(压栈),方法执行完弹栈

   3. 栈的结构

  1. 栈 : 先进后出  

  2. 队列:先进先出

4. 堆 Heap

   1. 保存实体对象和数组

5. 方法区 Method Area

   1. 加载存储class文件      


B:类加载过程:jvm虚拟机将class文件从硬盘上加载到方法区中,

可见后面反射的类加载器:


对于非静态变量,不是开辟内存空间,只是将被翻译成为二进制的代码加载到方法区内存中。


对于静态变量,jvm虚拟机会在方法区中给静态变量开辟空间,并且先给默认初始化值,然后在赋值。


启动JVM,加载程序中需要使用的class文件。


在加载class文件的时候,所有的静态内容(静态成员变量,静态成员函数,静态代码块)都要加载到方法区的静态区中。

当类中的所有静态加载完成之后,开始给类中的所有静态成员变量默认初始化。

类中的所有静态成员变量默认初始化完成之后,开始给这些静态成员变量显示赋值。

所有静态成员变量显示赋值结束之后,开始运行类中的静态代码块。

当所有的静态代码块执行完成,代表当前这个class文件才彻底被加载结束。

C:new创建一个对象都在内存中做了什么事情?

Student s = new Student();这句代码随着主方法入栈(在栈中生成),只是在堆区中开辟


空间。


1:先将硬盘上指定位置的Person.class文件加载进内存。


2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。


3:使用new关键字创建对象,在栈内存中给对象变量开辟一个空间,在堆内存给对象分配空间。


   4:给对象所属类中的所有非静态成员变量分配空间并进行默认初始化。(定义没有直接赋值就会)


   5:执行和new对象时传递参数一致的构造方法


         执行构造方法的过程中有隐式三步:


              ①:执行super()语句,找父类的无参构造方法(在这过程中也有隐式三步,执行super()。。。直到超类object类)


              ②:给非静态成员变量进行显示赋值


              ③:运行构造代码块


              ④:执行构造方法中的自己写的代码。


6:将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)


D:new关键字为什么能够开辟空间?(JVM 在windows上,JVM调用windows内存c、c++)

0 . 原理: 子类要能定义成功(能创建对象),必须调用父类的构造方法!(本质调用Object的构造)


          1. Object 是所有类(除了Object本身),数组的顶层父类


          2. Object 有一个本地方法 native void registerNatives(); - 》 Java调用C、C++(JVM底层)


                          1. 申请系统资源(内存),就可以创建对象了


          3. Object的方法在Object类被加载的时候就执行了(最先加载)


          4. Object加载过后,申请到系统资源,对象就可以new了


创建对象申请空间图解:


image.png

image.png

目录
相关文章
|
7月前
|
设计模式
单例设计模式步骤
单例设计模式步骤
35 1
|
1天前
|
算法 Java
JVM创建对象,你了解几个步骤
JVM创建对象的过程包括五个主要步骤:1. 类加载检查,确保类已加载并验证其合法性;2. 内存分配,根据对象大小和堆内存情况分配空间,必要时触发垃圾回收;3. 初始化零值,为基本数据类型和引用类型设置初始值;4. 设置对象头,记录对象的类型信息和GC相关数据;5. 执行init方法,调用构造函数完成对象的初始化。掌握这些步骤有助于深入理解JAVA虚拟机的工作原理,并在技术面试中展示技术实力。
|
1月前
类加载过程
(1)加载 :加载字节码文件,将字节码中的静态变量和常量转换到方法区中,在堆中生成class对象作为方法区入口 (2)连接: 验证:验证字节码文件的正确性。 准备:正式为类变量在方法区中分配内存,并设置初始值。 解析:将符号引用(如类的全限定名)解析为直接引用(类在实际内存中的地址)。()
|
7月前
|
Java 编译器 容器
浅谈类的加载过程
浅谈类的加载过程
34 3
|
存储 安全 Java
一文解读类的加载过程(类的生命周期)(上)
一文解读类的加载过程(类的生命周期)
|
缓存 Java 开发者
一文解读类的加载过程(类的生命周期)(下)
一文解读类的加载过程(类的生命周期)(下)
|
存储 安全 Java
说说类加载的过程
说说类加载的过程
73 0
|
安全 Java
创建对象的相关知识补充
创建对象的相关知识补充
65 0
|
Java
JVM中对象创建的过程
JVM中对象创建的过程
110 1
|
安全 前端开发 Java
JVM 类加载过程解析
JVM 类加载过程解析
JVM 类加载过程解析