Should JVM know an app is in a shutdown state when a timeout event occurs?

陈雨亭 chenyt at cs.sjtu.edu.cn
Fri May 12 22:29:49 UTC 2017


I recently observed that there is a minor difference between HotSpot and
IBM's J9 when they process
the timeout events. I downloaded the dacapo benchmark
(http://dacapobench.org/) and ran 
       "timeout 20s java Harness avrora"
. J9 sometimes throws a (java.lang.IllegalStateException: Shutdown in
progress) while HotSpot cannot. 
The IllegalStateException may be thrown by J9 when
Runtime.getRuntime().removeShutdownHook(shutdownThread) 
(see line 103, avrora.actions.SimAction) is executed and at the same time
the timeout event 
arrives.

In order to reproduce the event, I slightly rewrote avrora.Main.main a
little so that avrora.Main.runAction 
will be called for 30 times. I also ran the command "timeout 20s java
Harness avrora" for 30+ times 
so that Runtime.getRuntime().removeShutdownHook(shutdownThread) (the code at
line 103, avrora.actions.SimAction) 
is running when "timeout 20s java" completes. 

It seems that when the timeout event occurs, the app is in a shutdown state.
J9 is able to detect it, while 
HotSpot may miss catching it.

I wonder what can be the real cause of the difference, the JVMs, or the API
implementations (i.e., Runtime.
getRuntime().addShutdownHook), or the application itself. Which JVM is
correct? Actually when the 
timeout event occurs, HotSpot will terminate without executing the following
statements, while J9 throws 
the exception and enters the exception handling block.

avrora.actions.SimAction
84	    public void run(String[] args) throws Exception {
85	        SimUtil.REPORT_SECONDS = REPORT_SECONDS.get();
86	        SimUtil.SECONDS_PRECISION = (int)SECONDS_PRECISION.get();
87	
88	        simulation = Defaults.getSimulation(SIMULATION.get());
89	        simulation.process(options, args);
90	
91	        ShutdownThread shutdownThread = new ShutdownThread();
92	        Runtime.getRuntime().addShutdownHook(shutdownThread);
93	        printSimHeader();
94	        try {
95	            startms = System.currentTimeMillis();
96	            simulation.start();
97	            simulation.join();
98	        } catch (Throwable t) {
99	            exitSimulation(t);
100	            Runtime.getRuntime().removeShutdownHook(shutdownThread);
101	        } finally {
102	            exitSimulation(null);
103	            Runtime.getRuntime().removeShutdownHook(shutdownThread);
104	        }
105	    }  

The exception message is given as the follows:

java.lang.reflect.InvocationTargetException
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95
)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl
.java:55)
	at java.lang.reflect.Method.invoke(Method.java:508)
	at org.dacapo.harness.Avrora.iterate(Avrora.java:42)
	at org.dacapo.harness.Benchmark.run(Benchmark.java:166)
	at org.dacapo.harness.TestHarness.runBenchmark(TestHarness.java:218)
	at org.dacapo.harness.TestHarness.main(TestHarness.java:171)
	at Harness.main(Harness.java:17)
Caused by: java.lang.IllegalStateException: Shutdown in progress
	at
java.lang.ApplicationShutdownHooks.remove(ApplicationShutdownHooks.java:93)
	at java.lang.Runtime.removeShutdownHook(Runtime.java:250)
	at avrora.actions.SimAction.run(SimAction.java:103)
	at avrora.Main.runAction(Unknown Source)
	at avrora.Main.main(Unknown Source)
	... 9 more



More information about the hotspot-runtime-dev mailing list