GC相关

2019-02-21  本文已影响0人  十丈_红尘

一 对象被判定为垃圾的标准是什么?

 1. 没有任何引用的时候;


二 判定对象是否为垃圾的算法.

 1. 引用计数算法 : 通过判断对象的引用数量来决定对象是否可以被回收,在这种机制下堆中的每个对象都会有一个引用计数器,引用成功则+1,引用完成则-1;所以任何引用计数为0的对象都是可以被当做垃圾来处理的;
  优点 : 执行效率高,程序执行受影响小;
  缺点 : 无法解决循环引用的情况,容易导致内存泄漏;
 2. 可达性分析算法 : 通过判断对象的引用链是否可达来决定对象是否被回收;可达性算法会对内存中的整个路线图进行遍历(从GC Root开始),回收器会将所有遍历到的对象标记为存活;当标记阶段完成以后所有的对象都已经被标记完成了,如果此时有没有被标记的对象回收器就会认为这些对象为垃圾进行回收;


三 什么对象可以作为GC Root?

 1. 虚拟机栈中引用的对象;
 2. 方法区中常量引用的对象;
 3. 类静态属性引用的对象;
 4. 本地方法栈中JNI引用的对象;
 5. 活跃线程的引用对象;


四 谈谈你了解的垃圾回收算法.

1. 标记-清除算法
  • 标记 : 从根集合进行扫描,对存活的对象进行标记;
  • 清除 : 对堆内存进行从头到尾的线性遍历,回收不可达对象内存;
  • 缺点 : 导致大量的空间不连续;
2. 复制算法
  • 分为对象面和空闲面;
  • 对象在对象面上创建;
  • 存活的对象在空间不足的情况下会在复制到空闲面中;
  • 最后将对象面中的对象一次性全部清空;
  • 此算法适用于对象存活率较低的场景;
3. 标记-整理算法
  • 标记 : 从根集合进行扫描,对存活对象进行标记;
  • 整理 : 移动所有存活对象,且按照内存地址依次排序然后回收所有空闲内存;
4. 分代收集算法
  • 是一套垃圾回收算法的组合;
  • 按照对象的声明周期划分成不同的区域,然后采用不同的算法进行回收;

五 GC的分类

1. 轻GC : 复制算法 + 空间交换;
2. 重GC : 标记-清理算法

六 对象怎么才能到老年代?

  1. 经过一定轻GC次数的对象;
  2. 幸存区中存放不下的对象;
  3. 新生成的大对象;

七 常用的调优参数.


八 重GC与轻GC的区别

  1. 作用域不一样;
  2. 效率不一样;

九 重GC触发条件.

  1. 老年代空间不足;
  2. jdk7以下永久代空间不足;
  3. System.gc

十 常见问题解析

1. Object的finalize()方法的作用是否与C++的析构函数相同?

 1. 不相同,析构函数调用确定,finalize()不确定;
 2. 将未被引用的对象放置于F-Queue队列中;
 3. finalize()方法执行随时可能会被终止;
 4. 给与对象最后一次重生的机会;

2. Java中的强引用 弱引用 软引用 虚引用有什么用?
 强引用 :

  1. 是最普遍的引用 : 例如 Object obj = new Object();
  2. 在OOM的时候,强引用的对象也不会被回收;
  3. 通过将对象设置为null来弱化引用,使其被回收;

 软引用 :

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

 弱引用 :

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

 虚引用 :

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

 引用总结 :
  强引用 > 软引用 > 弱引用 > 虚引用
3. 引用队列是什么?

 1. 无实际存储结构,存储逻辑依赖于内部节点之间的关系来表达;
 2. 存储关联的且被GC的软引用,弱引用以及虚引用;

上一篇 下一篇

猜你喜欢

热点阅读