1、Full GC 、 Major GC 、Minor GC 之间区别
- Minor GC: 从新生代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC。
- Major GC: 清理 Tenured 区,用于回收老年代,出现 Major GC 通常会出现至少一次 Minor GC。
- Full GC: Full GC 是针对整个新生代、老年代、元空间(metaspace,java8 以上版本取代 perm gen)的全局范围的 GC。
2、什么时候触发 Full GC
- 调用 System.gc 时,系统建议执行 Full GC,但是不必然执行。
- 老年代空间不足。
- 方法区空间不足。
- 通过 Minor GC 后进入老年代的平均大小大于老年代的可用内存。
- 由 Eden 区、survivor space1(From Space)区向 survivor space2(To Space)区复制时,对象大小大于 To Space 可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小。
3、出现栈溢出的原因
- 可能方法中创建了一个很大的对象,如 List,Array。
- 可能产生了循环调用、死循环。
- 可能引用了较大的全局变量
4、强引用、软引用、弱引用、虚引用以及他们之间和 gc 的关系
粗俗的说就是:不同的引用对应垃圾回收的力度不同。
- 强引用:new 出的对象之类的引用,只要强引用还在,永远不会回收。
- 软引用:引用但非必须的对象,内存溢出异常之前,回收。
- 弱引用:非必须的对象,对象能生存到下一次垃圾收集发生之前。
- 虚引用:对生存时间无影响,在垃圾回收时得到通知。
##对于上述各种引用可参考这篇知乎加深理解:https://www.zhihu.com/question/37401125