面试题:Java中的垃圾收集器相对于以前的语言优势是什么?
答案:过去的语言(如C语言)要求程序员显示的分配内存、释放内存。程序在需要时分配内存,不需要时释放内存。但是这种做法常常引起“内存泄露”,即由于某种原因使分配的内存始终没有得到释放。如果该任务不断重复,程序早晚会耗尽内存并异常终止,至少无法继续运行。相比之下,Java不要求程序员显示的分配地分配内存和释放内存,避免了很多潜在问题。Java在创建对象时会自动分配内存,并当该对象的引用不存在时释放这块内存.
Java中使用被称为垃圾收集器的技术来监视Java程序的运行,当对象不再使用时,就自动释放对象所使用的内存。Java使用一系列软指针来跟踪对象的各个引用,并用一个对象表格将这些软指针映射为对象的引用。之所以称为软指针,Java的垃圾收集器能够以单独的线程在后台运行,并依次检查每个对象。统统更改对象表项,垃圾收集器可以标记对象、移除对象、移动对象或检查对象。
垃圾收集器是自动运行的,一般情况下,无需显示的请求垃圾收集器。程序运行时,垃圾收集器会不时检查对象的哥哥引用,并且回收无引用对象所占用的内存。调用system类中的静态go()方法可以运行垃圾收集器,但这样并不能保证立即回收指定对象。
拓展知识:变量的内存分配情况
我们在使用垃圾回收时需要注意以下几点,或许可以作为写程序时的准则。
(1)不要试图去假定垃圾收集发生的时间,这一切都是位置的。比如,方法中的一个临时对象在方法调用完毕后就变成了无用对象,这个时候它的内存就可以被释放。
(2)Java中提供了一些和垃圾收集器打交道的类,而且提供了一种强行执行垃圾收集的方法——调用了system.gc(),但这同样是一个不确定的方法,Java中并不保证每次调用该方法就一定能够启动垃圾收集器,它只不过会向JVM发出这样一个申请,到底是否真正只想垃圾收集,一切都是个未知数。
(3)挑选适合自己的垃圾收集器。一般来说,如果系统没有特殊和苛刻的性能要求,可以采用JVM的默认选项。否则可以考虑使用有针对性的垃圾收集器,比如增量收集器就比较适用于实时性要求较高的系统中,若系统具有较高的配置,有比较多的闲置资源,则可以考虑使用并行标记/清除收集器。
(4)关键的也是难把握的问题是内存泄露。良好的编程习惯和严谨的编程态度永远是最重要的,不要让自己的一个小错误导致内存出现大漏洞。
(5)尽早释放无用对象的引用。大多数程序员在使用临时变量的时候,都是让引用变量在退出活动域后,自动设置为null,按时垃圾收集器来收集该对象,还必须注意该引用的对象是否被监听,如果是,则要去掉监听器,然后在赋空值。也就是说,对于频繁申请内存和释放内存的操作,还是自己控制一下比较好,但是system.gc()的方法不一定使用,最好使用finalize强制执行或者写自己的finalize方法。
更多,Java视频,Java教程尽在极悦Java培训,关注极悦官方微信,获得一手Java面试题。