对象内存管理
-
编译好的Java程序要运行在JVM中
-
程序,无论是代码还是数据,都要存储在内存中,JVM为Java程序提供并管理所需要的内存空间
-
JVM在其内存开辟了"堆"、“栈”、"方法区"三个区域,分别存储不同的数据;
垃圾回收机制
-
垃圾回收器(GC)是JVM自带的一个线程(自动运行着的程序),用于回收没有任何引用指向的对象;
-
Java程序员不用担心内存管理,因为GC会自动进行回收管理;
-
GC的回收对程序员来说是透明的,并不一定一发现有无引用的对象,就立刻回收;
-
System.gc():用于建议虚拟机马上调度GC线程回收资源,具体的实现策略取决于不同的JVM系统;
堆内存
-
这部分空间用于存储使用new关键字所创建的对象,成员变量是对象的属性,也在堆中;
-
对象的声明周期:创建对象时存在堆中,对象被GC回收时消失;
-
内存泄漏:不再使用的对象没有被及时的回收;
-
建议:当对象不在使用时应及时将引用设置为null;
非堆–栈
-
这部分空间用于存储程序运行时(正在调用中的)在方法中声明的所有局部变量;
-
调用方法时JVM在栈中为该方法分配一个对应的空间,也称为栈帧,栈帧中包含所有的局部变量(包括参数);
-
当方法调用结束时,栈帧消失;
-
局部变量的生命周期:调用方法时存在栈中,方法调用结束时与栈帧一并消失;
非堆–方法区
-
这部分空间用于存放类的信息(包括方法);
-
Java程序运行时,首先会通过类装载器载入类文件的字节码信息,经过解析后将其装入方法区;
-
所有对象共享类的方法,方法仅有一份,通过this来区分具体的对象;