18.4. Embedded Java VM API
The Java VM is an embedded system within Virtuoso that allows the calling of class Java methods and getting class properties. It uses the JAVA JNI API to interact with the JAVA VM.
18.4.1. Correspondence Between Virtuoso & Java VM Threads
At maximum one Java VM will be started on demand. If a function from the
Java VM API is called and no JVM is running, one will be started, as required.
Since Virtuoso is multithreaded it requires JDK version 1.3 or above in order
to make better use of it's multithreading support. If the Java VM is already
running the API VSEs attaches the current Virtuoso working thread, if not
already attached, as a Java VM thread to the running VM. The Virtuoso
worker thread does not automatically detached itself from the Java VM after
use, therefore, in order to prevent leaving redundant Virtuoso worker threads
being left attached to the Java VM the
java_vm_detach()
VSE should be used.
The following require access to the Java VM:
all Virtuoso JAVA PL API (JVM VSEs) |
allocating/deallocating/copying of the Virtuoso/PL Java VM class reference values. |
If no subsequent JVM VSEs are called after calling
java_vm_detach()
, the worker thread can still attach to
the VM in order to deallocate or copy Java VM class reference values.
In order to ensure that the worker thread is properly detached it is
advisable to set all the variables that may hold Java VM class reference
values to NULL, which deallocates their current value, before calling the
java_vm_detach()
JVM VSE.
Attaching and detaching Virtuoso worker threads is marked as a debug level message in the Virtuoso Event log, so that these messages can be used to debug the process.