面试之Java底层GC

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq3399013670/article/details/87309807

1、判断是否是垃圾的方法?

  • 引用计数算法(判断对象的引用数量),java未使用,无法检测循环引用数量,会造成内存泄露问题。
  • 可达性分析算法(通过判断对象的引用链是否可达来决定对象是否可以被回收)。

2、谈谈你了解的垃圾回收算法。

  • 标记-清除算法。易造成碎片化。
  • 复制算法。分为对象面和空闲面。解决碎片化问题,顺序分配内存,简单高效,适用于对象存活率低的场景。
  • 标记-整理算法。避免内存的不连续性;适用于对象存活率高的场景。
  • 分代收集算法。目的,提高垃圾回收器的效率。JDK8永久代被去除。保留了年轻代和老年代。

3、年轻代

尽可能快速地收集掉那些生命周期短的对象。分为:Eden区;两个Survivor区。

Eden(8/10),from(1/10),to(1/10)。

4、对象如何晋升到老年代?

(1)经历一定Minor次数依然存活的对象;
(2)Survior区中放不下的对象。
(3)新生成的大对象(-XX:+pretenuserSizeThreshold)。

5、老年代

  存放生命周期较长的对象。

6、触发Full GC的条件

 (1)老年代空间不足;
 (2)永久代空间不足;
 (3)CMS GC时出现promotion failed,concurrent mode failure;
 (4)Minor GC晋升到老年代的平均大小大于老年代的剩余空间;
 (5)调用System.gc();
 (6)使用RMI来进行RPC或管理JDK应用,每小时执行1次Full GC。

7、常见的垃圾收集器。

* JVM的运行模式:Server(启动慢,性能好),Client。
* Serial收集器,复制算法;单线程收集,进行垃圾收集时,必须暂停所有工作线程;
* ParNew收集器,复制算法;多线程收集;
* Paraller Scavenge收集器,复制算法,更关注系统的吞吐量。Server模式下默认的年轻代收集器。
* Serial Old收集器,标记-整理算法;
* Paraller Old收集器,标记-整理算法;
* CMS收集器,标记-清除算法;
* G1收集器,复制+标记+整理算法。

8、Object的finalize()方法的作用是否与C++的析构函数相同。

 与C++的折构函数不同,析构函数调用确定,而finalize()方法不确定。
 将未被引用的对象放置于F-Queue队列。
 方法执行随时可能会被终止。
 给予对象最后一次重生的机会。

9、Java中的强引用,软引用,弱引用,虚引用有什么用?

(1)强引用

最普遍的引用:Object obj = new Object();
抛出OutOfMemoryError终止程序也不会回收具有强引用的对象;
通过将对象设置为null弱化引用,使其回收。

(2)软引用

对象处在有用但非必须的状态;
只有当内存空间不足时,GC会回收该引用的对象的内存;
可以用来实现高速缓存。

String str = new String("abc");// 强引用
SoftReference<String> sofRef = new SoftReference<String>(str);

(3)弱引用

非必须的对象,比软引用更弱一些;
GC时被 回收;
被回收的概率也不大,因为GC线程的优先级比较低;
适用于引用偶尔被使用且不影响垃圾回收的对象。

(4)虚引用

不会决定对象的生命周期;
任何时候都可能被垃圾收集器回收;
跟踪对象被垃圾回收的活动,起哨兵作用;
必须和引用队列ReferenceQueue联合使用。

String str = new String("abc");
ReferenceQueue queue = new ReferenceQueue();
PhantomReference ref = new PhantomReference(str,queue);

猜你喜欢

转载自blog.csdn.net/qq3399013670/article/details/87309807
今日推荐