Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.server -> java
Hi ,
We use oracle application server and have some pausing problems inside the java vm. The problem shows itself as pausings of executions , when clients start to get late responses ( here lat e means < 4 sec. ) , i see more than 10 garbage collector operations . The client applications are web services and do database queries. The java process ( the os is sun solaris) , according to the prstat , has > 1000 threads inside , and during the garbage collectiong phase , consumes more than 60% cpu time. ( the server has 2 cpus - 2 gb. ram) The java process uses the following parameters:
What i think is , the reason of the suspensions is garbage collector activity.
In order to decrease the time that cause pausing , i either increase the virtual memory allocated by the java process , or change the garbage collector method. Before adding up mor memory to teh system , i want to be sure the effect of changing garbag ecollector methodology.
The gc used here is serial garbage collector , in order to speed it up , the documents say that parallel garbage collector is used.
I write a small test program . This program creates 1000 threads . Each thread creates objects by using new in a loop , and this causes the garbage collector runs heavily in order to clean teh garbages. And i run the program bu using different garbage collectors but unfortunately , i dont see great difference beetween serial and parallel gc ,and serial gc is faster.
Why does this so?
Serial gc:
timex java -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
-Xmx450m -Xms450m -XX:+PrintGCApplicationConcurrentTime
-XX:+PrintGCApplicationStoppedTime -XX:+UseSerialGC test > test1
real 23.48 user 3:26.67 sys 4.33
parallel gc:
timex java -server -verbose:gc -XX:+PrintGCDetails
-XX:+PrintGCTimeStamps -Xmx450m -Xms450m
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintGCApplicationStoppedTime -XX:+UseParallelGC test > test1
real 24.35 user 3:24.68 sys 30.95
and here is the test code:
(I run this test on a bigger box , 24gb.ram , 6 dual core solaris cpus )
>cat test.java
import java.util.*; import java.net.*; import java.io.*;
class testTh extends Thread
{
public int val ;
public testTh ( int pval) { val=pval; }
public void run() {
int i=0; String s =new String("aaaa"); boolean flag=true; while (flag) { for (int j=0;j<100000;j++) { s = new String("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); } i++; if (i>10) flag=false; } }
public class test
{
public void dene() {
for ( int j=0;j<1000;j++) (new testTh(j)).start(); }
test t = new test(); t.dene();
Kind Regards,
hope
Received on Sun Dec 17 2006 - 05:14:51 CST