Java内存的堆(heap)、栈(stack)和方法区(method) 以及内存图解释

堆区: jvm中只有一个堆区 线程是共享的
存放使用new创建的对象或数组
所有的对象有内存地址值
数据都有默认初始化值
堆内存的对象不再被指向时 ,jvm启动垃圾回收机制 自动清除

栈区: 每个线程包含一个栈区, 栈区保存的基本数据和引用数据类型地址
每个栈区数据都是线程私有的, 其他线程不能访问
栈内存中的数据 , 没有默认初始化值 , 需要手动设置
方法调用完成, 栈区立即释放, 称为出栈

方法区: 方法区和java堆区一样是线程共享的
存储已被java虚拟机加载的类信息,常量,静态变量,以及编译器编译后的代码 等.

是不是一看上面好乱啊 ! 是吧我也觉得很乱 ,那就记住以下就好了

总结一下吧
栈区是属于线程私有的, 存储的是局部变量, 而堆区是线程共享的, 其中存储的是对象,而方法区实际上也是堆, 属于堆的块 主要存储一些类的有关的信息, 字节码信息 静态属性 方法 字符串常量

一个对象的内存图示

测试代码

public static void main(String[] args) {
    
    
//创建对象
Phone p1 = new Phone();
//展示成员变量值
System.out.println(p1.getPrice()+"----"+p1.getColor());
//为成员变量赋值
p1.setPrice(1000);
p1.setColor("粉色");
//展示成员变量值
System.out.println(p1.getPrice()+"----"+p1.getColor());
//调用成员方法
p1.call("张三");
p1.sendMessage();
}



参考一下这张内存图
内存图在这里插入图片描述

内存中各部分的总结:
栈内存:
1、用于执行方法
2、用于存储局部变量

堆内存:
1、用于保存对象数据

多个对象的内存图示

测试代码

public static void main(String[] args) {
    
    
//创建对象
Phone p1 = new Phone(1000,"粉色");
Phone p2 = new Phone(2000,"橙色");
//调用成员方法
p1.call("张三");
}

内存图 解释

在这里插入图片描述

两个对象名,指向同一个堆内存对象

测试代码

public static void main(String[] args) {
    
    
//创建对象
Phone p1 = new Phone(1000,"粉色");
Phone p2 = p1;
//为成员变量赋值
p2.setColor("橙色");
//观察 p1 值的变化
System.out.println(p1.getColor());
}

内存图
在这里插入图片描述
多个对象名,指向同一个对象。好比多个同学共用一张课桌一样

猜你喜欢

转载自blog.csdn.net/weixin_43464372/article/details/108195619
今日推荐