The testcase below can demonstrate that Full GC kicks in when old generation is only 54% of its capacity. The heap size should be set to 3GB
CoreGenerator.java
import java.util.*;
public class CoreGenerator implements Runnable
{
static Random generator = new Random();
private String genString( int length )
{
final byte space = 32;
final int range = 128 - 32;
char newMessage[] = new char[ length ];
for ( int j = 0; j < length; j++ )
{
newMessage[ j ] = (char)( space + (byte) generator.nextInt( range ) );
}
return new String( newMessage );
}
public void run()
{
HashMap hm = new HashMap( 1024 );
final int maxLength = 4 * 1024 * 1024;
for ( int i = 1; i < 2 * 1024 * 1024; i++ )
{
hm.put( new Integer( i ), genString( generator.nextInt( maxLength ) ) );
if (0 == ( i % 20 ) )
{
hm.put( new Integer( generator.nextInt( i ) ), genString( generator.nextInt( maxLength ) ) );
}
}
}
public static void main( String args[] )
{
for ( int i = 0; i < 20; i++ )
{
new Thread( new CoreGenerator() ).start();
}
}
}
Run this test program with foillowing options:
java -DORB.OrbName=CoreTest -Xms3g -Xmx3g -XX:NewSize=300m -XX:MaxNewSize=300m -XX:SurvivorRatio=4 -XX:+PrintCompilation -XX:+UseParallelGC -XX:ParallelGCThreads=24 -XX:MaxPermSize=256MB -XX:PermSize=256m -XX:-UseAdaptiveSizePolicy -XX:+DisableExplicitGC -XX:+PrintTenuringDistribution -XX:+PrintHeapAtGC -XX:+PrintGCTimeStamps -Xnoclassgc -verbose:gc CoreGenerator
Note that ParalleGC is used for young gen.
CoreGenerator.java
import java.util.*;
public class CoreGenerator implements Runnable
{
static Random generator = new Random();
private String genString( int length )
{
final byte space = 32;
final int range = 128 - 32;
char newMessage[] = new char[ length ];
for ( int j = 0; j < length; j++ )
{
newMessage[ j ] = (char)( space + (byte) generator.nextInt( range ) );
}
return new String( newMessage );
}
public void run()
{
HashMap hm = new HashMap( 1024 );
final int maxLength = 4 * 1024 * 1024;
for ( int i = 1; i < 2 * 1024 * 1024; i++ )
{
hm.put( new Integer( i ), genString( generator.nextInt( maxLength ) ) );
if (0 == ( i % 20 ) )
{
hm.put( new Integer( generator.nextInt( i ) ), genString( generator.nextInt( maxLength ) ) );
}
}
}
public static void main( String args[] )
{
for ( int i = 0; i < 20; i++ )
{
new Thread( new CoreGenerator() ).start();
}
}
}
Run this test program with foillowing options:
java -DORB.OrbName=CoreTest -Xms3g -Xmx3g -XX:NewSize=300m -XX:MaxNewSize=300m -XX:SurvivorRatio=4 -XX:+PrintCompilation -XX:+UseParallelGC -XX:ParallelGCThreads=24 -XX:MaxPermSize=256MB -XX:PermSize=256m -XX:-UseAdaptiveSizePolicy -XX:+DisableExplicitGC -XX:+PrintTenuringDistribution -XX:+PrintHeapAtGC -XX:+PrintGCTimeStamps -Xnoclassgc -verbose:gc CoreGenerator
Note that ParalleGC is used for young gen.