Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Java (http://www.velocityreviews.com/forums/f30-java.html)
-   -   JNI, threads are still running after DestroyJavaVM() (http://www.velocityreviews.com/forums/t957786-jni-threads-are-still-running-after-destroyjavavm.html)

Olivier GROSSET-GRANGE 02-19-2013 01:59 PM

JNI, threads are still running after DestroyJavaVM()
 
Hello all,

As the object of this thread suggests, the problem I encounter is that
in a minimalist test program, there are "ghost" threads after calling
DestroyJavaVM().
The environment is WIN32, JRE/JDK 1.6.0_21, and C++ (Visual Studio
2008).
Under certain circumstances, it prevents some processes from exiting
(ie: IIS7.5 Application Pool : w3wp.exe).
May be I'm doing something wrong or I forgot one step,
Here is the very simple code to reproduce the problem:

// testDestroyJavaVM.cpp : Defines the entry point for the console
application.
//

#include "stdafx.h"

#include <conio.h>

#include "jni.h"
#pragma comment(lib, "jvm.lib")

int _tmain(int argc, _TCHAR* argv[])
{
printf("press key to start");
getch();
printf("\nstart.");
int MAX = 1; // can't call JNI_CreateJavaVM() more than once for some
reason...
for (int i=0; i<MAX; i++)
{
JavaVM* jvm = NULL;
JNIEnv* env = NULL;
do
{
JavaVMOption jvmOptions;
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 0;
vm_args.options = &jvmOptions;
vm_args.ignoreUnrecognized = 1;

// *** 1 thread before JNI_CreateJavaVM() ***
int retcode = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
// *** 9 threads after JNI_CreateJavaVM() ***
if(retcode < 0)
{
printf("JNI_CreateJavaVM failed: %d\n", retcode);
break;
}
}
while (false);
if (NULL != jvm)
jvm->DestroyJavaVM();
// *** 6 threads after DestroyJavaVM() ***
}
printf("\ndone.");
getch();
return 0;
} // END OF CODE

Does someone know how to fix this problem please?
Is it a known problem ?

Thanks in advance for any help,
Olivier.

Arne Vajhoej 02-19-2013 05:44 PM

Re: JNI, threads are still running after DestroyJavaVM()
 
On 2/19/2013 8:59 AM, Olivier GROSSET-GRANGE wrote:
> As the object of this thread suggests, the problem I encounter is that
> in a minimalist test program, there are "ghost" threads after calling
> DestroyJavaVM().
> The environment is WIN32, JRE/JDK 1.6.0_21, and C++ (Visual Studio
> 2008).
> Under certain circumstances, it prevents some processes from exiting
> (ie: IIS7.5 Application Pool : w3wp.exe).
> May be I'm doing something wrong or I forgot one step,
> Here is the very simple code to reproduce the problem:


> JavaVMOption jvmOptions;
> JavaVMInitArgs vm_args;
> vm_args.version = JNI_VERSION_1_6;
> vm_args.nOptions = 0;
> vm_args.options = &jvmOptions;
> vm_args.ignoreUnrecognized = 1;
>
> // *** 1 thread before JNI_CreateJavaVM() ***
> int retcode = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
> // *** 9 threads after JNI_CreateJavaVM() ***


> if (NULL != jvm)
> jvm->DestroyJavaVM();
> // *** 6 threads after DestroyJavaVM() ***


> Does someone know how to fix this problem please?
> Is it a known problem ?


It is documented that non-daemon threads will continue to run
after DestroyJavaVM is called.

Do you actually start some Java code that is still running?

Other than that check the DestroyJavaVM method doc - I seem to
recall that it should be called with the jvm as argument.

Arne



olivier@clickndecide.eu 02-19-2013 11:44 PM

Re: JNI, threads are still running after DestroyJavaVM()
 
Hello,
Thanks for the answer.
No java code is run in this example.
Fyi,the call to DestroyJavaVM is a c++ like call (which actually calls the riight JNI function with jvm as parameter).
Best regards,
Olivier


All times are GMT. The time now is 04:50 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.