java面向对象-创建对象内存分析
首先,我们先了解方法区,栈,堆都是干嘛的,有什么用?
方法区(静态区):
- 方法区是最先有数据的,因为类是最先被加载的
- 它用来存储类信息、class对象、静态变量、字符串常量等等,被所有线程共享
- 方法区实际也是堆
栈
- 每当方法被调用时,栈都会创建一个栈帧(存储局部变量、操作数、方法出口等)
- 创建对象所需要的内存是由栈来分配的
- 用于存放该线程执行方法的信息(实际参数,局部变量等)
- 是线程私有的,不能实现线程之间的共享
堆
- 堆用来存储创建好的对象和数组(数组也是对象),成员变量(实例变量)
- 重点:凡是通过new运算符创建的对象,都存储在堆内存当中。
- new运算符的作用就是在堆内存中开辟-块空间
- 被线程所共享
创建对象内存分析
首先我们先创建一个Student类,类中定义了成员变量,再去测试类中实例化Student对象
内存分析
第一步:
当我们运行测试类时,类和static都是最先被加载的,Student类和测试类都会出现在方法区
第二步:
当运行到main方法时,就是由栈来执行了,我们在main方法实例化了Student对象,所以栈会为Student对象在堆中分配内存空间,并保存了Student对象的内存地址,通过引用变量来调用这个对象,如:Student对象在栈中显示的格式为:
Student s1 =01234;
01234就是对象所在堆的内存地址,我们再通过引用变量s1来引用这个对象
第三步:
堆内存就会开辟一块空间存储栈中所分配的对象,并且堆内存会给每个对象分配一个内存地址,如Student对象就分配了一个内存地址:0*1234
new运算符的作用就是在堆内存中开辟-块空间
参考文献:什么是栈,堆,方法区