Java垃圾收集算法 - 编程入门网
对象,空闲空间必然减少,从而大大增加了下一次创建新对象时强制主GC的机会。
Java垃圾收集算法(2)时间:2011-01-19 zhangxinjie4.gc与finalize方法 ⑴gc方法请求垃圾回收 使用System.gc()可以不管JVM使用的是哪一种垃圾回收的算法,都可以请求Java的垃圾回收。需要注意的是,调用System.gc()也仅仅是一个请求。JVM接受这个消息后,并不是立即做垃圾回收,而只是对几个垃圾回收算法做了加权,使垃圾回收操作容易发生,或提早发生,或回收较多而已。 ⑵finalize方法****垃圾收集器的运行 在JVM垃圾收集器收集一个对象之前 ,一般要求程序调用适当的方法释放资源,但在没有明确释放资源的情况下,Java提供了缺省机制来终止化该对象释放资源,这个方法就是finalize()。它的原型为: protected void finalize() throws Throwable 在finalize()方法返回之后,对象消失,垃圾收集开始执行。原型中的throws Throwable表示它可以抛出任何类型的异常。 因此,当对象即将被销毁时,有时需要做一些善后工作。可以把这些操作写在finalize()方法里。 以下是引用片段: protected void finalize() { // finalization code here } ⑶代码示例 以下是引用片段: class Garbage { int index; static int count; Garbage() { count++; System.out.println("object "+count+" construct"); setID(count); } void setID(int id) { index=id; } protected void finalize() //重写finalize方法 { System.out.println("object "+index+" is reclaimed"); } public static void main(String[] args) { new Garbage(); new Garbage(); new Garbage(); new Garbage(); System.gc(); //请求运行垃圾收集器 } } Java垃圾收集算法(3)时间:2011-01-19 zhangxinjie5.Java 内存泄漏 由于采用了垃圾回收机制,任何不可达对象(对象不再被引用)都可以由垃圾收集线程回收。因此通常说的Java 内存泄漏其实是指无意识的、非故意的对象引用,或者无意识的对象保持。无意识的对象引用是指代码的开发人员本来已经对对象使用完毕,却因为编码的错误而意外地保存了对该对象的引用(这个引用的存在并不是编码人员的主观意愿),从而使得该对象一直无法被垃圾回收器回收掉,这种本来以为可以释放掉的却最终未能被释放的空间可以认为是被“泄漏了”。 考虑下面的程序,在ObjStack类中,使用push和pop方法来管理堆栈中的对象。两个方法中的索引(index)用于指示堆栈中下一个可用位置。push方法存储对新对象的引用并增加索引值,而pop方法减小索引值并返回堆栈最上面的元素。在main方法中,创建了容量为64的栈,并64次调用push方法向它添加对象,此时index的值为64,随后又32次调用pop方法,则index的值变为32,出栈意味着在堆栈中的空间应该被收集。但事实上,pop方法只是减小了索引值,堆栈仍然保持着对那些对象的引用。故32个无用对象不会被GC回收,造成了内存渗漏。 以下是引用片段: public class ObjStack { private Object[] stack; private int index; ObjStack(int indexcount) { stack = new Object[indexcount]; index = 0; } public void push(Object obj) { stack[index] = obj; index++; } public Object pop() { index--; return stack[index]; } } public class Pushpop { public static void main(String[] args) { int i = 0; Object tempobj; ObjStack stack1 = new ObjStack(64);//new一个ObjStack对象,并调用有参构造函数。分配stack Obj数组的空间大小为64,可以存64个对象,从0开始存储。 while (i < 64) { tempobj = new Object();//循环new Obj对象,把每次循环的对象一一存放 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |