]> source.dussan.org Git - javassist.git/commitdiff
for reducing memory footprint
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Tue, 3 Jul 2007 15:31:19 +0000 (15:31 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Tue, 3 Jul 2007 15:31:19 +0000 (15:31 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@393 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

src/main/javassist/ClassPool.java
src/main/javassist/CtClass.java
src/main/javassist/CtClassType.java

index d97d24d1b4907d4f440bd0ede278bd60a6b82499..e7e209a9a3216af01cbeb82a872004a57484fa22 100644 (file)
@@ -29,6 +29,7 @@ import java.security.ProtectionDomain;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.ArrayList;
+import java.util.Enumeration;
 import javassist.bytecode.Descriptor;
 
 /**
@@ -119,6 +120,9 @@ public class ClassPool {
      */
     public static boolean doPruning = false;
 
+    private int compressCount;
+    private static final int COMPRESS_THRESHOLD = 100;
+
     /* releaseUnmodifiedClassFile was introduced for avoiding a bug
        of JBoss AOP.  So the value should be true except for JBoss AOP.
      */
@@ -184,6 +188,7 @@ public class ClassPool {
         }
 
         this.cflow = null;
+        this.compressCount = 0;
         clearImportedPackages();
     }
 
@@ -262,6 +267,19 @@ public class ClassPool {
         return source.toString();
     }
 
+    /**
+     * This method is periodically invoked so that memory
+     * footprint will be minimized.
+     */
+    void compress() {
+        if (compressCount++ > COMPRESS_THRESHOLD) {
+            compressCount = 0;
+            Enumeration e = classes.elements();
+            while (e.hasMoreElements())
+                ((CtClass)e.nextElement()).compress();
+        }
+    }
+
     /**
      * Record a package name so that the Javassist compiler searches
      * the package to resolve a class name.
@@ -607,6 +625,7 @@ public class ClassPool {
     public CtClass makeClass(InputStream classfile, boolean ifNotFrozen)
         throws IOException, RuntimeException
     {
+        compress();
         classfile = new BufferedInputStream(classfile);
         CtClass clazz = new CtClassType(classfile, this);
         clazz.checkModify();
index 48a8ca21b6b302e47fe72335d60a1f07d2d32be5..42ae504007e36ce461be2f18f4a56f42d87259b2 100644 (file)
@@ -1330,4 +1330,9 @@ public abstract class CtClass {
     public String makeUniqueName(String prefix) {
         throw new RuntimeException("not available in " + getName());
     }
+
+    /* Invoked from ClassPool#compress().
+     * This method is overridden by CtClassType.
+     */
+    void compress() {}
 }
index f3106b9e0b9ba2d1dec987cb8ec06b4f5fc47232..859b3af35e8bda2acc572e96167bd4cbcefac884 100644 (file)
@@ -25,7 +25,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 import java.util.ArrayList;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
@@ -73,10 +72,8 @@ class CtClassType extends CtClass {
     private int uniqueNumberSeed;
 
     private boolean doPruning = ClassPool.doPruning;
-    int getCounter;
-    private static int readCounter = 0;
-    private static final int READ_THRESHOLD = 100;  // see getClassFile2()
-    private static final int GET_THRESHOLD = 2;     // see releaseClassFiles()
+    private int getCount;
+    private static final int GET_THRESHOLD = 2;     // see compress()
 
     CtClassType(String name, ClassPool cp) {
         super(name);
@@ -89,7 +86,7 @@ class CtClassType extends CtClass {
         fieldInitializers = null;
         hiddenMethods = null;
         uniqueNumberSeed = 0;
-        getCounter = 0;
+        getCount = 0;
     }
 
     CtClassType(InputStream ins, ClassPool cp) throws IOException {
@@ -169,17 +166,13 @@ class CtClassType extends CtClass {
         if (cfile != null)
             return cfile;
 
-        if (readCounter++ > READ_THRESHOLD) {
-            releaseClassFiles();
-            readCounter = 0;
-        }
-
+        classPool.compress();
         if (rawClassfile != null) {
             try {
                 classfile = new ClassFile(new DataInputStream(
                                             new ByteArrayInputStream(rawClassfile)));
                 rawClassfile = null;
-                getCounter = GET_THRESHOLD;
+                getCount = GET_THRESHOLD;
                 return classfile;
             }
             catch (IOException e) {
@@ -218,11 +211,33 @@ class CtClassType extends CtClass {
         }
     }
 
-    /**
+   /* Inherited from CtClass.  Called by get() in ClassPool.
+    *
+    * @see javassist.CtClass#incGetCounter()
+    * @see #toBytecode(DataOutputStream)
+    */
+   final void incGetCounter() { ++getCount; }
+
+   /**
+    * Invoked from ClassPool#compress().
+    * It releases the class files that have not been recently used
+    * if they are unmodified. 
+    */
+   void compress() {
+       if (getCount < GET_THRESHOLD)
+           if (!isModified() && ClassPool.releaseUnmodifiedClassFile)
+               removeClassFile();
+           else if (isFrozen() && !wasPruned)
+               saveClassFile();
+
+       getCount = 0;
+   }
+
+   /**
      * Converts a ClassFile object into a byte array
      * for saving memory space.
      */
-    public synchronized void saveClassFile() {
+    private synchronized void saveClassFile() {
         /* getMembers() and releaseClassFile() are also synchronized.
          */
         if (classfile == null || hasMemberCache() != null)
@@ -239,40 +254,11 @@ class CtClassType extends CtClass {
         catch (IOException e) {}
     }
 
-    public synchronized void releaseClassFile() {
+    private synchronized void removeClassFile() {
         if (classfile != null && !isModified() && hasMemberCache() == null)
             classfile = null;
     }
 
-    /* Inherited from CtClass.  Called by get() in ClassPool.
-     *
-     * @see javassist.CtClass#incGetCounter()
-     * @see #toBytecode(DataOutputStream)
-     */
-    void incGetCounter() { ++getCounter; }
-
-    /**
-     * Releases the class files
-     * of the CtClasses that have not been recently used
-     * if they are unmodified. 
-     */
-    public void releaseClassFiles() {
-        Enumeration e = classPool.classes.elements();
-        while (e.hasMoreElements()) {
-            Object obj = e.nextElement();
-            if (obj instanceof CtClassType) {
-                CtClassType cct = (CtClassType)obj;
-                if (cct.getCounter < GET_THRESHOLD)
-                    if (!cct.isModified() && ClassPool.releaseUnmodifiedClassFile)
-                        cct.releaseClassFile();
-                    else if (cct.isFrozen() && !cct.wasPruned)
-                        cct.saveClassFile();
-
-                cct.getCounter = 0;
-            }
-        }
-    }
-
     public ClassPool getClassPool() { return classPool; }
 
     void setClassPool(ClassPool cp) { classPool = cp; }
@@ -1344,7 +1330,7 @@ class CtClassType extends CtClass {
                 // classfile = null;
             }
 
-            getCounter = 0;
+            getCount = 0;
             wasFrozen = true;
         }
         catch (NotFoundException e) {