JDK-8016225 : The behavior after System.exit() is different between JRE 1.7_21 and JRE 1.7_17
  • Type: Bug
  • Component: deploy
  • Sub-Component: plugin
  • Affected Version: 7u21
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • OS: windows_7
  • Submitted: 2013-06-10
  • Updated: 2014-02-12
  • Resolved: 2013-06-26
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
6u71Fixed 7u40Fixed 8 b97Fixed
Steps to reproduce
1. Access : http://vm53.sg.oracle.com/httpclient/WebContents/index.html
2. Click "Open Window". Then you will see the new browser window.
3. Check "System.exit" and click "Close". Then the new browser will be
4. Click "Open Window" again.   You will see the new browser, but the child
process will not be started.  Nothing appear in this new browser window.
NOTE: If you wait for about 1 min after step (3) before proceed to step (4),
this issue does not occur.
SQE-OK to get this issue fix for 7u40

��062013 - Checking status/plan with Alex/Dmitry

bugdb indicates regression from 7u17 to 7u21

According to the current design an initial JVM is launched by JVMLauncher, and the second JVM, which is running an applet, is launched by RemoteJVMLauncher invoked via ProxyJVMLauncher. If the second JVM process is terminated by some reasons, (e.g. running applet executes System.exit()), the WorkerThread for the corresponding JVMInstance and the pipe are terminated, but nobody is notified about this and the JVMInstance remains in the active list of JVMManager. So if we try to start the same applet with the same JVM parameters again, JVMManager tries to re-use the old JVMInstance. The JVMInstance will fail to send StartAppletMessage since the pipe does not exist. Fix: When a WorkerThread for a JVMInstance is terminated, we have to destroy the corresponding ProxyJVMLauncher, if any. Also if ProxyJVMLauncher.destroy() is executed and a pipe conversation between ProxyJVMLauncher and RemoteJVMLauncher is over, ProxyJVMLauncher will set the exit indicator. This will prevent the future usage of the terminated JVMInstance.