JNI native thread priority

Hi,
I have some JNI code that spawns a win32 thread using CreateThread and then sets it priority using SetThreadPriority.
If i set priority higher than ABOVE_NORMAL ( i would prefer time critical), it seems the JVM crashes on exit.
I've commented everything out in the thread method itself except to let it do a while(true){Sleep(1);}.
If i remove the SetThreadPriority or set it to ABOVE_NORMAL or less the JVM doesnt crash when the java code calls System.exit but otherwise it does.
Any ideas concerning this?

Hmm..
I was using System.runFinalizersOnExit(true), when i removed that from the java side the problem disappeared. I dont really need to make that call anyway, but i dont like when errors disappears and i dont understand why, so i would like to know how that call in conjunction with a high priority native thread can cause a jvm crash?

Similar Messages

  • JNI native threads causing JRE to fail to shut down?

    Hello,
    I am using JNI to communicate with a COM object. I am reasonably certain at this point that my JNI code is handling this properly and the third party COM library is releasing the object in question. We allocate and release hundreds of these objects and we aren't observing any memory leaks. Likewise in our handling of events we receive from the COM object. We attach the thread to Java, deliver the event, and then detach the thread from Java, with very careful error handling around the event delivery to ensure that whatever else happens the detach gets called. This code is very robust and stable in operation and has been working at load in the field for over a year now without any customer problems in the JNI area.
    However, since day one, when I go to shut down the application, the JNI isn't winding down properly. As it happens, since the JRE is running a Tomcat, driven by a wrapper service, the wrapper eventually gives up waiting and shoots the JRE in the head, but the user experience of stopping the wrapper service is ugly and we'd like to clean that up. The JNI code, of course, runs as shared code in the Tomcat.
    It is possible that the third-party library, which does network communications, is keeping a thread pool for use with any of the COM objects even after all COM objects are released. This would be experienced as a one-time hit when the first object is allocated and not as a continual leak, so we'd be unlikely to notice it otherwise.
    Will native non-Java threads running in the JRE but not allocated by the JRE itself cause the JRE to hang on until they've spontaneously decided to clean themselves up? Threads that have never been attached to the JVM? How about threads that were briefly attached to the JVM but then detached? Any worse?
    Ralph

    Hi Ralph,
    I will need some more information regarding this issue.
    1. What platform are you on?
    2. Which JRockit version are you running?
    3. If you remove the wrapper service, does JRockit freeze without exiting properly?
    As a general recommendation I would try to upgrade to the latest JRockit version. It can be downloaded from the OTN http://www.oracle.com/technology/software/products/jrockit/index.html
    You may also try some verbose printouts to debug the issue a little further. Try
    -Xverbose:thread=debug,jni=debug
    This might give us some more insight in what is going on.
    Also when JRockit freezes you can output a Java stack trace using our 'jrcmd' tool which you can find in the same folder as the java executable. Run this tool without any parameters and it will output identifiers (numbers) for every running JRockit instance on your machine. Run the same tool again, this time append the identifier you believe is the one running the Tomcat and add the command 'print_threads', ie
    jrcmd <some_id_here> print_threads
    This may show what JRockit is waiting for.
    Cheers,
    /Henrik

  • JNI and Native Threads Doesn't work

    I am writing a wrapper class in C++ for a java class that publishes a message to JMS. In the C++ code I create the class, and call the one method. Everything does what it is supposed to, UNLESS more than one thread calls it. All the C++ wrapper stuff is in a DLL, and the classpath is correct for the java side, I then run an exe that is linked with the dll. The dll exposes one method that creates the java class, and calls the method. when more than one thread enters the DLL, I start getting class not found exceptions?? where as if I just call the method multiple times in a single thread, all works fine?? Please help, code included
    -----------------------DLL CODE-------------------------------
    extern "C"
    BOOL APIENTRY DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)
    switch (reason)
    case DLL_PROCESS_ATTACH:
    if(!crit_init)
    printf("Initializing Critical Section\n");
    InitializeCriticalSection(&cs);
    crit_init = true;
    EnterCriticalSection(&cs);
    if(jvm == NULL)
    char buffer[1024];
    int portNum = -1;
    JavaVMInitArgs vm_args;
    JNIEnv *env = NULL;
    JavaVMOption options[4];
    memset(buffer,0,sizeof(buffer));
    strcat(buffer,"-Djava.class.path=");
    strcat(buffer,getenv("CLASSPATH"));
    printf("\nClassPath :\n\n%s",buffer);
    printf("\n\n");
    options[0].optionString = "-Djava.compiler=NONE"; // disable JIT
    options[1].optionString = buffer; // user classes
    options[2].optionString = "-Xms64M";
    options[3].optionString = "-Xmx64M";
    vm_args.version = JNI_VERSION_1_2;
    vm_args.options = options;
    vm_args.nOptions = 4;
    vm_args.ignoreUnrecognized = 1;
    printf("Creating JVM\n\n");
    if(JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args ) != 0)
    printf("Failed to Create JVM!\n");
    LeaveCriticalSection(&cs);
    return false;
    printf("JVM Created\n\n");
    LeaveCriticalSection(&cs);
    return true;
    case DLL_PROCESS_DETACH:
    break;
    case DLL_THREAD_ATTACH:
    break;
    case DLL_THREAD_DETACH:
    break;
    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
    DLLIMPORT char* publishAndWait(char * destination,
    char* payloadFormat, char* transactionType,
    char *payload, int timeoutSec)
    JNIEnv* jEnv = NULL;
    if(jvm->AttachCurrentThread((void**) &jEnv, NULL) || jEnv == NULL)
    printf("AttachCurrentThread error\n");
    return NULL;
    EnterCriticalSection(&cs);
    if(jmsStub == NULL)
    int portNum = -1;
    char buffer[10];
    memset(buffer,0,sizeof(buffer));
    itoa(portNum,getenv("CORBA_RESP_PORT"),10);
    printf("Creating JMSStub Instance\n");
    jmsStub = new JMSStub(getenv("WL_URL"),getenv("WL_CONN_FACTORY"),portNum,jEnv);
    printf("JMSStub Created\n\n");
    LeaveCriticalSection(&cs);
    return jmsStub->publishAndWait(destination,payloadFormat,
    transactionType,payload,timeoutSec,jEnv);
    int retDetVal = jvm->DetachCurrentThread();
    if(retDetVal)
    printf("DetachCurrentThread error %d\n", retDetVal);
    return NULL;
    ----------------------JMS STUB CLASS (IN DLL)-------------------------
    JMSStub::JMSStub(string wlURL, string connectionFactory, int responsePort,JNIEnv* jEnv)
    printf("Setting Local Strings\n");
    this->wlURL = wlURL;
    this->connectionFactory = connectionFactory;
    this->responsePort = responsePort;
    printf("Local Strings Set\n");
    // load class
    this->loadMethodIDs(jEnv);
    localObject = jEnv->NewObject(jmsStubCls,stubMethodMap.find("<init>")->second,
    jEnv->NewStringUTF(wlURL.c_str()),jEnv->NewStringUTF(connectionFactory.c_str()),
    responsePort,false);
    // create global reference so garbage collection will not take place
    printf("Creating GlobalRef to JMSStub Instance\n");
    globalObject = jEnv->NewGlobalRef(localObject);
    void JMSStub::loadMethodIDs(JNIEnv* jEnv)
    printf("Getting Hashtable Class\n");
    hashTableCls = jEnv->FindClass("java/util/Hashtable" );
    printf("Getting JMSStub Class\n");
    jmsStubCls = jEnv->FindClass("com/pacificare/common/jms/JMSStub");
    if(hashTableCls == NULL)
    printf("Error Getting Hashtable information!!\n");
    exit(-255);
    if(jmsStubCls == NULL)
    printf("Error Getting JMSStub information!!\n");
    exit(-255);
    printf("Getting Hashtable Methods\n");
    /* Get Hashtable Constructor */
    hashMethodMap.insert(MethodIDMap::value_type("<init>",
    jEnv->GetMethodID(hashTableCls, "<init>","()V")));
    /* get put method id */
    hashMethodMap.insert(MethodIDMap::value_type("put",jEnv->GetMethodID(hashTableCls, "put",
    "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")));
    printf("Getting JMSStub Methods\n");
    /* get JMSStub constructor */
    stubMethodMap.insert(MethodIDMap::value_type("<init>",jEnv->GetMethodID(jmsStubCls, "<init>",
    "(Ljava/lang/String;Ljava/lang/String;IZ)V" )));
    /* find the publishAndWait method */
    stubMethodMap.insert(MethodIDMap::value_type("publishAndWait",jEnv->GetMethodID(jmsStubCls,"publishAndWait",
    "(Ljava/lang/String;Ljava/util/Hashtable;I)Ljava/lang/String;")));
    bool JMSStub::hasExceptionOccurred(JNIEnv* jEnv)
    jthrowable     jthr = NULL;
    jthr = jEnv->ExceptionOccurred();
    if(jthr == NULL)
    return false;
    jEnv->ExceptionDescribe();
    jEnv->ExceptionClear();
    return true;
    char* JMSStub::publishAndWait(char * destination,
    char* payloadFormat, char* transactionType,
    char payload, int timeoutSec,JNIEnv jEnv)
    jmethodID hpMid = hashMethodMap.find("put")->second;
    // Strings used in methods, constructors, ect
    jstring destinationStr = jEnv->NewStringUTF(destination);
    jstring payloadFormatStr = jEnv->NewStringUTF(payloadFormat);
    jstring transTypeStr = jEnv->NewStringUTF(transactionType);
    jstring payloadStr = jEnv->NewStringUTF(payloadFormat);
    jobject localHashtable = jEnv->NewObject(hashTableCls,hashMethodMap.find("<init>")->second);
    jEnv->CallObjectMethod(localHashtable,hpMid,jEnv->NewStringUTF("^^^^^payloadFormat"),payloadFormatStr);
    jEnv->CallObjectMethod(localHashtable,hpMid,jEnv->NewStringUTF("^^^^^transactionType"),transTypeStr);
    jEnv->CallObjectMethod(localHashtable,hpMid,jEnv->NewStringUTF("^^^^^payload"),payloadStr);
    jstring retStr = (jstring)jEnv->CallObjectMethod(globalObject,
    stubMethodMap.find("publishAndWait")->second,
    destinationStr,localHashtable,timeoutSec);
    if(hasExceptionOccurred(jEnv))
    printf("Exception has occurred.\n");
    return NULL;
    else
    if(retStr == NULL)
    return NULL;
    const char *utfPtr = jEnv->GetStringUTFChars(retStr,0);
    int len = jEnv->GetStringUTFLength(retStr);
    char returnStr = (char)malloc(len);
    memset(returnStr,0,len);
    memcpy(returnStr,utfPtr,len);
    jEnv->ReleaseStringUTFChars(retStr,utfPtr);
    return returnStr;
    ------------------------------EXE------------------------------------
    DWORD WINAPI ThreadFunc( LPVOID lpParam )
    char buffer = (char )lpParam;
    const char *tst = publishAndWait("vitria.jms.authreq","XML","276",buffer,120);      
    if(tst == NULL)
    printf("No Response\n");
    else
    printf("%s\n",tst);
    delete tst;
    tCntDone++;
    _endthread();
    char * readFile(char* fileName)
    FILE *xmlFile = NULL;
    printf("Opening File %s\n",fileName);
    if((xmlFile = fopen(fileName,"r")) == NULL)
    printf("Unable to open File %s\n",fileName);
    exit(-256);
    long fileLen = filelength(fileno(xmlFile));
    char *buffer = new char[30000];
    memset(buffer,0,sizeof(buffer));
    fread(buffer,fileLen,1,xmlFile);
    buffer[fileLen] = '\0';
    fclose(xmlFile);
    return buffer;
    int main(int argc, char *argv[])
    DWORD dwThreadId[2];
    HANDLE hThread[2];
    char *buffer = NULL;
    if(argc < 2)
    printf("You must supply the name of the xml file as an argument!!\n");
    exit(-255);
    buffer = readFile(argv[1]);
    printf("%s\n",buffer);
    for(int i = 0; i < 2; i++)
    printf("Creating Thread %x\n",i);
    hThread[i] = CreateThread(NULL,0,ThreadFunc,buffer,0,&dwThreadId);
    Sleep(1000);
    while(tCntDone < 2)
    Sleep(3000);
    //printf("Threads Complete %x\n",tCntDone);
    CloseHandle(hThread[0]);
    CloseHandle(hThread[1]);
    /*for(int x = 0; x < 2;x++)
    const char *tst = publishAndWait("vitria.jms.authreq","XML","276",buffer,120);      
    if(tst == NULL)
    printf("No Response\n");
    else
    printf("%s\n",tst);
    delete tst;
    delete(buffer);

    Ok, I have done some more testing. It appears that two native threads cannot access the same java object, even if a global reference exist, and you call AttachCurrentThread, and using that env pointer to make calls. It always fails with some java error, like ClassNotFoundError, and only on the second native thread created. Is this a part of the spec or is it a bug, or am I having an operator malfuntion?

  • Stack size for native thread attaching to JVM

    All:
    I have a native thread (see below, FailoverCallbackThread) that attaches to the JVM and does a Java call through JNI. The stack size for the native thread is 256KB.
    at psiUserStackBangNow+112()@0x20000000007a96d0
    at psiGuessUserStackBounds+320()@0x20000000007a8940
    at psiGuessStackBounds+48()@0x20000000007a8f60
    at psiGetPlatformStackInfo+336()@0x20000000007a9110
    at psiGetStackInfo+160()@0x20000000007a8b40
    at psSetupStackInfo+48()@0x20000000007a5e00
    at vmtiAttachToVMThread+208()@0x20000000007c88b0
    at tsAttachCurrentThread+896()@0x20000000007ca500
    at attachThread+304()@0x2000000000751940
    at genericACFConnectionCallback+400(JdbcOdbc.c:4624)@0x104b1bc10
    at FailoverCallbackThread+512(vocctx.cpp:688)@0x104b8ddc0
    at start_thread+352()@0x20000000001457f0
    at __clone2+208()@0x200000000030b9f0
    This causes stack overflow in Oracle JRockit JVM. (It does not cause overflow with Oracle Sun JDK.) Is there a recommended stack size for this use case for JRockit? Is there a way to compute it roughly?
    Platform Itanium 64 (linux)]
    java version "1.5.0_06"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
    BEA JRockit(R) (build R26.4.0-63-63688-1.5.0_06-20060626-2259-linux-ia64, )
    mp

    How do I found default heap size, stack size for the
    thread, number of threads per jvm/process supported ?The threads is OS, OS install and jvm version specific. That information is also not useful. If you create the maximum number of threads that your application can create you will run out of memory. Threads require memory. And it is unlikely to run very well either.
    The default heap size and stack size are documented in the javadocs that explain the tools that come with the sun jdk.
    and how the above things will vary for each OS and how
    do I found ? Threads vary by OS, and OS install. The others do not (at least not with the sun jvm.)
    If I get "OutOfMemoryError: Unable to create new native thread" Most of the time it indicates a design problem in your code. At the very lease, you should consider using a thread pool instead.
    I found in one forum, in linux you can create maximum
    of 894 threads. Is it true ?Seems high since in linux each thread is a new process, but it could be.

  • Java Thread Priority

    I am working on a system where I have a couple of background threads processing some non-time critical tasks. The desired behaviour of the system is that the background threads would adapt itself when the load of the system is increasing/descreasing... So as to ensure the normal operation of the system performing the main tasks.
    How reliable is with the use of java thread priority... I thought of something like lowering the priority of the background threads gradually when the load increases and then boosting the priority to a max of NORMAL_PRIORITY when the load descreases... what about the use of yield()? I am using some application facts to predicts the load of the system... Does anybody has a clue whether it is possible to query general information about the system load through some java APIs (without using native libs)?
    Your advice and help is much appreciated...

    It is very platform dependant. Windows screws
    everything up when it comes to threads. They favor
    GUI threads natively over non GUI threads. So instead
    of letting the programmer setup thread priorities
    Microsoft figures your a moron and adjusts it for
    you... Plus the 10 levels of priorities doesn't map
    well at all between unix and Windows. If you look
    even deeper inside you will see just what a joke
    Windows threads are.I don't think I can just rely on the reliability of Java Thread Scheduling... I need something more than that. I need to reach a confidence level that the background threads will not affect the operation of the main worker threads. Though "sleeping" to give up control may not have result in good utilization, but it indirectly create more chances for the worker threads to run. I need to play around with a good sleep time, or best, sleep longer when the load is high/increasing and shorter when the load is low/decreasing... By the way, do u think the context switches incurred when will be significant?

  • Help needed about thread priority

    Hello, could someone help me with the priorities in java? I got 10 levels in total(1-10), but I do need at least 20 levels for my multiple threads program.
    Thank you for your kind help in advance.

    First, let me apologize if I am incorrect, but it seems that the native Thread implementation restricts you to 10 priorities regardless.
    However, you can do just about anything you envision, but it will require some implementation on your part.
    You could implement a subclass of thread that contains your priority (which could be from 1-20). You could then maintain a ThreadManager that would store all running threads, and would accept requests to start and stop threads. The ThreadManager could make decisions about which threads to run, which to interrupt, which to sleep, etc., based on your priority value.
    This sounds like alot to swallow, but I'm sure it's doable if you understand threads.

  • Call Java method from c/c++ from native thread

    Hi,
    I know how to call a method from c/c++ with jni back to Java
    but this fails when I try to do this from a native thread.
    I can get the object class (jclass) but its seems to fail to get a method from that class.
    How to make it work?
    Thanks in advance.

    Ok, problem has been solved
    I just get the jmethodID inside a JNI method and pass it to the thread.

  • OutOfMemory : Unable to new native thread

    Let me start off by giving some background.
    We began experiencing this issue within the past month
    in our production environment, but cannot reproduce
    it in an isolated testing environment.
    I have performed extensive tests in regards to Heap Sizes
    and Thread Stack sizes in hopes of resolving this issue, but
    none have worked.
    Hardware/OS Settings
    OS for platform is Linux
    Distribution is RHAS 2.1
    Kernel version is 2.4.9-e.30enterprise SMP
    Box has 2 CPUs which are hyperthreaded
    ULIMIT settings
    core file size (blocks) 0
    data seg size (kbytes) unlimited
    file size (blocks) unlimited
    max locked memory (kbytes) unlimited
    max memory size (kbytes) unlimited
    open files 1024
    pipe size (512 bytes) 8
    stack size (kbytes) 8192
    cpu time (seconds) unlimited
    max user processes 8191
    virtual memory (kbytes) unlimited
    /etc/sysctl.conf , contains (effectively overrides the ulimt setting)
    fs.file-max = 65535
    /proc/sys/kernel/threads-max
    16383
    glibc version is 2.2.4
    Physical Mem : ~ 2 Gig
    Swap : ~ 4 Gig
    JVM Settings
    java version "1.4.2_03"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_03-b02)
    Java HotSpot(TM) Client VM (build 1.4.2_03-b02, mixed mode)
    -server -Djava.awt.headless=true -XX:+DisableExplicitGC -Xms1228m -Xmx1228m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -verbosegc -verbosegc -XX:+PrintGCDetails -Xloggc:/opt/logs/gc_log.txt
    Tests
    The way i understand it, the memory available for thread creation is:
    Physical Memory - "-Xmx" = ~ 800 MB (in our case)
    Also, the default stack size on linux is 512k, so a base line (with no other
    phyical memory usage than the JVM) is:
    800 * 1000 / 512 = ~ 1562 threads
    however, i when the error recurrs, i can do a :
    ps -ef | grep java | wc -l (each java thread is represented by a process on linux)
    and that # is way below 1562 (approx 90 or so)
    additionally, via java code at the time of the exception you can get
    the Mother Thread group:
            private static ThreadGroup getMotherThreadGroup()
              ThreadGroup mother = Thread.currentThread().getThreadGroup();
              while(mother.getParent() != null)
                   mother = mother.getParent();
              return mother;
         }and then get the # of threads in the group:
            Thread      currentThread = Thread.currentThread();
            ThreadGroup mother        = getMotherThreadGroup();       
         Thread[]    threads       = new Thread[mother.activeCount() + 5];          
            int threadCount;
            for (int count;;)
                count = mother.enumerate(threads,true);
                if (count < threads.length)
                    threadCount = count;
                    break;
                threads = new Thread[threads.length << 1];
            }  once again this # is way below 1562 (matches rougly to the 'ps' output)
    Additionally, I have modified the JVM parameters to indepdently reduce
    -Xms by 100 m and reduce the stack size to -Xss256k and neither of
    these resolve the issue.
    Questions
    What other OS level settings could be affecting the # of threads that can be created?
    What JVM settings could be affecting the # of threads that can be created?
    Are there ever Java threads present that will no be represented by the
    code in this post, or a 'ps' process listing?

    Some additional information, in regards to Linux and Maximum # of Threads.
    This bug entry in Redhat's Bug DB, provides some insight into the native
    thread threshold:
    https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=70058
    From the Java Bug Database:
    On Redhat 7.2, the pthread library has a hard-coded thread limit, which
    is 1024. To increase this limit, you have to change PTHREAD_THREADS_MAX
    and recompile pthread library. See LinuxThreads FAQ. Hitting an
    OutOfMemoryError after 1014 threads on RH-7.2 is normal.
    The error on RH-9 looks strange. But when I tested on my RH-9 box, things
    work ok. The testcase runs until it has hit one of the system limits:
    + max user processes (use "ulimit -u" to adjust)
    + thread limit, this is calculated based on the amount of physical memory
    (you can change it by editing /proc/sys/kernel/threads-max)
    + virtual memory. 32bit Linux by default allows 2GB virtual address space
    in user application. Unless you specify a smaller stack size (-Xss96k
    will do it), java will run out of virtual space in about 4000 threads
    (default stack size is 512k, 2GB/512k = 4096, but notice that the
    virtual memory is also used for C heap, library image, data segments, et al.)
    Another Linux Thread explanation:
    Threads
    Limitations on threads are tightly tied to both file descriptor
    limits, and process limits.
    Under Linux, threads are counted as processes, so any limits to
    the number of processes also applies to threads. In a heavily
    threaded app like a threaded TCP engine, or a java server, you
    can quickly run out of threads.
    For starters, you want to get an idea how many threads you can
    open. The `thread-limit` util mentioned in the Tuning Utilities
    section is probabaly as good as any.
    The first step to increasing the possible number of threads is
    to make sure you have boosted any process limits as mentioned
    before.
    There are few things that can limit the number of threads,
    including process limits, memory limits, mutex/semaphore/shm/ipc
    limits, and compiled in thread limits. For most cases, the
    process limit is the first one to run into, then the compiled in
    thread limits, then the memory limits.
    To increase the limits, you have to recompile glibc. Oh fun!.
    And the patch is essentially two lines!. Woohoo!
    --- ./linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h.akl Mon Sep 4
    19:37:42 2000
    +++ ./linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h Mon Sep 4
    19:37:56 2000
    @@ -64,7 +64,7 @@
    /* The number of threads per process. */
    #define POSIXTHREAD_THREADS_MAX 64
    /* This is the value this implementation supports. */
    -#define PTHREAD_THREADS_MAX 1024
    +#define PTHREAD_THREADS_MAX 8192
    /* Maximum amount by which a process can descrease its asynchronous I/O
    priority level. */
    --- ./linuxthreads/internals.h.akl Mon Sep 4 19:36:58 2000
    +++ ./linuxthreads/internals.h Mon Sep 4 19:37:23 2000
    @@ -330,7 +330,7 @@
    THREAD_SELF implementation is used, this must be a power of two and
    a multiple of PAGE_SIZE. */
    #ifndef STACK_SIZE
    -#define STACK_SIZE (2 * 1024 * 1024)
    +#define STACK_SIZE (64 * PAGE_SIZE)
    #endif
    /* The initial size of the thread stack. Must be a multiple of PAGE_SIZE.
    Now just patch glibc, rebuild, and install it. ;-> If you have a
    package based system, I seriously suggest making a new package
    and using it.
    And two links that describe Linux/GLIBC changes and how they affect threads:
    http://www.jlinux.org/server.html
    http://www.volano.com/linux.html
    C Code for testing Native Thread Creation:
    /* compile with:   gcc -lpthread -o thread-limit thread-limit.c */
    /* originally from: http://www.volano.com/linuxnotes.html */
    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    #define MAX_THREADS 10000
    int i;
    void run(void) {
      char c;
      if (i < 10)
        printf("Address of c = %u KB\n", (unsigned int) &c / 1024);
      sleep(60 * 60);
    int main(int argc, char *argv[]) {
      int rc = 0;
      pthread_t thread[MAX_THREADS];
      printf("Creating threads ...\n");
      for (i = 0; i < MAX_THREADS && rc == 0; i++) {
        rc = pthread_create(&(thread), NULL, (void *) &run, NULL);
    if (rc == 0) {
    pthread_detach(thread[i]);
    if ((i + 1) % 100 == 0)
         printf("%i threads so far ...\n", i + 1);
    else
    printf("Failed with return code %i creating thread %i.\n",
         rc, i + 1);
    exit(0);

  • Attach native thread to JVM

    Hi,
    I use JNI to extend my Java class with some Windows specific functions.
    In the native code I have to check the value of a variable from Java and for this I created a new native thread.
    The documentation says that "the JNI interface pointer is valid only in current thread", so one must attach the new thread to the JVM in order to get a new interface pointer. But for attaching a thread to the JVM you need the ORIGINAL JNI INTERFACE POINTER. On the other hand, the documentation says that you "must not pass the interface pointer from one thread to another". So, I don't understand how to do it?
    Here is a sample from my code:
    JNIEXPORT jint JNICALL
    Java_com_cts__TestJNI_startTask(JNIEnv *env, jobject obj, jstring name)
    //creating a global reference
    jobject globalObj = env->NewGlobalRef(obj);
    //create the new thread
    hThread = CreateThread(NULL,
    0,
    (LPTHREAD_START_ROUTINE) WaitForStop,
    (LPVOID) env,//=>>> it mustn't be passed!
    0,
    &tid);
    //the thread method, which check the value of "status" field from Java
    void WINAPI WaitForStop(LPARAM lparam)
    JavaVM *jvm;
    JNIEnv *jenv;
    pInitData->lparam->env->GetJavaVM(&jvm);
    jint res = jvm->AttachCurrentThread((void**) &jenv, NULL);
    if (res < 0) {
    return;
    jclass jclasjni = jenv->GetObjectClass(globalObj);
    jfieldID jfid = jenv->GetFieldID( jclasjni, "status", "I");
    jint jstatus = 0;
    do
         Sleep(1000);
         jstatus = jenv->GetIntField(globalObj, jfid);
    } while (jstatus == 0);
    jvm->DetachCurrentThread();
    Is it correct the way I attached the thread?
    Because I don't quite understand this JNI interface pointer issue.
    Thanks in advance

    Ahhh - ha - got it working.
    Here is how I did it:
    dynamically link to the GetCreatedJavaVMs() function in the jni library (hJVM is the result of an earlier call to LoadLibrary):
         // type definitions for function addresses returned by loading jvm.dll
         typedef jint (JNICALL GetCreatedJavaVMs_t)( JavaVM**, jsize, jsize* );
         // function definitions for functions used in jvm.dll
         GetCreatedJavaVMs_t *GetCreatedJavaVMs;
         GetCreatedJavaVMs = (GetCreatedJavaVMs_t*)GetProcAddress( hJVM, "JNI_GetCreatedJavaVMs" );
         return GetCreatedJavaVMs( jvm, bufLen, nVMs);Get an appropriate instance on the JVM by called GetCreatedJavaVMs and pulling the first one. Once we have that, call AttachCurrentThread to get a JNIEnv pointer that we can use for doing work:
         JavaVM *jvm;
         JNIEnv *jenv;
         jint nSize = 1;
         jint nVms;
         jint nStatus = JAVAVM.GetCreatedJavaVMs( &jvm, nSize, &nVms );
         jint res = jvm->AttachCurrentThread((void**) &jenv, NULL);
        jclassStartup =
           jenv->FindClass(sStartupClass); // do some workWhen all done with the invocation, detach the jenv pointer from the current thread:
         jvm->DetachCurrentThread();Works like a charm.
    - K

  • Nativ thread

    Hi,
    Using the version solaris 8 java 1.2.2 , the threads are native so not
    controlled by the user. Having 2 threads wich interfere each others because they share the same data, i have a critical section. How can i protect my data ? Is there semaphore in Java ? Any idea ?
    Thanks in advance...
    Olivier

    Not sure I understand exactly your question but I will offer some tips.
    First make sure all the native threads are attached to the VM, so they can all make use of the Java methods.
    There is no semaphore built-in to Java. You can implement your own if you like, using synchronized methods of a class. A simple Semaphore class containing a private int to keep track of counting, and synchronized methods to increment, decrement, and optionally get and set the value of the counter, is sufficient for a simple semaphore. Synchronized anything is very slow in the 1.2 VM so if you are worried about performance, you are better off either upgrading to 1.4 or avoiding the Java synchronization operations.
    If you are controlling access only to native resources, accessed only through native code, then you can use regular C++ thread operations. The Java thread calling the native methods will be safely controlled by the C++ threading functions, however you must not destroy a Java thread directly from native code. If you have a C++ thread you have created you can destroy it from your C++ code provided it is first detached from the VM. Of course, as with any native code, you must be very careful, because bugs in native code can cause truly bizarre VM behavior and thread problems are no different.
    However, this approach will not work if you are working with a VM using a user-thread library, and it will not (necessarily) work if you are controlling access to a Java object which might be accessed both from native and from Java code. In this case, you must synchronize on the contested object using the JNI functions MonitorEnter and MonitorExit. C++ code between a MonitorEnter call and MonitorExit call will work exactly as if it were enclosed in a Java synchronized(){} block. You can call MonitorEnter and MonitorExit many times and on different objects, just as long as you call MonitorExit on each object as many times as you call MonitorEnter on it. Be aware of possible deadlock issues here, two threads can deadlock each trying to acquire locks held by the other. It is good practice also to exit monitors in the reverse order from which they were entered, although I do not know if this is a hard restriction or not in any particular VM.
    Let me know if this answers your question or not :}

  • Java.lang.OutOfMemoryError: unable to create new native thread on Win2000

    Dear all,
    I install a java server (SAP J2EE) on the windows machine and run into the following problem: the total number of threads cannot exceed 1200 (as i see this in the task manager)
    After it does reach this number no other tasks can be started. Thereafter i get java.lang.OutOfMemoryError: unable to create new native thread error .
    However the other machine where the same distribution of Win2000 Server is installed can easily coupe with more than 2500 theads. The same is true when the safe mode on the first machine is on: I can generate more than 1200 threads. So it seems the problem has something to do with Windows itself.
    I am really puzzled here, would really appreciate any help.
    Thanks in advance,
    Dimitry
    Surkov Dimitry
    [email protected]
    +49.1632.492618

    well, i do not supply any options when i start jvm, but it is not the course:
    it also happens with c programs. however in the safe mode it works. both for c and for java program.
    so it must be either some software (however memory is ok) or ...? i am lost. In some Unix system you can set the total number of threads allowed as an option in the kernal. But i guess this is not the case with windows.
    Thanks a lot for your reply,
    dimitry

  • Java.lang.OutOfMemoryError: unable to create new native thread

    Hi All,
    I have installed weblogic server 8 sp4 in production environment . I am facing problems with JVM issues .
    JVM is crashing very frequently with the following errro :
    ####<Jun 18, 2009 10:58:22 AM IST> <Info> <Common> <IMM90K-21> <SalesCom> <ExecuteThread: '24' for queue: 'weblogic.kernel.Default'> <<anonymous>> <> <BEA-000628> <Created "1" resources for pool "PIConnectionPool", out of which "1" are available and "0" are unavailable.>
    ####<Jun 18, 2009 11:00:09 AM IST> <Info> <EJB> <IMM90K-21> <SalesCom> <ExecuteThread: '23' for queue: 'weblogic.kernel.Default'> <<anonymous>> <> <BEA-010051> <EJB Exception occurred during invocation from home: payoutCheck.ejb.payoutCheck_s6v3so_HomeImpl@121a735 threw exception: java.lang.OutOfMemoryError: unable to create new native thread
    java.lang.OutOfMemoryError: unable to create new native thread
         at java.lang.Thread.start(Native Method)
         at payoutCheck.classes.MyThread2.MyThreadv(PayoutCheckBOImpl.java:249)
         at payoutCheck.classes.PayoutCheckBOImpl.genSP(PayoutCheckBOImpl.java:184)
         at payoutCheck.ejb.PayoutCheckSLSB.genSP(PayoutCheckSLSB.java:191)
         at payoutCheck.ejb.payoutCheck_s6v3so_EOImpl.genSP(payoutCheck_s6v3so_EOImpl.java:315)
         at payoutCheck.ejb.payoutCheck_s6v3so_EOImpl_CBV.genSP(Unknown Source)
         at payoutCheck.deligate.PayoutCheckBD.genSP(PayoutCheckBD.java:226)
         at ui.action.SearchAction.callFilter(SearchAction.java:378)
         at sun.reflect.GeneratedMethodAccessor201.invoke(Unknown Source)
         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
         at java.lang.reflect.Method.invoke(Method.java:324)
         at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)
         at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:220)
         at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:446)
         at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:266)
         at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1292)
         at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:510)
         at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
         at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
         at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1006)
         at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:419)
         at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:315)
         at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6718)
         at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
         at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
         at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3764)
         at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2644)
         at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:219)
         at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:178)
    >
    The above mentioned is coming several times , anybody please help out to get rid of this issue.
    Thanks in advance ,
    Krikar.

    This only tells you that the JVM is running out of heap space. It doesn't tell you what is causing the problem. You likely have a memory leak, but you could also try increasing the max heap size of the JVM (-Xmx command line option). It would help to watch the % mem in use statistic, but only immediately after a garbage collection cycle (you can force a GC from the admin console). If the % mem in use after the GC is increasing over time, then that likely confirms you have a memory leak. Note that looking at that statistic during the server startup probably is irrelevant. You'd need to wait until the server finishes starting up, and likely processed a few messages (to load static data).
    If you get to the point of confirming that you have a memory leak, that requires doing detailed analysis with a Java profiler (JProfiler, JProbe, YourKit, etc.) to track down the source of the leak.

  • Help! Unable to create new native thread

    Ok I see this problem all over the web but most of the posts are many years old and still leave me a little confused.  Often at random times on the same tags like CFLDAP I get the error "Unable to create new native thread".  Then a few minutes later the same tag on the same page works just fine.
    I have 4GB of memory in this box with 1400 MB set as the maximum Java heap size by the way.
    Here are my arguments from the jvm.config file.
    # Arguments to VM
    java.args=-server  -Xmx1400m -Dsun.io.useCanonCaches=false -XX:MaxPermSize=192m -XX:+UseParallelGC -Dcoldfusion.rootDir={application.home}/../ -Dcoldfusion.libPath={application.home}/../lib -Dcoldfusion.classPath={application.home}/../lib/updates,{application.home}/../lib,{appli cation.home}/../gateway/lib/,{application.home}/../wwwroot/WEB-INF/flex/jars,{application. home}/../wwwroot/WEB-INF/cfform/jars,"C:\\Program Files\\Apache Software Foundation\\Apache2.2\\htdocs\\InterWeb-Prod\\includes\\classes"
    Here is a typical error that comes through.
    struct     
    Browser     Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.70 Safari/533.4    
    DateTime    {ts '2010-06-23 10:07:44'}  
    Diagnostics unable to create new native thread null <br>The error occurred on line 122.
    GeneratedContent      
    HTTPReferer http://--------------------/index.cfm?FuseAction=HR.main    
    Mailto      interweb@--------------------- 
    Message     unable to create new native thread      
    QueryString fuseaction=ManagedLists.MailSubscriptions     
    RemoteAddress     192.168.250.124
    RootCause   struct    
    Message     unable to create new native thread      
    StackTrace          java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.start0(Native Method) at java.lang.Thread.start(Thread.java:597) at com.sun.jndi.ldap.Connection.<init>(Connection.java:208) at com.sun.jndi.ldap.LdapClient.<init>(LdapClient.java:112) at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2504) at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:263) at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:76) at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667) at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288) at javax.naming.InitialContext.init(InitialContext.java:223) at javax.naming.InitialContext.<init>(InitialContext.java:197) at javax.naming.directory.InitialDirContext.<init>(InitialDirContext.java:82) at coldfusion.tagext.net.LdapTag.do_ActionQuery(LdapTag.java:839) at coldfusion.tagext.net.LdapTag.doStartTag(LdapTag.java:616) at coldfusion.runtime.CfJspPage._emptyTcfTag(CfJspPage.java:2661) at cfadfunctions2ecfm1473603830$funcADLOOKUPUSERNAME.runFunction(C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\InterWeb-Prod\includes\adfunctions.cfm:122) at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:418) at coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:324) at coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:59) at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:277) at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:192) at coldfusion.runtime.CfJspPage._invokeUDF(CfJspPage.java:2471) at cfadfunctions2ecfm1473603830$funcADLOOKUPMULTIPLEUSERNAMES.runFunction(C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\InterWeb-Prod\includes\adfunctions.cfm:54) at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:418) at coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:324) at coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:59) at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:277) at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:192) at coldfusion.runtime.CfJspPage._invokeUDF(CfJspPage.java:2471) at cfdsp_managedlists2ecfm55598920.runPage(C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\InterWeb-Prod\hr\managedlists\dsp_managedlists.cfm:232) at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:196) at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:370) at coldfusion.runtime.CfJspPage._emptyTcfTag(CfJspPage.java:2661) at cffbx_switch2ecfm2121232114.runPage(C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\InterWeb-Prod\hr\managedlists\fbx_switch.cfm:23) at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:196) at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:370) at coldfusion.runtime.CfJspPage._emptyTcfTag(CfJspPage.java:2661) at cffbx_fusebox30_cf502ecfm1180471387._factor4(C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\InterWeb-Prod\fbx_fusebox30_cf50.cfm:241) at cffbx_fusebox30_cf502ecfm1180471387._factor5(C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\InterWeb-Prod\fbx_fusebox30_cf50.cfm:1) at cffbx_fusebox30_cf502ecfm1180471387.runPage(C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\InterWeb-Prod\fbx_fusebox30_cf50.cfm:1) at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:196) at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:370) at coldfusion.runtime.CfJspPage._emptyTcfTag(CfJspPage.java:2661) at cfindex2ecfm749274359.runPage(C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\InterWeb-Prod\index.cfm:23) at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:196) at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:370) at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65) at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:273) at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48) at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40) at coldfusion.filter.PathFilter.invoke(PathFilter.java:86) at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70) at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:2 8) at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38) at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46) at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38) at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22) at coldfusion.CfmServlet.service(CfmServlet.java:175) at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89) at jrun.servlet.FilterChain.doFilter(FilterChain.java:86) at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42 ) at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46) at jrun.servlet.FilterChain.doFilter(FilterChain.java:94) at jrun.servlet.FilterChain.service(FilterChain.java:101) at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)  
    I could really use some help figuring this out.  We are getting random errors a few times a day and usually in places where we are using CFLDAP.
    Thanks,
    David

    Absolutely unbelievable that this has been going on for 4 YEARS and there are still NO definitive answers from Adobe!!
    There's no definite answer from Adobe, because there's no definitive single question.  These errors come up because - for any number of possible reasons - the JVM becomes overloaded.  And it's almost always down to an issue with the application code being run, and nothing to do with CF, per-se.  So what's Adobe supposed to do?  Come and fix your application for you?  There are plenty of diagnostic tools out there - some built into CF itself - which you could use to sort the problem out.  Or you could hire someone like Mike Brunt to come and have a look at your set up.  All it takes to fix these things is to actually do something about fixing it, rather than slamming one's fist on the desk saying "why doesn't Adobe do something!"
    I thought - and my knowledge in the area isn't expansive - the inability to allocate threads was down to the app being choked up: threads are a finite commodity, and if requests are queuing up faster than the JVM can clear them, you're gonna get errors eventually.  What causes this sort of thing?  More traffic than the server can process.  This could be because of server kit, or it could be due to code that doesn't scale to the requirement.  Usually the latter.  Basically one cannot polish a turd.
    I have a 24x7 production server that services 180,000 clients in 300 countries around the clock that cannot afford to be down for more than a few minutes at a time.
    I'm running Windows 2008 32-bit with 4GB of RAM because I have some graphics software that cannot tolerate a 64-bit OS.  Everything has been running fine for the past few months, but now it's starting to crash more and more frequently.  I have CF 8.0.1.195765 and Java 1.6.0_04
    How many concurrent requests for 180000 clients generate?  The number of clients matters less than how heavily the site is used.  But, to be honest, I get the impression the implication is "it's a busy site", in which case I think your hardware is a bit on the lean side.  Also, if it's a mission-critical app, running it on a single server is probably ill-advised, just from a fault-tolerance perspective even before one starts thinking about performance.
    If I was in your situation, I'd consider the following options:
    * upgrade your JVM to the most recent version (1.6.0_21?)
    * put more RAM in the box, and run a second CF instance on it.
    * get another box.
    * refactor the environment so the graphics software runs on a different box, upgrading the CF server to 64-bit (again, with more RAM)
    * run some diagnostics on the server, seeing what's taking up threads and where any bottlenecks might be
    * get an expert in to do the analysis side of things.
    * stop expecting Adode to fix "something".
    One of my other symptoms I have noticed is that any work done using RDP starts getting really really bogged down.  Opening Windows Explorer and searching for files can take minutes.  Restarting the CF service will sometimes fail to complete, and you have to wait a few minutes before the manual Start option appears in the dropdown.  Maybe coincidentally, the Performance Monitor will fail to add any of the ColdFusion metrics, for example Running Requests and Queued Requests, and the Event Monitor shows an error relating to an 8-byte boundary not being maintained.
    You don't, by any chance, store your client variables in the registry do you?  The only time I've seen this happen is when the CF box is munging the OS environment, and the only way I can think this could happen if it was clogging the registry.  Never store client variables in the registry.
    Adam

  • Unable to create native thread in Normal Condition

    I am trying to analyze the "OOM unable to create native thread" error that occurred in our application. I wrote a sample program which has to creates 5000 threads and monitored it using JConsole.
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    * ThreadJvmMemory.java
    * Created on June 1, 2007, 9:49 AM
    * To change this template, choose Tools | Template Manager
    * and open the template in the editor.
    * @author Administrator
    public class ThreadJvmMemory extends Thread{
    /** Creates a new instance of ThreadJvmMemory */
    BufferedReader in = null;
    public ThreadJvmMemory() {
    public static void main(String args[]){
    ThreadJvmMemory dummy = new ThreadJvmMemory();
    dummy.waitTillEnter();
    for(int i=0;i<5000;i++){
    if(i%1000==0){
    System.out.println(i);
    dummy.waitTillEnter();
    ThreadJvmMemory dummy1 = new ThreadJvmMemory();
    dummy1.start();
    public void run(){
    //System.out.println("Here");
    Object dummyObject = new Object();
    try {
    in = new BufferedReader(new InputStreamReader(System.in));
    in.readLine();
    } catch (IOException ex) {
    ex.printStackTrace();
    System.out.println("Came out of the thread");
    public void waitTillEnter(){
    try {
    if(in==null)
    in = new BufferedReader(new InputStreamReader(System.in));
    in.readLine();
    } catch (IOException ex) {
    ex.printStackTrace();
    I started the program using the following command line option..
    "c:\Program Files\Java\jdk1.5.0_09\bin\java.exe" -Dcom.sun.management.jmxremote.port=9979 -Xmx512m -Xminf0.1 -Xmaxf0.1 -XX:MaxPermSize=256m -XX:PermSize=256m -XX:+<GCTYPE> -XX:+PrintGCDetails
    where GCType will be UseTrainGC or UseSerialGC or UseParallelGC or
    What i observe in all the cases, there are no more than 1000 threads getting created . After completion of 1000 threads garbage collector keeps running and no more threads get created. Since i have configured heapsize to be 512m, PermGenSpace to be 256 and default value for process sapece is 2gb, JVM would be able to create only 1000 threads as per the formula "NoOfThreads = Process space - (Heap + permGen+some for VM initialization)/Stack Size" (correct me if i am wrong). But why i am not getting OutOfMemoryError while creating native thread. Moreover i can observer non-heap (Perm Gen) space keep growing overtime. But there is enough space in all other spaces.So my doubts are
    1. Actually when we will get OOM error saying unable to create Native thread. To be more specific when which space occupied i will get this error.
    2. Is there any way to configure process space. IMO No ?? Confirm ??
    3. Does any one tried using a a tool that analyzes verboseGC output of SUN JVM. If so can you give any pointer. I have read through GCPortal, but i havent fully deployed it.
    Java version is 1.5.0
    OS Windows 2k3
    Snippet of GC Output
    [GC [DefNew: 5208K->38K(5824K), 0.0072564 secs] 32049K->26879K(34636K), 0.0080451 secs]
    [GC [DefNew: 5222K->24K(5824K), 0.0070320 secs] 32063K->26868K(34636K), 0.0078097 secs]
    [GC [DefNew: 5208K->39K(5824K), 0.0082161 secs] 32052K->26883K(34636K), 0.0090173 secs]
    [GC [DefNew: 5223K->27K(5824K), 0.0080766 secs] 32067K->26874K(34636K), 0.0089273 secs]
    [GC [DefNew: 5211K->39K(5824K), 0.0071186 secs] 32058K->26886K(34636K), 0.0078970 secs]
    [GC [DefNew: 5223K->25K(5824K), 0.0070952 secs] 32070K->26875K(34636K), 0.0078766 secs]
    [GC [DefNew: 5209K->21K(5824K), 0.0069871 secs] 32059K->26872K(34636K), 0.0077657 secs]

    I am trying to analyze the "OOM unable to create native thread" error that occurred in our application. I wrote a sample program which has to creates 5000 threads and monitored it using JConsole.
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    * ThreadJvmMemory.java
    * Created on June 1, 2007, 9:49 AM
    * To change this template, choose Tools | Template Manager
    * and open the template in the editor.
    * @author Administrator
    public class ThreadJvmMemory extends Thread{
    /** Creates a new instance of ThreadJvmMemory */
    BufferedReader in = null;
    public ThreadJvmMemory() {
    public static void main(String args[]){
    ThreadJvmMemory dummy = new ThreadJvmMemory();
    dummy.waitTillEnter();
    for(int i=0;i<5000;i++){
    if(i%1000==0){
    System.out.println(i);
    dummy.waitTillEnter();
    ThreadJvmMemory dummy1 = new ThreadJvmMemory();
    dummy1.start();
    public void run(){
    //System.out.println("Here");
    Object dummyObject = new Object();
    try {
    in = new BufferedReader(new InputStreamReader(System.in));
    in.readLine();
    } catch (IOException ex) {
    ex.printStackTrace();
    System.out.println("Came out of the thread");
    public void waitTillEnter(){
    try {
    if(in==null)
    in = new BufferedReader(new InputStreamReader(System.in));
    in.readLine();
    } catch (IOException ex) {
    ex.printStackTrace();
    I started the program using the following command line option..
    "c:\Program Files\Java\jdk1.5.0_09\bin\java.exe" -Dcom.sun.management.jmxremote.port=9979 -Xmx512m -Xminf0.1 -Xmaxf0.1 -XX:MaxPermSize=256m -XX:PermSize=256m -XX:+<GCTYPE> -XX:+PrintGCDetails
    where GCType will be UseTrainGC or UseSerialGC or UseParallelGC or
    What i observe in all the cases, there are no more than 1000 threads getting created . After completion of 1000 threads garbage collector keeps running and no more threads get created. Since i have configured heapsize to be 512m, PermGenSpace to be 256 and default value for process sapece is 2gb, JVM would be able to create only 1000 threads as per the formula "NoOfThreads = Process space - (Heap + permGen+some for VM initialization)/Stack Size" (correct me if i am wrong). But why i am not getting OutOfMemoryError while creating native thread. Moreover i can observer non-heap (Perm Gen) space keep growing overtime. But there is enough space in all other spaces.So my doubts are
    1. Actually when we will get OOM error saying unable to create Native thread. To be more specific when which space occupied i will get this error.
    2. Is there any way to configure process space. IMO No ?? Confirm ??
    3. Does any one tried using a a tool that analyzes verboseGC output of SUN JVM. If so can you give any pointer. I have read through GCPortal, but i havent fully deployed it.
    Java version is 1.5.0
    OS Windows 2k3
    Snippet of GC Output
    [GC [DefNew: 5208K->38K(5824K), 0.0072564 secs] 32049K->26879K(34636K), 0.0080451 secs]
    [GC [DefNew: 5222K->24K(5824K), 0.0070320 secs] 32063K->26868K(34636K), 0.0078097 secs]
    [GC [DefNew: 5208K->39K(5824K), 0.0082161 secs] 32052K->26883K(34636K), 0.0090173 secs]
    [GC [DefNew: 5223K->27K(5824K), 0.0080766 secs] 32067K->26874K(34636K), 0.0089273 secs]
    [GC [DefNew: 5211K->39K(5824K), 0.0071186 secs] 32058K->26886K(34636K), 0.0078970 secs]
    [GC [DefNew: 5223K->25K(5824K), 0.0070952 secs] 32070K->26875K(34636K), 0.0078766 secs]
    [GC [DefNew: 5209K->21K(5824K), 0.0069871 secs] 32059K->26872K(34636K), 0.0077657 secs]

  • How to set main thread Priority?

    i have set:
    Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    // and the other thread ( )
    thread_load = new Thread();
    thread_load.setPriority(Thread.MIN_PRIORITY);
    thread_load.start();but it doesn't make any diffrent,
    i mean diffent the CPU usage for the thread.
    i want the main thread has a MAX PRIORITY CPU usage , then the other thread.
    is this true to set the thread priority use setPriority(..) ?
    thx..

    Thread is a Runnable within java (or javaw) process: his priority has no meaning outside the JVM, if you wanna impact on CPU usage you should set this process priority, i.e. (for windows):
    instead of starting as
    javaw ....try
    start/min javaw ...You could need to quote the javaw command, to see all possible priorities see start help by typing start/? in cmd.
    Bye.

Maybe you are looking for

  • Uploading an Excel File with an ITS page

    Hi All, how can I do to provide a functionality to Upload Excel or TXT Files in a ITS Page ? I try to use functions GUI_UPLOAD, but it calls a Screen that I doesn't want that apears. With another solution I make a BSP aplication that is called from m

  • Trying to add a php page to my existing template

    the title might not be what i have an issue with but its the best i could think of lol basically i have a site layout setup already now my site is at http://fgtestforum.info/daz (ive been told about ap divs already) ok in my menu under home you will

  • Itunes audio configuration problem

    Ihave just upgraded to the new version of itunes and now, when I open itunes, I get a window that says "itunes has detected a problem with your audio configuration. Audio/video playback may not generate properly". I can then click through and open it

  • Two Swap Image Behaviors - Only One Swap Image Restore Works

    How come? I have a button image with a two swap image behaviors applied to it - a rollover for the OVER state and one behavior for a disjointed or "remote" rollover effect. Both rollover effects work fine, but the disjointed or remote rollover effect

  • Field symbol assign problem

    Hi , Please find below code when I tried in version 4.6 code works correctly . but in 6.0 it gives short dump.. Here.   FIELD-SYMBOLS : <fs_table> TYPE ANY TABLE. FIELD-SYMBOLS : <fs_work_area> TYPE yatsdzz00. ASSIGN pr_data_changed->mp_mod_rows->* T