I believe this is an issue related to how the threadpools used by executors are populated by default, i.e. they use non-daemon threads.
clojure.lang.Agent uses instances of these default threadpool configurations, which is likely the cause of the delayed shutdown of the JVM (I'll bet that if you let the process linger for a couple minutes, the threadpools' timeouts will trip, the non-daemon threads will die, and the process will exit gracefully). The solution would be for clojure.lang.Agent to create ExecutorServices whose threadpools use a ThreadFactory that only creates daemon threads. I don't really use agents though, so I'm not at all in a position to write or test that patch (or be aware of what other consequences might arise from having agents executing on daemon threads -- I presume there aren't any, but...). - Chas On Apr 16, 12:25 pm, Drew Raines <aarai...@gmail.com> wrote: > I have a command line utility that calls (exit 0) at the end of > (-main). It looks like this: > > (defn exit [status] > (shutdown-agents) > (flush) > (System/exit status)) > > Yet, despite this, the JVM never exits. Here is a snippet of jstack > output: > > --8<---------------cut here---------------start------------->8--- > "DestroyJavaVM" prio=10 tid=0x00000000406c7c00 nid=0x445d waiting on > condition [0x0000000000000000..0x0000000041e48d10] > java.lang.Thread.State: RUNNABLE > > Locked ownable synchronizers: > - None > > "pool-1-thread-10" prio=10 tid=0x00007fd9744fac00 nid=0x447c waiting on > condition [0x0000000042e58000..0x0000000042e58da0] > java.lang.Thread.State: WAITING (parking) > at sun.misc.Unsafe.park(Native Method) > - parking to wait for <0x00007fd981140198> (a > java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158) > at > java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1925) > at > java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:358) > at > java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) > at java.lang.Thread.run(Thread.java:619) > --8<---------------cut here---------------end--------------->8--- > > What else can I try to force everything to shut down? > > Thanks! > > -Drew > > jvm-hang.txt > 11KViewDownload --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---