java程序在运行的时候需要开辟空间,JVM在运行时也是要开辟空间的,因为不同的片区运行的程序不同,JVM的内存主要分为五大片区:
- 寄存器
- 本地方法区
- 方法区
- 栈内存
- 堆内存
这里我们主要说下栈和堆:
首先java中主要存在两种数据类型:
- 基本数据类型
- 引用数据类型
栈内存: - 它是一片存储区域
- 栈内存只能存储局部变量和基本数据数据类型
- 栈内存的数据是先进后出,就类似于给手枪装子弹一样,第一个装进去的最后才会打出来。
- 栈内存的更新很快,因为局部变量的生命周期都很短,所以其空间相对较小。
在这里顺便提一下什么是局部变量:
- 在方法中定义的变量;
- for循环内部定义的变量;
堆内存:堆内存中存放的都是数组和对象,最后会有垃圾回收机制不定时收取。
下面来根据代码来理解一下:
public class Test {
public static void game() {
int a =10;
//System.out.println(a);
}
public static void main(String[] args) {
int i = 4;
game();
//System.out.println(i);
}
}
程序的执行步骤:
- JVM先找到main函数并执行
- 在栈内存中开辟空间,创建int类型的i并存放数值4
- 然后在执行game方法,在栈内存中再开辟一个新空间,创建int类型的a变量,并赋值10
- 栈内存中的方法执行结束后就自动释放了。
图解:(这个过程中不涉及到堆内存)
第二种:
public class Test1 {
int a = 4;
String s = "abc";
public void game() {
int a = 45;
System.out.println(a);
}
public static void main(String[] args) {
Test1 t = new Test1();
t.game();
}
}
- 首先找到main函数
- 执行Test1 t = new Test1(); :
- 首先,执行右边,在堆内存中开辟一块空间里面存放着
int a = 4;
String s = “abc”;
并有了一个连续的二进制地址 - 在执行左边,栈中开辟一块空间,定义变量t
- 最后执行中间的=,意思是栈中的变量t指向堆空间中的地址
- 然后执行t.game();这个是在方法区执行的,在堆中开辟空间的时候堆中就有一个地址是指向t.game();的,然后继续在栈里面创建a变量并赋值。
- 最后栈中的空间用完了之后就会自动释放,而堆中的空间会有垃圾回收机制来释放(类似扫地机器人)。
图解: