-
Bug
-
Resolution: Duplicate
-
P3
-
None
-
1.2.0
-
sparc
-
solaris_2.5
Name: szC45993 Date: 07/10/97
The Java Virtual Machine, chapter 2 Java Concepts,
section 2.16.9 Virtual Machine Exit, claims:
"A Java Virtual Machine terminates all its activity and exits when one of two things happens:
- All the threads that are not daemon threads ($2.17) terminate.
- Some thread invokes the exit method of class Runtime or class System and the exit operation is permitted by the security manager.
A Java program can specify that the finalizers of all objects that have finalizers that have not been automatically invoked are to be run before the virtual machine exits. This is done by invoking the method runFinalizersOnExit of the class System with the argument true.
..."
Meanwhile, test shows that the object finalizer is not invoked under System.runFinalizersOnExit(true) in the case when jvm exits when some thread invokes the exit method of class System (compare LOG1 with LOG2). The identical results are on jdk1.1.3F, jdk1.1.4, jdk1.2.
LOG1 (System.exit() is used in the test):
----------------------------------------------------------------------------
novo7% /export/ld14/java/dest/jdk1.1.3F/solaris/bin/java -verify javasoft.sqe.tests.vm.execution.execution075.execution07502.execution07502
novo7% echo $status
5
----------------------------------------------------------------------------
LOG2 (System.exit() is not used in the test. Comment, please, all
lines with System.exit() invoking for this.):
----------------------------------------------------------------------------
novo7% /export/ld14/java/dest/jdk1.1.3F/solaris/bin/java -verify javasoft.sqe.tests.vm.execution.execution075.execution07502.execution07502
execution07502a FINALIZE INVOCATION
novo7% echo $status
0
----------------------------------------------------------------------------
SOURCES:
--------------------- execution07502.java
//File: @(#)execution07502.java 1.2 97/07/08
//Copyright 07/08/97 Sun Microsystems, Inc. All Rights Reserved
package javasoft.sqe.tests.vm.execution.execution075.execution07502;
import java.io.PrintStream;
public class execution07502 {
static execution07502a exca1 = new execution07502a();
public static void main(String argv[]) {
System.runFinalizersOnExit(true);
try{
exca1.num = 1;
Thread thr1 = new Thread(exca1);
thr1.start();
thr1.join();
} catch (Throwable e) {
System.out.println("TRACE: Error/Exception in execution07502b: "+ e);
};
///////////////////////////////////////////////////////////////////////////////
System.exit(7);
///////////////////////////////////////////////////////////////////////////////
}
public void finalize() {
System.out.println("execution07502 FINALIZE INVOCATION");
}
}
--------------------- execution07502a.java
//File: @(#)execution07502a.java 1.1 97/07/08
//Copyright 07/08/97 Sun Microsystems, Inc. All Rights Reserved
package javasoft.sqe.tests.vm.execution.execution075.execution07502;
class execution07502a implements Runnable {
public int num;
public void run() {
while (num >= 0) {
try{
java.lang.Thread.sleep(1000);
} catch (java.lang.InterruptedException e) {};
num -= 1;
}
///////////////////////////////////////////////////////////////////////////////
System.exit(5);
///////////////////////////////////////////////////////////////////////////////
}
public void finalize() {
System.out.println("execution07502a FINALIZE INVOCATION");
}
}
---------------------
======================================================================
- duplicates
-
JDK-4031945 (refs) java.lang.Runtime.runFinalizersOnExit only has effect when exit code is 0
- Closed