It's (unfortunately?) normal that a JVM doesn't exit on OOME. If you have a top-level processing loop, you can do a:

try
{
...
}
catch(VirtualMachineError e)
{
    System.exit(123);
}

or similar. I tend to have such catches in my production stuff, since if you get a VirtualMachineError (of which OOME is one subclass), then all bets are off with regard to correct future execution of that VM instance -- you can't count even on finally blocks completing, streams being flushed (potentially leading to incomplete file writes), etc., so indeed the best course of action is exiting as quickly as possible and making sure monitoring staff spots it immediately.

One possible exception you might want to make is for StackOverflowError -- it too is a VirtualMachineError, but is normally localized in effect to a single thread. However, it too can cause VM guarantees to fail; a finally block executing after a SOE might get another SOE itself if the stack is still very deep while in the finally block, so I usually don't bother making an exception for it and my code does a System.exit() whenever it spots any VirtualMachineError.

Attila.

--
home: http://www.szegedi.org
twitter: http://twitter.com/szegedi
weblog: http://constc.blogspot.com

On 2009.01.09., at 16:10, Tom Robinson wrote:

I have a fairly complex JavaScript app I run using the Rhino shell.
Occasionally it runs out of memory and throws the OutOfMemoryError
exception. I expect the java process to exit at that point, but it
doesn't. No code seems to be executed after that point, but the
process doesn't exit.

This is rather annoying because then I can't check to see if the
process has crashed and automatically restart it.

I'm having a hard time creating a simple reduction. Has anyone
experienced anything like this in Rhino, or Java in general?

Thanks.

_______________________________________________
dev-tech-js-engine-rhino mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-tech-js-engine-rhino

Reply via email to