如题~
解决方案 »
- 求解一道编程题!!
- java swing不同窗口间数据同步的问题
- 发生java.net.ConnectException: Connection refused: connect什么原因?
- 初学者问题··static boolean won[] = new boolean[1 << 9];
- byte没有位操作吗?为什么我值是不对的?
- Java初级问题:学习Java需要准备什么
- 请教:为什么不能实现同步
- 请问<bean:write>拿属性时怎样传个参数呢?
- java编程思想中的一段话(关于用StringBuffer对象代替String对象)不懂,请各位高手解惑!~~
- 接口?java 怎会有这东东?c++ 都没有
- Thinking in Java 中这句话的理解
- JAVAC 相同的命令在不同的路径下运行出现的情况不一样?
jvm通过垃圾收集算法来检测出垃圾对象,并回收它的内存空间
垃圾检测通常是通过建立一个跟对象的集合,并检查从这些跟对象开始的可触及性来实现的。如果正在执行的程序可以访问到的根对象和某个对象之间存在引用路径,那么这个对象就是可触及的。
区分活的对象和垃圾的基本方法是引用计数和跟踪,引用计数收集器为堆中的每一个对象保存一个计数,该计数记录每个对象的引用次数,当有新的引用的时候计数加一,当计数为0的时候当作垃圾收回,就是LZ说的不会再被引用。
跟踪垃圾收集器追踪从根节点开始的对象引用图,当追踪结束后,未被标记的对象就是不可达的,即也不会再被引用。
知道的话就不会认为 “没有引用指向的对象就是垃圾,有引用指向的就不是垃圾” 这句号称是被误解很多的其实不然 有引用的一样可能是垃圾 关键看这些对象能不能被活动的线程访问到
例如class Island{
public Island brother;
}//运行下面代码片段
Island il = new Island();
Island i2 = new Island();
Island i3 = new Island();
il.brother = i2;
i2.brother = i3;
i3.brother = i1;
i1 = null;
i2 = null;
i3 = null;
// 这样 三个对象循环指向 但他们形成了孤岛 所以已经成为垃圾
至于算法是怎么样子的 不知道 可以去Google一下
public Island brother;
String name;
public Island(){
}
public Island(String name){
this.name = name;
}
public void finalize(){
System.out.println(this.name + "对象成为垃圾,被收集");
}
public void testIsland(){
Island i1 = new Island("孤岛中的 O1");
Island i2 = new Island("孤岛中的 O2");
Island i3 = new Island("孤岛中的 O3");
i1.brother = i2;
i2.brother = i3;
i3.brother = i1;
i1 = null;
i2 = null;
i3 = null;
// 这样 三个对象循环指向 但他们形成了孤岛 所以已经成为垃圾
System.gc();//可以看到 三个对象很快被收集,但程序过了10s才结束
try{
Thread.sleep(10000);
}catch(Exception e){
e.printStackTrace();
}
}
}public class Test{
public static void main(String[] args){
new Island().testIsland();
}
}
引用计数、自适应(停止-复制、标记-清扫)
看了tij还是不明白
GC有两种方法的运用,但是这两种方法都只是建议不是强制的执行。
System.gc().方法和另外一种方法。
当某一个对象的引用为0的时候,jvm就会执行。