import java.io.StringReader; import java.io.StringWriter; import my.beans.googleaddress.Kml; import org.castor.mapping.BindingType; import org.exolab.castor.xml.ClassDescriptorResolverFactory; import org.exolab.castor.xml.Marshaller; import org.exolab.castor.xml.ResolverException; import org.exolab.castor.xml.Unmarshaller; import org.exolab.castor.xml.XMLClassDescriptorResolver; public class TestMemoryUse { private int iterations = 10; private static final String xml = "1819 Ocean Avenue, Santa Monica, California, Los Angeles, CA 90401, US200geocode
1819 Ocean Park Blvd, Santa Monica, CA 90405, USA
USCALos AngelesSanta Monica1819 Ocean Park Blvd90405-118.465035,34.013542,0
1819 Ocean Park Pl, Santa Monica, CA 90405, USA
USCALos AngelesSanta Monica1819 Ocean Park Pl90405-118.463492,34.013797,0
1819 Ocean Park Pl N, Santa Monica, CA 90405, USA
USCALos AngelesSanta Monica1819 Ocean Park Pl N90405-118.465730,34.013671,0
"; private static XMLClassDescriptorResolver cdr; private boolean useResolver = false; static { cdr = (XMLClassDescriptorResolver) ClassDescriptorResolverFactory.createClassDescriptorResolver(BindingType.XML); cdr.setClassLoader(Thread.currentThread().getContextClassLoader()); try { cdr.loadClassDescriptors("my.beans.googleaddress"); } catch (ResolverException e) { System.out.println(e); } } public TestMemoryUse(int iterations, boolean userResolver){ this.iterations = iterations; this.useResolver = userResolver; System.out.println("Test setup: " + iterations + " of 100 unmarshal then marshal, useResolver = " + userResolver); } public void go(){ for(int i = 0; i < iterations; i++){ long start = System.currentTimeMillis(); long[] unmarshalTimes = new long[100]; long[] marshalTimes = new long[100]; for(int j = 0; j < 100; j++){ long startOp = System.currentTimeMillis(); Kml k = (Kml) unmarshal(xml, Kml.class); unmarshalTimes[j] = System.currentTimeMillis() - startOp; startOp = System.currentTimeMillis(); String xml = marshal(k); marshalTimes[j] = System.currentTimeMillis() - startOp; } StringBuffer sb = new StringBuffer(); sb.append("Iteration " + (i+1) + " : " + (System.currentTimeMillis() - start) + " millis\t\t"); sb.append(" [u:" + getAvg(unmarshalTimes)); sb.append("\tm:" + getAvg(unmarshalTimes)); sb.append("\tf:" + (Runtime.getRuntime().freeMemory()/1024/1024)); sb.append("\tt:" + (Runtime.getRuntime().totalMemory()/1024/1024) + "]"); System.out.println(sb.toString()); try { Thread.sleep(2000); } catch (InterruptedException e) { System.out.println(e.getMessage()); } } } private long getAvg(long[] array) { long avg = 0; for (long l : array) { avg += l; } return avg/array.length; } private String marshal(Object o) { StringWriter sw = new StringWriter(); Marshaller m; try { m = new Marshaller(sw); if(useResolver){ m.setResolver(cdr); } m.marshal(o); } catch (Exception e) { System.out.println(e.getMessage()); } return sw.toString(); } private Object unmarshal(String xml, Class clazz) { Object obj = null; Unmarshaller u = new Unmarshaller(clazz); StringReader sr = new StringReader(xml); if(useResolver){ u.setResolver(cdr); } try { obj = u.unmarshal(sr); } catch (Exception e) { System.out.println(e.getMessage()); } return obj; } public static void main (String args[]){ System.out.println("u = avg unmarshal time (millis)"); System.out.println("m = avg marshal time (millis)"); System.out.println("f = free mem (mb)"); System.out.println("t = total mem (mb)\n\n"); TestMemoryUse tmu = new TestMemoryUse(10,false); tmu.go(); System.out.println("Completed successfully\n"); tmu = new TestMemoryUse(10,true); tmu.go(); System.out.println("Completed successfully"); try { Thread.sleep(20000); } catch (InterruptedException e) { System.out.println(e.getMessage()); } } }