1.什么是GC,为什么要有GC?
GC(Gabage Collection)就是程序中的垃圾回收。因为我们在开发中会创建大量的对象,会占据堆空间,如果不回收就会造成内存泄漏。所以,我们要有GC来释放掉没用的对象。
2.简单说一下垃圾回收机制
不同生命周期采用不同的算法
Java采用分代回收,分为年轻代、老年代、永久代。
(1)年轻代:所有新生成的对象都是放在年轻代中,年轻代的目的就是尽可能快速的手机掉那些生命周期短的对象。年轻代分为E区(Eden)、S0区(Survivor0)、S1区(Survivor1)。
(2)老年代:当对象在年轻代经过多次垃圾回收后仍存活后,会被放到老年代。可以说,老年代存活的都是一些生命周期比较长的对象。
(3)永久代:用于存放Java类,方法等。但是在Jdk1.8后,就没有了永久代这个概念。
3.常用的垃圾回收算法有哪些?
复制(Serial收集器)、标记整理(Serial Old收集器)、标记清除(CMS收集器)
4.为什么要是用分代回收机制?
因为没有一种算法适用于所有对象
当对象存活率低时,用复制算法最合适。
当对象存活率高时,用标记整理或标记清除最合适。
5.如何判对一个对象是否存活?
现在主流的都是使用可行性分析法,从GC Roots计算引用链,能链上的对象就是存活的。
6.如果对象的被引用被置为null,垃圾收集器是否会立即释放对象占用的内存?
不会。对象回收需要一个过程,这个过程中对象还能复活,而且垃圾回收具有不确定性,指不定什么时候开始回收。
7.什么是内存泄漏和内存溢出?
(1)内存泄漏:是指程序申请内存后,无法释放已申请的内存空间。一次内存泄漏不会有多大问题,但是多次内存泄漏就会造成内存溢出。
(2)内存溢出:指程序申请内存时,没有足够的内存供申请者使用。或者说,给了你一块存储int类型数据的存储空间,结果你却存储long类型的数据,这样也会报内存溢出。
通俗的说就是停车场(堆)保安(gc)让很久不用的废弃车子(无用的对象)从车位上挪走,但是这个车子又没办法挪走。这就是内存泄漏。
停车场所有的车位都有车子占用了,再来车子没地了,或者说给你一个小汽车的停车位(int),你非要停一辆高铁(Long),这就是内存溢出。