JVM Tutorials - Herong's Tutorial Examples - Version 4.23, by Dr. Herong Yang
GCTest2.java - Garbage Collection Test Program
This section describes a garbage collection test program - GCTest2.java.
We all know that objects that are not referenced will be removed from memory by the garbage collector. But we don't know how this process works exactly. I wrote the following program to try to figure this out.
/* GCTest2.java
* Copyright (c) 2013, HerongYang.com, All Rights Reserved.
*/
import java.util.*;
class GCTest2 {
static MyList objList = null;
static int wait = 1000; // in milliseconds: 1 second
static int objSize = 1280; // in KB, default = 1.25 M
static int initSteps = 320; // # of initial objects
static int testSteps = 32; // # of added objects
public static void main(String[] arg) {
if (arg.length>0) objSize = Integer.parseInt(arg[0]);
if (arg.length>1) initSteps = Integer.parseInt(arg[1]);
if (arg.length>2) testSteps = Integer.parseInt(arg[2]);
System.out.println("Test parameters:");
System.out.println(" Object size: "+objSize+"KB");
System.out.println(" Initial objects and data size: "
+initSteps+", "+(initSteps*objSize)+"KB");
System.out.println(" Added objects and data size: "
+testSteps+", "+(testSteps*objSize)+"KB");
objList = new MyList();
myTest();
}
public static void myTest() {
for (int m=0; m<initSteps; m++) {
objList.add(new MyObject());
}
Runtime rt = Runtime.getRuntime();
System.out.println(
"Time Total Free Used Free Total Act. Dead Over");
System.out.println(
"sec. Mem. Mem. Mem. %. Obj. Obj. Obj. Head");
long dt0 = System.currentTimeMillis()/1000;
while (true) {
for (int m=0; m<testSteps; m++) {
objList.add(new MyObject());
}
for (int m=0; m<testSteps; m++) {
objList.removeTail();
}
mySleep(wait);
long tm = rt.totalMemory()/1024;
long fm = rt.freeMemory()/1024;
long ratio = (100*fm)/tm;
long dt = System.currentTimeMillis()/1000 - dt0;
long to = MyObject.getCount()*objSize;
long ao = MyList.getCount()*objSize;
System.out.println(dt
+" "+tm+" "+fm+" "+(tm-fm)+" "+ratio+"%"
+" "+to+" "+ao+" "+(to-ao)
+" "+(tm-fm-to));
}
}
static void mySleep(int t) {
try {
Thread.sleep(t);
} catch (InterruptedException e) {
System.out.println("Interreupted...");
}
}
static class MyObject {
private static long count = 0;
private long[] obj = null;
public MyObject next = null;
public MyObject prev = null;
public MyObject() {
count++;
obj = new long[objSize*128]; //128*8=1024 bytes
}
protected final void finalize() {
count--;
}
static long getCount() {
return count;
}
}
static class MyList {
static long count = 0;
MyObject head = null;
MyObject tail = null;
static long getCount() {
return count;
}
void add(MyObject o) {
// add the new object to the head;
if (head==null) {
head = o;
tail = o;
} else {
o.prev = head;
head.next = o;
head = o;
}
count++;
}
void removeTail() {
if (tail!=null) {
if (tail.next==null) {
tail = null;
head = null;
} else {
tail = tail.next;
tail.prev = null;
}
count--;
}
}
void removeHead() {
if (head!=null) {
if (head.prev==null) {
tail = null;
head = null;
} else {
head = head.prev;
head.next = null;
}
count--;
}
}
}
}
Some notes on the test program:
Last update: 2014.
Table of Contents
Downloading and Installing JDK 1.8.0 on Windows
Downloading and Installing JDK 1.7.0 on Windows
java.lang.Runtime Class - The JVM Instance
java.lang.System Class - The Operating System
ClassLoader Class - Class Loaders
Class Class - Class Reflections
JRockit JVM 28.2.7 by Oracle Corporation
Memory Management and Garbage Collectors
►GCTest2.java - Garbage Collection Test Program
640/400/40MB Test on HotSpot Client 1.7
640/400/40MB Test on HotSpot Client 1.6
640/400/40MB Test on JRockit 28.2
441/400/40MB Test on JRockit 28.2
1076/800/80MB Test on HotSpot Client 1.7
1076/800/80MB Test on HotSpot Client 1.6
1076/800/80MB Test on JRockit 28.2
JVM Stack, Frame and Stack Overflow
Thread Testing Program and Result
CPU Impact of Multi-Thread Applications
I/O Impact of Multi-Thread Applications
Micro Benchmark Runner and JVM Options
Micro Benchmark Tests on "int" Operations
Micro Benchmark Tests on "long" Operations
Micro Benchmark Tests in JIT Compilation Mode