H
hopehope_123
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
)
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();
}
public static void main(String args[])
{
test t = new test();
t.dene();
}
}
Kind Regards,
hope
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();
}
public static void main(String args[])
{
test t = new test();
t.dene();
}
}
Kind Regards,
hope