GC

GC原理深入分析

1.请问GC是什么? 还有为什么要有GC?

答:GC是垃圾收集的意思(Gabage Collection)

之所以需要GC是因为:内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

2.请说明一下垃圾回收的优点以及原理。

答:Java 语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。

垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

3.请简单描述一下垃圾回收器的基本原理是什么?还有垃圾回收器可以马上回收内存吗?并且有什么办法可以主动通知虚拟机进行垃圾回收呢?

答:

  • 垃圾回收器的基本原理:对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是”可达的”,哪些对象是”不可达的”。当GC确定一些对象为”不可达”时,GC就有责任回收这些内存空间。
  • 可以
  • 程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

4.什么原因会导致minor gc运行频繁?同样的,什么原因又会导致minor gc运行很慢?请简要说明一下

答:导致minor gc频繁原因

  • 产生了太多朝生夕灭的对象导致需要频繁minor gc
  • 新生代空间设置的比较小

导致minor gc运行很慢

  • 新生代空间设置过大。
  • 对象引用链较长,进行可达性分析时间较长。
  • 新生代survivor区设置的比较小,清理后剩余的对象不能装进去需要移动到老年代,造成移动开销。
  • 内存分配担保失败,由minor gc转化为full gc
  • 用的垃圾收集器效率较低,比如新生代使用serial收集器

5.请问java中内存泄漏是什么意思?什么场景下会出现内存泄漏的情况?

答:Java中的内存泄露,广义并通俗的说,就是:不再会被使用的对象的内存不能被回收,就是内存泄露。如果长生命周期的对象持有短生命周期的引用,就很可能会出现内存泄露。

1)静态集合类,例如HashMap和Vector;

2)各种连接,如数据库连接、网络连接、IO连接;

3)变量不合理的作用域;

4)单例模式。