静态变量属于全局变量,不会被GC回收,它们会一直占用内存。
(7)分散对象创建或删除的时间
集中在短时间内大量创建新对象,特别是大对象,会导致突然需要大量内存,JVM在面临这种情况时,只能进行主GC,以回收内存或整合内存碎片,从而增加主GC的频率。集中删除对象,道理也是一样的。它使得突然出现了大量的垃圾对象,空闲空间必然减少,从而大大增加了下一次创建新对象时强制主GC的机会。
4.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(); //请求运行垃圾收集器 } }
(编辑;aniston)
|