In the first quick browse, I noticed that parallel GC does not make much sense with just 2 processors. It may even slow down things a bit. Use it if you have 4 procs or more.
But this is not the cause of your problem.
In addition, the per thread stack size (-Xss:1024k) seems quite big. How many JVM threads are running?
Did you watch the memory usage of the JVM (VMSIZE, RSS) if it gets slow? Do you see increased paging activity? The -Xmx size should be small enough to fit in memory all the time. If the heap has to be swapped out, things get much slower.
What are your users doing?
In summary, the information you provided is not enough to do any useful analysis. Basically, its not a specifc JBoss problem, but a general JVM tuning one. Unless you found a memory leak; in this case you should first upgrade to a recent JBoss 3.2.x version.
We have been playing around with the parameters that I explained before.
We changed Xms to 1024m and after several hours running with these setting, we obtained this:
java.lang.OutOfMemoryError: unable to create new native thread
Then we decided to reduce Xmx to 1024m instead of 1536 and Xms to 880m.
We have 2GB of memory and I think that the act of reducing the maximun Java heap size will
made the "native heap" bigger and this change should prevent any OutOfMemoryErrors based on the
Our server only has Jboss. The 2GB are for Operative System and Jboss.
Now, we are testing these setting;
Could anybody tell me if these settings are ok????
We had been testing our application with JProve an JProfiler and we hadn´t found a memory leak.
About Xss exactly I don´t know if 1024k is too much or not. We are using the values of ulimit by default.
In our application we are creating threads to do specific functionality,
but I don´t know if we are using a lot or not.
We have 3 problems:
1. OutOfMemory: unable to create new native thread: I have explained it before.
2. StackOverFlowError: This appears sometimes and the Jboss dies.
3. Anormal behaviour of GC. I have explain it in the previous topic.
OutOfMemory: unable to create new native thread.
This error is actually not necessarily related to lack of memory. It basically means that the JVM could not create a new thread of execution as requested.
I have only ever seen it in relation to the Linux kernel 2.4's (and earlier) use of lightweight processes instead of true "threads". 2.4 has a hard-coded limit of 1024 processes that a process can spawn/create. So, because a thread is a process in 2.4 (and earlier), you can only create 1024 in your Java program. This limitation is not just a Java limitation however. I have read that you can recompile the kernel to increase this hardcoded limitation, but I have not done that. For Kernel 2.6+, the use of the NPTL (Native Posix Thread Library) which allows for more "true" thread behavior, will allow you to overcome this limitation (so I have read).
You can monitor the number of threads used by your process by using the JMX console in conjunction with the ServerInfo MBean's listThreadDump method. See if you start seeing this exception if your thread count gets up above 1000. If so, then this kernel limitation is the likely source of this particluar exception.
In applications where I had this problem, I limited various thread pools so that I never reached the process-wide 1024 thread limit, and that seemed to work well.
I am not sure how to address you other problems, but I hope this information helps.
This lets me think of the following scenario:
If you actually reach the thread limit of 1024, which the error message "OutOfMemory: unable to create new native thread" indicates, the your threads consume 1024 * 1024k of memory for the per process stack.
I.e. in addition to the heap of 1024MByte your are using another 1024MByte for the stacks. So all your real memory is filled by heap and stack of the JBoss JVM.
Furthermore, the text segments and the other processes also need some space on the machine, and so the machine will definitely start swapping, slowing down things a lot.
On the other hand, a StackOverflowError may indicate that the stack is too low. But I think you should avoid this by other means.
1. Try to increase -Xss to the default value (64k?).
2. Monitor the number of threads and try to reduce thread usage.
I think there is no use of using -XX:+UseConcMarkSweepGC with -XX:+UseParNewGC.
The first option for GC will clean only the tenured generation with low pauses on the app. The second option will also do the same but it also cleans the eden space using parallel threads.
The parallel threads parameter is set to 2. Can I know how many CPU's does the machine have?.
Setting -Xss to 1024 is very high. Also no need to set it if the value you want is 1024, since default is 1024 for stack sixe in linux 64 bit OS.
Try using 256k. This is ideal in most cases.
To get better performance, don't force JVM to resize the heap size. If you know how much memory your application needs, set the same for min and max sizes. If the application(s) will load the classes, use -XX:PermSize and -XX:MaxPermSize.
Also, try using -XX:NewRatio=3 instead of new size and max new size. This will allocate 1/4th of the memory for eden space.
Correct me if any of my suggestions are wrong.
shravanxm, why are you responding to a 6-year old thread?