前言
今天主要是想将一件事,Java对象在内存的布局。
首先先了解以下Java中内存的分区(简单分区,讲解对象在内存的分区足够了)。
在JVM内存中,简单的分为:
- 栈区。主要存放局部变量,常见于创建一个对象都是在栈区。
- 堆区,堆区中又有方法区,方法区里又有常量区。堆区常见存放类中的数据,属性和方法。常量区常见存放字符串类型的数据。
来一段简单的代码:
//定义一个狗类,里面有三个属性
class Dog
{
int age ;
String name ;
String color ;
}
public class Object
{
public static void main(String[] args)
{
Dog dog = new Dog(); //创建一个狗的对象dog
dog.age = 3;
dog.name = "小黑";
dog.color = "黑色";
}
}
代码非常简单,就是定义一个Dog类,并且创建一个dog对象,给其赋值,我们主要来观察以下这段代码执行时候对象dog在内存是如何布局的。
Dog dog = new Dog(); //创建一个狗的对象dog
dog.age = 3;
dog.name = "小黑";
dog.color = "黑色";
- 首先 执行第一行代码 Dog dog = new Dog(); 会加载类中的信息,加载属性信息和方法信息,加载到哪儿呢?属性信息加载到堆区(主要细节下次讲),方法信息加载到方法区(该知识在下一篇文章讲)。此时,堆区会分配到一段空间存放属性的初始值。并且在栈区开辟一段空间,保存对象dog,由于对象属于引用类型,所以该对象会指向堆区中的内存空间。
- 执行第二行代码 dog.age = 3; 给age赋值为 3,该赋值是在堆区进行的。
- 执行第三行代码 dog.name = “小黑”; 给name属性赋值为 小黑,但是由于小黑 是字符串类型,字符串类型也是属于引用类型,所以在堆区存放的是字符串的地址,字符串的值保存在方法区中的常量区。
- 执行最后一行代码和第三行一样。
分区图如下:
总结
对象在内存的分区就大概到这里了,以后还会分享对象在内存中的分配机制,方法(函数)的调用机制,传参机制。感谢观看!