class A { public A(){ B =new B(); b.obj=this; b.start(); } static class B extends Thread{ Object obj; public void run(){ while(true){ //do nothing } } } } 你new A 类, 看A类会不会回收。
每个FRAME都是一个线程在执行,线程在执行完之前,是不会被垃圾回收的。它在等待你的一个触发
没有啊。Frame哪怕不被你的程序持有,也会被系统持有,所以是不会被垃圾收集的。楼主可以试试这个代码 for(Frame f : Frame.getFrames()){ //打印系统中持有的Frame。 System.out.println(f); }
不知道我有没有听懂你的意思,比如下面这个程序public class Test2 { public Test2() { run(); } public void run() { while(true) { System.out.println("helloworld!"); } } public static void main(String[] args) { new Test2(); } } new Test2()并没有定义对像引用它,但是却一直处在运行中,而为了维护这个程序执行下去,实际上程序内存里会有类似于清单的东西引用它。所以所这2个情况是相关的?
public class Test2 { public Test2() { //run(); } public void run() { while(true) { System.out.println("helloworld!"); } } public static void main(String[] args) { new Test2().run(); } } 换成这样呢?
while(true)
之类的构造。
即便是没有变量引用它,它自己占着CPU呢。
class A {
public A(){
B =new B();
b.obj=this;
b.start();
} static class B extends Thread{
Object obj;
public void run(){
while(true){
//do nothing
}
}
}
}
你new A 类, 看A类会不会回收。
System.out.println(f);
}
对于流如果没有显示的调用close(),那么流并不会被关闭,那么当程序结束的时候流的对象有被回收吗?
这跟我上面提得问题有区别吗?
得看具体情况的。
下面的代码你可以试试看,没有调用close方法,但流对象确实被回收了。public class AWT {
public static void main(String[] args) throws IOException {
FileInputStream fio = new MyFileInputStream("temp.txt");
fio.read();
fio = null;
System.gc();
try{
Thread.sleep(5000);
}catch(Exception e){}
}
}class MyFileInputStream extends FileInputStream{ public MyFileInputStream(String name) throws FileNotFoundException {
super(name);
}
@Override
protected
void finalize() {
try {
super.finalize();
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("fileinputstream gc.");
}}
只是窗体的显示是系统资源,这个我就不知道了,图形不熟,只是针对现象回答的我觉得如果是系统资源显示的话,那JVM退出的时候就不回收了吧,照你的意思,那就是调用System.exit,窗体不会关闭,我记得是会关的
我觉得magong在2楼已经解释的非常到位了,而且之后又给了你几段代码。
楼主还在纠结什么呢?搞不明白,还有这么婆婆妈妈的人!jvm本身只是操作系统的一个普通进程,java代码最终会映射到jvm上去执行,所以在其中创建的任何对象、资源,在java程序运行结束后,都会被操作系统回收,这有什么好怀疑的!
frame不属于系统资源,只是调用了系统底层的窗体api而已
关闭流是你的应用程序负责任的做法,也可以提前让出系统资源,方便再利用。
对我来说,我不会依赖于API的副作用。从字面上说,close就是关闭、flush就是强排,在close前调用flush也就是多一行源代码而已,不是错误。
Frame类上能提供本应用程序创建过的所有frame的清单(无论该frame是否被你自己的变量引用),说明Frame类中引用了这些frame。这是frame不被垃圾收集的主要原因。
而Frame类持有对这些frame的引用的主要意图,就是为了维护事件环、维护frame和原生window的联系、保持主线程不退出。
public Test2() {
run();
}
public void run() {
while(true) {
System.out.println("helloworld!");
}
}
public static void main(String[] args) {
new Test2();
}
}
new Test2()并没有定义对像引用它,但是却一直处在运行中,而为了维护这个程序执行下去,实际上程序内存里会有类似于清单的东西引用它。所以所这2个情况是相关的?
public Test2() {
//run();
}
public void run() {
while(true) {
System.out.println("helloworld!");
}
}
public static void main(String[] args) {
new Test2().run();
}
}
换成这样呢?
也就是说,当run()方法老不结束的时候,对象会被this变量引用,从而造成该对象不会被垃圾收集。