package jmetest.util;

import com.jme.scene.Node;
import com.jme.scene.Spatial;
import com.jme.scene.TriMesh;
import com.jme.system.DisplaySystem;

public class Sizeof {
   public static void main(String[] args) throws Exception {
       // Warm up all classes/methods we will use
       runGC();
       usedMemory();

       // Array to keep strong references to allocated objects
       final int count = 100000;
       Object[] objects = new Object[count];

       long heap1 = 0;
       DisplaySystem display = DisplaySystem.getDisplaySystem("LWJGL");
       display.createWindow(800, 600, 32, 60, false);
       // Allocate count+1 objects, discard the first one
       for (int i = -1; i < count; ++i) {
           Object object = null;

           // ### Instantiate your data here and assign it to object
           object = new Node();
           // ###

           if (i >= 0)
               objects[i] = object;
           else {
               object = null; // Discard the warm up object
               runGC();
               heap1 = usedMemory(); // Take a before heap snapshot
           }
       }

       runGC();
       long heap2 = usedMemory(); // Take an after heap snapshot:

       final int size = Math.round(((float)(heap2 - heap1)) / count);
       System.out.println("'before' heap: " + heap1 + ", 'after' heap: " + heap2);
       System.out.println("heap delta: " + (heap2 - heap1) + ", {" + objects[0].getClass()
               + "} size = " + size + " bytes");

       for (int i = 0; i < count; ++i)
           objects[i] = null;
       objects = null;
       display.close();
       System.exit(0);
   }

   private static void runGC() throws Exception {
       // It helps to call Runtime.gc()
       // using several method calls:
       for (int r = 0; r < 4; ++r)
           _runGC();
   }

   private static void _runGC() throws Exception {
       long usedMem1 = usedMemory(), usedMem2 = Long.MAX_VALUE;
       for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++i) {
           s_runtime.runFinalization();
           s_runtime.gc();
           Thread.yield();

           usedMem2 = usedMem1;
           usedMem1 = usedMemory();
       }
   }

   private static long usedMemory() {
       return s_runtime.totalMemory() - s_runtime.freeMemory();
   }

   private static final Runtime s_runtime = Runtime.getRuntime();

}
Test to determne the size of certain objects.
Test to determne the size of certain objects.


git-svn-id: 5afc437a751a4ff2ced778146f5faadda0b504ab@2249 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
