各种引用关系概念:
强引用
Object obj = new Object();
软引用 softReference
一些有用但是并非必须,用软引用关联的对象,系统将要发生OOM之前,这些对象就会被回收
如果说这些对象被回收之后,还是超出内存,就会抛出OOM异常
弱引用 WeakReference
一些有用但是并非必须,用弱引用关联的对象,这些对象有用的程度比软引用更低
这些对象只能生存到下次垃圾回收之前,GC发生的时候,不管内存是否足够,都会被回收
虚引用 PhantomReference
最弱的引用关系,被垃圾回收的时候收到一个通知
GC什么时候进行回收?
1. 执行 system.gc()的时候
2.老年代空间不足,一次Full GC 之后,然后不足 会触发 java.outofmemoryError:java heap space
3.永久代空间不足 永生代或者永久代, java.outofMemory PerGen Space
4. minor之后 survior放不下,放入老年代,老年代也放不下,触发FullGC, 或者新生代有对象放入老年代,老年代放不下,触发FullGC
5.新生代晋升为老年代时候,老年代剩余空间低于新生代晋升为老年代的速率,会触发老年代回收
6. new 一个大对象,新生代放不下,直接到老年代,空间不够,触发FullGC
GC怎么进行回收?
GC算法
标记-清除算法(Mark-Sweep)
复制算法(Copying)
标记-整理算法(Mark-Compact)
实际使用时,把算法们都用上,分代使用
90%以上的对象是朝生夕死的
新生代:采用复制算法
1个Eden
2个Survivor
Eden:Survivor:Survivor = 8:1:1
老年代:存活超过一定时间的,超过一定GC次数的
新生代的垃圾回收叫 minor gc
老年代的垃圾回收叫 full gc