查看: 632|回复: 0

[推荐] 2016Java面试题精编版—垃圾收集

[复制链接]

54

主题

79

帖子

735

积分

Kib

Rank: 3Rank: 3

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

使用 高级模式(可批量传图、插入视频等)
您需要登录后才可以回帖 登录 | 立即注册

快速回复 返回顶部 返回列表