Java的垃圾回收机制
“c++程序员觉得内存管理太重要了,所以内存一定要自己进行管理;Java/C#程序员觉得内存管理太重要了,所以一定不要自己去管理。”
Java中使用被称为垃圾回收集器的技术来监视Java程序的运行,当对象不再使用时就会自动释放对象使用的内存。
Java中使用一些软指针来指向对象的引用。
Java的垃圾回收集能够以单独的线程在后台运行,并依次检查每个对象。
垃圾回收集是自动运行的,一般情况下,不需要显示调用。垃圾回收集会不时检查对象的使用。
Java垃圾回收集并不能完全阻止内存溢出情况。例如:当创建一个引用对象时,其他的引用对象没有被抛弃,也会造成内存溢出的情况。
Java垃圾回收并不是一个独立的平台,它具有平台依赖。
Java垃圾回收集:gc即垃圾回收集,是指JVM用于释放那些不再使用的对象所占的内存资源。
Java的垃圾回收机制是为所有的应用程序服务的,而不是为某个程序单独服务的。因此,任何一个程序都不能命令垃圾回收机制做什么,怎么做或做多少。
Java中提供一些和垃圾收集打交道的类,而且提供了一种强行执行垃圾收集的方法——调用System.gc(),但这同样是一个不确定的方法。Java中并不保证每次调用该方法就一定能启动垃圾收集,它只不过会向jvm发出这样的一个申请,到底是否真正的执行垃圾回收,一切都是个未知数。
Java中一般来说,如果没有特殊情况就使用jvm默认选项。增量收集器比较适用于实时性要求比较高的系统中;若系统具有较高的配置,有比较多的闲置资源,则可以考虑使用并行标记/清除收集器。
对于频繁调用内存和释放内存的操作还是自己管理内存,System.gc()并不一定管用,可以使用finalize强制执行,或自己编写finalize方法。
——————摘自书籍《Java程序员面试宝典》
举例:
来自:http://blog.youkuaiyun.com/javayohn/article/details/3202064
程序段2:
1.Object sobj = new Object ( ) ;
2.Object sobj = null ;
3.Object sobj = new Object ( ) ;
4.sobj = new Object ( ) ;
问:这段代码中,第几行的内存空间符合垃圾收集器的收集标准?
答:第1行和第3行。因为第2行为sobj赋值为null,所以在此第1行的sobj符合垃圾收集器的收集标准。而第4行相当于为sobj赋值为null,所以在此第3行的sobj也符合垃圾收集器的收集标准。
如果有一个对象的句柄a,且你把a作为某个构造器的参数,即 new Constructor ( a )的时候,即使你给a赋值为null,a也不符合垃圾收集器的收集标准。直到由上面构造器构造的新对象被赋空值时,a才可以被垃圾收集器收集。
程序段3:
1.Object aobj = new Object ( ) ;
2.Object bobj = new Object ( ) ;
3.Object cobj = new Object ( ) ;
4.aobj = bobj;
5.aobj = cobj;
6.cobj = null;
7.aobj = null;
问:这段代码中,第几行的内存空间符合垃圾收集器的收集标准?
答:第7行。注意这类题型是认证考试中可能遇到的最难题型了。
行1-3分别创建了Object类的三个对象:aobj,bobj,cobj
行4:此时对象aobj的句柄指向bobj,所以该行的执行不能使aobj符合垃圾收集器的收集标准。
行5:此时对象aobj的句柄指向cobj,所以该行的执行不能使aobj符合垃圾收集器的收集标准。
行6:此时仍没有任何一个对象符合垃圾收集器的收集标准。
行7:对象cobj符合了垃圾收集器的收集标准,因为cobj的句柄指向单一的地址空间。在第6行的时候,cobj已经被赋值为null,但由cobj同时还指向了aobj(第5行),所以此时cobj并不符合垃圾收集器的收集标准。而在第7行,aobj所指向的地址空间也被赋予了空值null,这就说明了,由cobj所指向的地址空间已经被完全地赋予了空值。所以此时cobj最终符合了垃圾收集器的收集标准。 但对于aobj和bobj,仍然无法判断其是否符合收集标准。
总之,在Java语言中,判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个:
1.给对象赋予了空值null,以下再没有调用过。
2.给对象赋予了新值,既重新分配了内存空间。
最后再次提醒一下,一块内存空间符合了垃圾收集器的收集标准,并不意味着这块内存空间就一定会被垃圾收集器收集。
举例:如果有一个对象的句柄a,且你把a作为某个构造器的参数,即 new Constructor(a),则即使你把a赋值为null,a也不符合垃圾收集器的收费标准。直到由上面的构造器构造新的对象杯赋空值时,a才可以被垃圾收集器收集。