On 7/7/2014 10:42 AM, mark.reinh...@oracle.com wrote:
2014/7/5 20:59 -0700, krasimir.semerdzh...@sap.com:
...

This leaves little options for maneuvering to application server providers,
different than restarting the app server process. That's (to date) is the
only reliable way to ensure that a certain application has been properly
unloaded, regardless how buggy its implementation is.

It would be great to have a more clear statement in the document (even in
the case that it falls in the "non requirements" section) to clarify
whether Jigsaw in Java 9 will have any impact/effect on the above-described
scenario. I certainly understand that in order to offer a way for Java EE
application servers to reliably unload/reload modules/applications at
runtime - this will most probably require an extension of the Java Language
Specification, which as far as I get it - is currently out of scope for the
Jigsaw project.
You're right: Providing a means by which an app server can forcibly
terminate and unload an errant application is well beyond the scope
of Jigsaw.  As Alan indicated, it's a very tough problem.  I'll add
a non-requirement in the next draft, just to be perfectly clear on
this.
For applications where this would be most likely to occur, it would seem that this is trivial to do by simply having the JVM mark all the code pages as inaccessible, or otherwise unloading them from the VM allocated set. That would fault every running thread and force the threads to exit. It's this kind of hammer that I would really like to have. It is just far too painful to have to track every single resource. A Class.unload() method would be very helpful, and if you want threads unloaded to throw a particular "Error", you could provide Class.unload(Error) which would allow some remnant code to help threads throw a catchable Error that would allow the thread management in EE or elsewhere to manage pools. Thread.stop(Throwable) was an attempt at this, but since it wasn't required and spec'd appropriately with precise behavior, it hasn't been a solution.

I don't really think this is "difficult" as much as it is "detailed", and just needs to assure two things can happen. First, the class must be evicted and two, threads running into such a class instance, need to be stopped.

In systems where there is the notion of "versioning" the view of code should be through vector tables which select a "version" of the "codebase", using a version number which a thread is handed, when it starts running. The vector table directs threads to the old or new code to create a coherent behavior within each thread. Eventually when the new code is "committed", the old threads, if still running, should be faulted for trying to use any old code, and that will force them out of the system.

This doesn't have to be pretty and do everything. It just needs to be possible to deny use of a Class object, and that needs to cause Thread termination if it access is attempted. If there could be some type of "init process" or "parent of all Threads" behavior too, so that it would be guaranteed that thread termination could not be "missed", it would seem to be a perfectly plausible thing to do.

Without such a feature, we are getting to the point where JVM process restart is still the only solution, at that is so 1980's... We are at the point of evolution of runtime environments where "Java" is used, really are places where VM is the underlying memory mechanism. So, it seems like the right time to just go ahead and use it to it's full abilities.

Gregg Wonderly

Reply via email to