Java中内存分为堆内存和栈内存:
栈:存放简单数据类型变量(基本类型的变量和对象的引用变量:值和变量名都存在栈中),存放引用数据的变量名以及它所指向的实例的首地址
当一段代码中定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域时,Java会自动释放掉为该变量所分配的内存空间
堆:存放引用数据类型的实例,即用来存放由new创建的数组和对象,运行到它们作用范围之外,数组和对象所占据的内存空间也不会被释放
只有数组和对象没有被引用变量指向的时候,才会变为垃圾,但仍然占据内存空间,在随后的一个不确定的时间被垃圾回收器释放掉
Java垃圾回收
在堆内存中分配的内存,由Java虚拟机的自动垃圾回收器进行管理,它是通过一个后台线程GC进行垃圾回收,当虚拟机判定内存不够用时,会中断代码的运行,此时GC进行垃圾回收
缺点:不能精确的回收内存
java.lang.System.gc();
上面代码会建议系统回收内存,但系统不一定回应,会先查看内存是否够用,够用不做处理,不够用才会进行垃圾回收
引用变量
引用变量是普通的变量,定义时在栈中分配,在程序运行到其作用域外被释放,它相当于为数组或对象取一个名称,以后的程序中可以直接通过引用变量来访问堆中的数组或对象
内存中什么算是垃圾?
不再被引用的对象(局部变量,没有指针指向的)
Java中变量在内存中的分配
类变量(Static修饰的变量):在程序加载系统的同时,为它在堆中开辟内存,堆中内存的地址存放于栈,便于高速访问,静态变量生命周期持续到整个系统关闭
实例变量:在Java中使用关键字new时,系统在堆中开辟的空间不一定是连续的;实例变量的生命周期为它的引用丢失后,会被GC列入可回收垃圾,但不是立刻释放内存
局部变量:声明在某方法或某代码块内,执行到它的时候在栈中开辟内存,一旦脱离作用域,内存立即被释放