class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String toString(){//覆写toString方法
return "姓名:"+this.name+",年龄"+this.age;
}
public void finalize() throws Throwable{//对象释放空间时默认调用此方法
System.out.println("对象被释放-->"+this);
}
}
public class SystemDemo05{
public static void main(String[] args){
Person per = new Person("张三",30);
per =null;//断开引用
System.gc();//强制性释放空间
//Runtime.getRuntime().gc();
}
}
我运行以后貌似没有调用finalize方法为什么呢
我不是已经调用System.gc()了么
而且per的确也是垃圾内存啊。
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String toString(){//覆写toString方法
return "姓名:"+this.name+",年龄"+this.age;
}
public void finalize() throws Throwable{//对象释放空间时默认调用此方法
System.out.println("对象被释放-->"+this);
}
}
public class SystemDemo05{
public static void main(String[] args){
Person per = new Person("张三",30);
per =null;//断开引用
System.gc();//强制性释放空间
//Runtime.getRuntime().gc();
}
}
我运行以后貌似没有调用finalize方法为什么呢
我不是已经调用System.gc()了么
而且per的确也是垃圾内存啊。
解决方案 »
- 命令窗口下的java命令
- java连接Sql2005问题
- 关于使用struts标签 判断集合长度是否为0 的实现问题
- 运行出来是0????????????不是435?
- 如何实现点击jtree里的节点后jtable里的值进行相应的更改
- Java里的Package路径问题一直弄不清楚,请各位进来讲一下,多谢了!
- $$ 各位新年好!有空给我看看这段代码有没有问题?请给点意见,多谢! ^_^
- 怎样将STRING转化为INT,BYTE,BOOLEAN,等数字类型(在线等待)
- 关于子类父类的构造方法的调用问题
- (●●●●,高分)在读文件时read与readLine有什么区别,最好给个例子,我是刚入门??(在线等待)
- JAVA 读取CSV
- jquery怎么通过标签取得它的属性呢?在线等.急.....!!!!!!!!!!!!
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=C:\jdk5.0\jre\bin
java.vm.version=20.2-b06
java.vm.vendor=Sun Microsystems Inc.
java.vendor.url=http://java.sun.com/
path.separator=;
java.vm.name=Java HotSpot(TM) Client VM
file.encoding.pkg=sun.io
user.country=CN
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=
java.vm.specification.name=Java Virtual Machine Specificatio
user.dir=D:\java\JavaStudy\java——常用类库\System\S...
java.runtime.version=1.6.0_27-b07
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=C:\jdk5.0\jre\lib\endorsed
os.arch=x86
java.io.tmpdir=C:\Users\lizhihui\AppData\Local\Temp\
line.separator=
java.vm.specification.vendor=Sun Microsystems Inc.
user.variant=
os.name=Windows 7
sun.jnu.encoding=GBK
java.library.path=C:\jdk5.0\bin;C:\Windows\Sun\Java\bin...
java.specification.name=Java Platform API Specification
java.class.version=50.0
sun.management.compiler=HotSpot Client Compiler
os.version=6.1
user.home=C:\Users\lizhihui
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=GBK
java.specification.version=1.6
user.name=lizhihui
java.class.path=.;D:\java
java.vm.specification.version=1.0
sun.arch.data.model=32
java.home=C:\jdk5.0\jre
sun.java.command=SystemDemo03
java.specification.vendor=Sun Microsystems Inc.
user.language=zh
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode, sharing
java.version=1.6.0_27
java.ext.dirs=C:\jdk5.0\jre\lib\ext;C:\Windows\Sun\...
sun.boot.class.path=C:\jdk5.0\jre\lib\resources.jar;C:\jd...
java.vendor=Sun Microsystems Inc.
file.separator=\
java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport...
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.desktop=windows
sun.cpu.isalist=pentium_pro+mmx pentium_pro pentium+m...这是我在cmd下查看的属性
PS:查看jdk版本 java -version就行了,不用都打出来的
不知道是不是新版本的java更新后他们重新做了这一块。
但在发生OOME之前,JVM一定会努力尝试去回收所以垃圾。
还有上面提到的finalize方法,个人认为,这个方法在对象没有任何引用指向它时,在回收之前是一定会被调用的,一般finalize用来处理一些Java无法处理的资源的关闭与回收,如调用native方法后的资源回收。你的代码中没有执行finalize方法,是因为JVM还没有执行gc之前,JVM进程就已经退出了。/**
* @ClassName: Test
* @Description: TODO(类描述)
* @author whwang
* @date 2011-12-16 下午12:05:28
*
*/
public class Test {
private String[] strs = new String[10000];
public static void main(String[] args) {
for (int i = 0; i < Integer.MAX_VALUE; i++) {
Test t = new Test();
}
} @Override
protected void finalize() throws Throwable {
System.err.println("finalize....");
super.finalize();
}
}你执行下段代码。
假如你的工具是eclipse,看看eclipse.exe 这个进程后的句柄 然后写好垃圾回收的代码 注意 在看后面对,你的句柄数还是那么多 根本没有回收 等你那天想起来了 在去看的时候 你会发现 你的句柄数 又少了 它在不定期的实行垃圾回收 !
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("gc");
} public static void main(String[] args) {
test tt = new test();
tt = null;
System.gc();
// try {
// Thread.sleep(50000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
}}
输出:gc
去掉注释也行啊。