Java中各个变量的定义及内存解析

导语:之前不知道变量的内存分配,看了很多资料,所以总结了一下,方便 大家学习。

1.变量

(img-2VOkcEar-1600918374996)(/image-20200923195828691.png)]

1.类变量:又称全局变量或静态变量,需要使用static关键字修饰。在定义以后就已经存在并且占用内存空间,可以通过类名来访问,不需要实例化。全局变量存储在内存的方法区中。

2.对象实例级变量:就是成员变量,实例化后才会分配内存空间,才能访问。

3.方法级变量:就是在方法内部定义的变量,即局部变量。

**注意:**内存管理系统会根据变量的数据类型决定开辟内存空间的大小,这个空间只能储存对应的数据类型。

2.变量的内存解析

1.虚拟机栈(Java Virtual Machine Stacks)
每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。
基本数据类型直接储存在栈中,引用数据类型则保存的是一个指向对象起始的引用指针,指向堆中的值。
2.堆(Java Heap)
此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
Java 堆是垃圾收集器管理的主要区域,
3.方法区(Method Area)
方法区(Method Area)与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

根据以上可知:
局部变量来说,局部变量的数据类型如果是基本数据类型,则局部变量都储存在栈中,随着方法的结束而被清理,所以方法外不能引用方法内的变量。而引用数据类型的局部变量则在栈中保存的是一个地址值,指向堆中的值。
成员变量来说,成员变量只有在被实例化以后才会占用内存空间,当声明的是基本类型的变量其变量名及其值放在堆内存中的引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆中
全局变量来说,全局变量储存在方法区,他不会随着方法的结束而被垃圾回收。

以上是查阅资料的个人总结,如有错误谢谢大家指出。

猜你喜欢

转载自blog.csdn.net/OrangeNotFat/article/details/108770582