对象内存管理
一、基本数据类型
1.数值
2.整型:byte、short、int 、long
3.浮点型:float、double
4.字符: char
5.布尔:boolean true/false
二、引用数据类型
1.类
public class User{
private String name;
}
User user = new User();
2. 接口
public interface phone{
public void call();
}
public HuaWei implements phone{
public void call(){
}
}
3.数组
int[] arr = new int[2];
String[] strArr = new String[];
三、JVM虚拟机如何运行.class程序:
1)运行前:JVM虚拟会向计算机申请初始内存空间
2)运行中:java程序运行之后,java程序会不断向JVM请求内存,一旦JVM使用内存
超过了初始内存,JVM继续向计算机请求更多的内存空
3)内存溢出:当JVM虚拟机向计算机请求的内存超出了预定范围之后,则内存溢出
outOfMemeory
四、JVM虚拟机内内存管理
1)方法区(method area)
2)堆(heap)
3)栈(stack)
五、引用数据类型创建流程
1)在堆区划分一块内存空间存储相应值
2)在栈区划分内存空间指向新创建对象在堆中的地址
六、类的实例对象的创建过程 User user = new User()
1.先检查需要使用类对象的.class文件在方法区是否存在
2.如果不存在,则先加载相应的.class文件
3.加载.class文件流程
(1)静态成员属性及代码块:加载静态方法区(重点:只加载一次)
-》静态代码块:加载.class文件自动执行,并且执行一次
-》非静态代码块:在创建实例对象的时候调用,每次创建都会被调用
(2)非静态成员属性和方法:加载到非静态方法区
4.在堆区划分内存空间,根据类的模板,赋予类的属性初始值
5.调用相应构造函数,给对象属性赋值
6.在栈区划分内存空间保存对象的地址
六、A object = new A()
public class A {
String name;
public static int a = 5;
// 构造方法
public A() {
System.out.println("class A");
}
// 代码块
{
System.out.println("I'm class A");
}
// 静态代码块
static {
// background = 加载图片操作
System.out.println("class A static");
}
public void show() {
System.out.println(name);
}
}
运行流程
第一步:编译A.java ----> A.class
第二步:将A.class 加载到JVM虚拟机方法区
第三步:执行A.class中的静态代码块,即以下代码块
static {
// background = 加载图片操作
}
第四步:加载静态属性到静态方法区
public static int a = 5;
第五步:将非静态属性和方法加载非静态方法区
// 代码块
{
System.out.println(“I’m class A”);
}
String name;
public void show() {
System.out.println(name);
}
第六步:执行类中非静态代码块
// 代码块
{
System.out.println(“I’m class A”);
}
第七步:在堆中划分内存空间,为新建对象进行属性的初始化
第八步:调用构造方法,为对象的属性赋值
第九步:在栈区划分内存空间,保存新建对象的内存地址
A object1 = new A(); // 第一次
A object2 = new A(); // 第二次,直接从第六步开始