本节内容视频链接:面向对象06:创建对象内存分析_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p=65&vd_source=b5775c3a4ea16a5306db9c7c1c1486b5 创建对象时的内存分析涉及到理解对象如何在内存中分配和管理。这个过程在不同的编程语言和环境中可能会有所不同,但基本的原理是相似的。Java的内存管理机制相对清晰易懂。
1. 对象创建过程
当创建一个对象时,例如使用new
关键字在Java中创建一个对象,以下步骤会发生:
-类加载:如果该类还没有被加载到JVM中,它首先会被加载。
-分配内存:JVM会在堆(Heap)上为对象分配内存。
-初始化:对象的字段会被初始化,如果声明了构造器(Constructor),它也会被调用。
-返回引用:创建对象后,会返回一个引用,指向堆上的对象。
2. 内存分配细节
-堆(Heap):这是Java用来存放创建好的对象实例的内存区域,无论哪个线程创建的对象,都存放在堆上。
-栈(Stack):当调用一个方法时,会在栈上创建一个栈帧(Stack Frame),用来存储局部变量、操作数栈和方法出口等信息。对象的引用通常存储在栈上。
3. 对象的内存布局
在JVM中,对象在内存中的布局通常包括:
-对象头(Object Header):包含两部分信息,一部分是存储对象自身的运行时数据,如哈希码、GC分代年龄等;另一部分是类型指针,指向对象的类元数据,JVM通过这个指针来确定对象是哪个类的实例。
-实例数据(Instance Data):存放类的属性数据,包括父类的属性。
-对齐填充(Padding):由于JVM要求对象的大小必须是8字节的整数倍,如果实例数据部分没有对齐,就需要通过对齐填充来补全。
4. 垃圾回收
在JVM中,垃圾回收(GC)负责回收不再被使用的对象占用的内存。有多种垃圾回收算法和回收器,它们以不同的方式确定对象是否“存活”。
理解对象创建和内存分配的过程对于编写高效、易于维护的代码至关重要。在不同的编程语言和环境中,这些概念的具体实现可能有所不同,但基本的原理是相通的。
5.代码示例分析:
package oop;
import oop.Demo02.Pet;
public class Application {
public static void main(String[] args) {
Pet dog = new Pet();
Pet cat = new Pet();
dog.name = "旺财";
dog.age = 3;
dog.shout();
System.out.println(dog.age);
System.out.println(dog.name);
}
}
package oop.Demo02;
public class Pet {
public String name;
public int age;
public void shout(){
System.out.println("叫了一声");
}
}
1、当程序运行时首先在方法区加载Application类、Pet类
2、当使用Pet dog = new Pet();创建对象时,会在堆上为对象dog分配内存;
3、同时对象dog的字段(属性、方法)也会被初始化,如果声明了构造器(Constructor),它也会被调用。
4、在栈上会创建一个dog:引用对象变量名,指向堆上的对象。