一、什么是内存泄露
内存不在GC掌控之内了。就是当一个对象已经不需要再使用了,本该被回收时,而又另外一个正在使用的对象持有它的引用从而导致对象不能被回收。这种导致了本该被回收的对象不能被回收而停留在堆内存中时,就导致了内存泄露。
二、内存分配的几种策略
1、静态存储区:内存在编译期间就分配好,这块的内存在整个运行期间都一直存在。它主要存放静态数据、全局的static数据和一些常量
2、栈式的
在执行函数(方法)时,函数一些内部变量的存储都可以放在栈上面创建,函数执行结束之后就会自动被释放掉。栈内存的运算速度很快,因为内置在处理器里面,但是容量有限。
3、堆式的
也叫动态内存分配。有时候可以通过malloc或者new来申请分配一块内存。在C/C++可能需要自己负责释放(java里面直接依赖GC机制)。在C/C++里面是可以自己掌控内存的,需要有很高的素质来解决内存的问题。java需要编程的时候注意自己良好的编程习惯。
区别:
堆是不连续的内存区域,堆空间比较灵活,也比较大。栈内存是一块连续的内存区域,大小由操作系统决定。堆管理很麻烦,频繁的new/remove会造成大量的内存碎片,这样就会慢慢导致效率低下;对于栈,他先进后出,进出不会产生碎片,运行效率高且稳定。
public class Main{
int a = 1;//引用和对象都存在于堆中
Student s = new Student();//引用和对象都存在于堆中
public void XXX(){
int b = 1;//栈里面
Student s2 = new Student();//引