什么是垃圾回收
垃圾回收在哪进行
GC是如何判断对象是否存活的
引用技术算法
可达性分析(Java)
通过查找完整的调用链,去发现哪些节点是无法到达的,即已经被GC回收。
在JAVA中,可做为GC Roots的对象包括:
- 方法区中类的静态属性引用的对象
- 方法区中常量的引用对象
- 虚拟机栈(本地变量表)中引用的对象
- 本地方法栈JNI(Native)中引用的对象
四种引用类型
强引用
如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛出OutOfMemoryError错误,使程序异常终止。
软引用
在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收;只有在内存空间不足时,软引用才会被垃圾回收器回收。
弱引用
在使用弱引用时,只要进行垃圾回收,该引用就被回收。在使用弱引用时,将对象放入弱引用的实现类即可。
虚引用
顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。
虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
ReferenceQueue<String> queue = new ReferenceQueue<String>();
PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue);
当我在方法内部写下来
Object o1 = new Object();
Object O2 = o1;
我们在堆里面就产生了一个关于Object的实例,在栈里面产生了一个类型为Object的O对象的引用
垃圾回收算法
复制算法
- 优点
简单高效,不会出现内存碎片问题
- 缺点
存活对象较多时,效率会更低。
标记清除算法
- 优点
利用率百分之百
- 缺点
标记和清除速率对比复制算法都不高
会产生大量的不连续的内存碎片
分代收集
-XX:NewRadio 2 // 新生代和老年代的比例为 1:2
-Xmn
-XX:NewSize/MaxNewSize
发生在新生代 Minor GC
老年代 Full GC (同样的也会回收新生代的内存,永久代内存溢出的时候也会发生Full GC)
参数 如何使用
垃圾回收中的Stop The World 现象
当我们发生垃圾回收时,要暂停所有的用户进程,因为在内存中大多数的垃圾都是由用户进程产生的,如果一边进行垃圾回收,线程一边产生垃圾,会降低垃圾回收的效率。