JVM的内存主要分为堆内存和栈内存。
很多面试或者笔试的过程中会被问到堆内存和栈内存的区别。
现在我根据看过的博客简单的总结一下。
栈:存放的数据是基本数据类型和引用类型。栈里面的数据超过作用域之后,java会自动释放空间。
堆:存放的是new新建的对象和数组。是由GC垃圾回收机制进行释放空间的。这个就是由JVM决定的,和编程人员没有关系了。但是在堆中产生了一个数组或对象后,还需要在栈中存放一个特殊的变量,让栈中的这个变量的值等于数组或对象在堆内存的首地址。栈中的这个变量就成了数组或对象的引用变量。(栈里面存放的是地址)
*************************************--------------------------------------------************************************
引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象。
java中的变量可以分为三种:静态变量、实例变量、局部变量
1、静态变量:程序被加载在系统就为他在堆中开辟了内存。静态变量的生命周期一直持续到整个“系统”关闭。静态变量在编译的时候被创建,同时也被初始化,如果有给定的值,则初始化就是所给定的值,如果没有给定值,则初始化为默认值。是类的属性。
2、实例变量:当使用new关键字的时候,系统就在堆中开辟了一个空间给变量(空间并不一定是连续的,如果是零散地址,然后根据零散的堆内存地址,通过哈希算法换算成一长串的数字以表征这个 变量在堆中的物理位置)实例变量的生命周期当实例变量的引用丢失后,将被列在GC的回收名单当中。
3、局部变量:是生命在方法或者是某段代码当中的,执行到它的时候在栈中开辟内存,当局部变量超过作用域之后,内存会被释放。就是栈的出栈操作。