目录
一、栈内存(stack)
1)定义:编译器自动分配和释放的一块内存区域,类似于数据结构的栈;
2)存放内容:定义在方法中、局部代码块中的局部变量;
3)管理:所占用的空间直到相对应的代码块、方法执行完就立即自动释放;
4)优点:存取速度快,仅次于寄存器,数据可共享;
5)缺点:数据大小与生存期必须是确定的,缺乏灵活性。
二、堆内存(heap)
1)定义:程序运行时动态分配的内存区域,类似于数据结构的链表;
2)存储内容:通过new建立的实体,每一个实体都有自己的内存地址值,实体中的变量都有默认的初始化值;
扫描二维码关注公众号,回复:
11173957 查看本文章
3)管理: 当实体不再被使用的时候,会在不确定的时候,由垃圾回收器 (GC)回收(释放空间);
4)优点:动态“按需分配”内存大小,生存期不必事先告诉编译器,使用完毕后,GC会自动收走这些不再使用的内存块;
5)缺点:由于要在运动时才动态分配内存,相比于栈内存,它的存取速度较慢。
三、垃圾回收机制 (GC)
1)垃圾生成时间:当一个堆内存中的对象在栈中没有引用指向它的时候,这个对象就被JVM视为垃圾;
2)垃圾回收时间:垃圾不会被立刻回收,而是在未知的时间点,JVM启动GC来回收这个对象所占用的空间,无需手动清理;
PS:
int[] x =new int[3];
int[] y =x;
y[1] =89;
x =null;
这段程序执行完之后,在堆内存中有没有垃圾对象?
分析:由于x变成null之前,已经把数组的首地址的值传给了y,所以x变成null之后,y还是指向了内存中的数组对象,程序执行完之后,对内存中的数组对象在栈内存中仍然有引用变量指向它,所以堆内存中没有垃圾对象。
如图:
JAVA基础篇专栏持续更新中,更多JAVA基础知识请移步专栏垂阅,希望对您有帮助!