复习JAVA GC 有感
感悟:
+GC是怎样判断一个对象是垃圾(已经没用了)?
总体思想大概是:把一个对象看成一点,而一个对象A对另一个对象B的引用则看出是A到B的有向边。GC从main出发,把整个应用程序的对象做映射,那么就有一个有向图,图中从main或子线程对象为起点不可达的点都视为“垃圾”。
+GC是怎么实现以上判断并管理内存?
GC实现以上的策略有许多种,大部分资料在网上都能找到,IBM DevelopWorks上大把资料。写出来也很长... ...
GC回收,对我们来说近乎透明,调用System.gc()也只是建议JVM去执行回收,但不一样马上执行,不同的JVM实现,不同的垃圾管理回收策略都会有不同表现,这点不能千篇一律地下定论。
+如何解决内存管理的问题?
曾几何时,总想去GC,内存吃紧啊... ...!但无数次建议,始终不见效果。某日,高人让我当头棒喝。我试着去寻找另一途径,去管理那些垃圾,重复利用那些垃圾,那些散落在程序各地的零碎对象(早已无用,引用存在)。
public class LeakyStack { private Object[] elements = new Object[MAX_ELEMENTS]; private int size = 0; public void push(Object o) { elements[size++] = o; } public Object pop() { if (size == 0) throw new EmptyStackException(); else { Object result = elements[--size]; // elements[size+1] = null; return result; } }}