You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ha...@apache.org on 2002/03/31 23:24:29 UTC

cvs commit: jakarta-commons-sandbox/altrmi/src/java/org/apache/commons/altrmi/test MemoryLeakClientTest.java MemoryLeakImpl.java TestInterfaceImpl.java

hammant     02/03/31 13:24:29

  Modified:    altrmi/src/java/org/apache/commons/altrmi/server
                        MethodInvocationHandler.java
               altrmi/src/java/org/apache/commons/altrmi/server/impl
                        DefaultMethodInvocationHandler.java
               altrmi/src/java/org/apache/commons/altrmi/server/impl/adapters
                        InvocationHandlerAdapter.java
                        PublicationAdapter.java
               altrmi/src/java/org/apache/commons/altrmi/test
                        MemoryLeakClientTest.java MemoryLeakImpl.java
                        TestInterfaceImpl.java
  Added:       altrmi/src/java/org/apache/commons/altrmi/server/impl
                        AltrmiSession.java
  Log:
  Distributed Garbage Collection is working ... but still leaking a little memory.
  
  Revision  Changes    Path
  1.3       +15 -15    jakarta-commons-sandbox/altrmi/src/java/org/apache/commons/altrmi/server/MethodInvocationHandler.java
  
  Index: MethodInvocationHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/altrmi/src/java/org/apache/commons/altrmi/server/MethodInvocationHandler.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- MethodInvocationHandler.java	30 Mar 2002 08:55:45 -0000	1.2
  +++ MethodInvocationHandler.java	31 Mar 2002 21:24:28 -0000	1.3
  @@ -8,9 +8,8 @@
    */
   package org.apache.commons.altrmi.server;
   
  -
  -
  -import org.apache.commons.altrmi.common.AltrmiInvocationHandler;
  +import org.apache.commons.altrmi.common.AltrmiReply;
  +import org.apache.commons.altrmi.common.MethodRequest;
   
   
   /**
  @@ -18,9 +17,20 @@
    *
    *
    * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
  - * @version $Revision: 1.2 $
  + * @version $Revision: 1.3 $
    */
  -public interface MethodInvocationHandler extends AltrmiInvocationHandler {
  +public interface MethodInvocationHandler {
  +
  +    /**
  +     * Method handleMethodInvocation
  +     *
  +     *
  +     * @param request
  +     *
  +     * @return
  +     *
  +     */
  +    AltrmiReply handleMethodInvocation(MethodRequest request);
   
       /**
        * Method addImplementationBean
  @@ -50,14 +60,4 @@
        *
        */
       Long getOrMakeReferenceIDForBean(Object implBean);
  -
  -    /**
  -     * Method garbageCollectionRequest
  -     *
  -     *
  -     * @param sessionID
  -     * @param refereinceID
  -     *
  -     */
  -    void garbageCollectionRequest(Long sessionID, Long refereinceID);
   }
  
  
  
  1.7       +33 -32    jakarta-commons-sandbox/altrmi/src/java/org/apache/commons/altrmi/server/impl/DefaultMethodInvocationHandler.java
  
  Index: DefaultMethodInvocationHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/altrmi/src/java/org/apache/commons/altrmi/server/impl/DefaultMethodInvocationHandler.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- DefaultMethodInvocationHandler.java	30 Mar 2002 08:55:45 -0000	1.6
  +++ DefaultMethodInvocationHandler.java	31 Mar 2002 21:24:28 -0000	1.7
  @@ -26,9 +26,11 @@
   import java.util.HashMap;
   import java.util.Iterator;
   import java.util.Collection;
  +import java.util.WeakHashMap;
   
   import java.lang.reflect.Method;
   import java.lang.reflect.InvocationTargetException;
  +import java.lang.ref.WeakReference;
   
   import java.io.Serializable;
   
  @@ -39,16 +41,17 @@
    *
    * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
    * @author Vinay Chandrasekharan <a href="mailto:vinay_chandran@users.sourceforge.net">vinay_chandran@users.sourceforge.net</a>
  - * @version $Revision: 1.6 $
  + * @version $Revision: 1.7 $
    */
   public class DefaultMethodInvocationHandler implements MethodInvocationHandler {
   
  -    private HashMap mRefBeans = new HashMap();
  -    private HashMap mBeanRefs = new HashMap();
  +    private WeakHashMap mRefBeans = new WeakHashMap();
  +    private WeakHashMap mBeanRefs = new WeakHashMap();
       private HashMap mMethodMap;
       private static int NEXT_REFERENCE = 1;
       private AltrmiPublisher mAltrmiPublisher;
       private String mPublishedThing;
  +    private Object mBeanImpl;
   
       /**
        * Constructor DefaultMethodInvocationHandler
  @@ -76,7 +79,7 @@
        *
        */
       public String toString() {
  -        return "DIH:" + mPublishedThing;
  +        return "DMIH:" + mPublishedThing;
       }
   
       /**
  @@ -88,7 +91,11 @@
        *
        */
       public void addImplementationBean(Long referenceID, Object beanImpl) {
  -        mRefBeans.put(referenceID, beanImpl);
  +        if (referenceID.equals(new Long(0))) {
  +            mBeanImpl = beanImpl;
  +        }
  +        WeakReference wr = new WeakReference(beanImpl);
  +        mRefBeans.put(referenceID, new WeakReference(beanImpl));
           mBeanRefs.put(beanImpl, referenceID);
       }
   
  @@ -102,17 +109,17 @@
        */
       public void replaceImplementationBean(Object implBean, Object withImplBean) {
   
  -        Collection coll = mRefBeans.keySet();
  +        Long ref = (Long) mBeanRefs.get(implBean);
   
  -        for (Iterator iterator = coll.iterator(); iterator.hasNext(); ) {
  -            Long ref = (Long) iterator.next();
  +        mRefBeans.put(ref, new WeakReference(withImplBean));
  +        mBeanRefs.remove(implBean);
  +        mBeanRefs.put(withImplBean, ref);
   
  -            if (mRefBeans.get(ref).equals(implBean)) {
  -                mRefBeans.put(ref, withImplBean);
  -                mBeanRefs.remove(implBean);
  -                mBeanRefs.put(withImplBean, ref);
  -            }
  +        if (mBeanImpl == implBean) {
  +            mBeanImpl = withImplBean;
           }
  +
  +
       }
   
       /**
  @@ -141,7 +148,7 @@
       }
   
       /**
  -     * Method handleInvocation
  +     * Method handleMethodInvocation
        *
        *
        * @param request
  @@ -149,10 +156,9 @@
        * @return
        *
        */
  -    public AltrmiReply handleInvocation(AltrmiRequest request) {
  +    public AltrmiReply handleMethodInvocation(MethodRequest request) {
   
  -        MethodRequest mr = (MethodRequest) request;
  -        String methodSignature = mr.getMethodSignature();
  +        String methodSignature = request.getMethodSignature();
   
           if (!mMethodMap.containsKey(methodSignature)) {
               return new ExceptionReply(
  @@ -160,24 +166,22 @@
           }
   
           Method method = (Method) mMethodMap.get(methodSignature);
  -        Object rv = null;
   
           try {
  -            Object beanImpl = mRefBeans.get(mr.getReferenceID());
  +            WeakReference wr = (WeakReference) mRefBeans.get(request.getReferenceID());
  +            Object beanImpl = wr.get();
   
               if (beanImpl == null) {
  -                System.out.println("Missin for " + mr.getReferenceID());
  +                System.out.println("Missin for " + request.getReferenceID());
   
  -                return new NoSuchReferenceReply(mr.getReferenceID());
  +                return new NoSuchReferenceReply(request.getReferenceID());
               }
   
  -            Object[] args = mr.getArgs();
  -
  -            correctArgs(mr, args);
  +            Object[] args = request.getArgs();
   
  -            Object replyVal = method.invoke(beanImpl, mr.getArgs());
  +            correctArgs(request, args);
   
  -            return new MethodReply(replyVal);
  +            return new MethodReply(method.invoke(beanImpl, request.getArgs()));
           } catch (InvocationTargetException ite) {
               Throwable t = ite.getTargetException();
   
  @@ -200,10 +204,6 @@
           }
       }
   
  -    public void garbageCollectionRequest(Long sessionID, Long refereinceID) {
  -        //TODO
  -    }
  -
       private void correctArgs(MethodRequest mr, Object[] args) {
   
           for (int i = 0; i < args.length; i++) {
  @@ -211,11 +211,12 @@
               // TODO find a faster way to do this....
               if (args[i] instanceof FacadeRefHolder) {
                   FacadeRefHolder frh = (FacadeRefHolder) args[i];
  -                DefaultMethodInvocationHandler asih =
  +                DefaultMethodInvocationHandler methodInvocationHandler =
                       (DefaultMethodInvocationHandler) mAltrmiPublisher
                           .getMethodInvocationHandler(frh.getObjectName());
   
  -                args[i] = asih.mRefBeans.get(frh.getReferenceID());
  +                WeakReference wr = (WeakReference) methodInvocationHandler.mRefBeans.get(frh.getReferenceID());
  +                args[i] = wr.get();
               }
           }
       }
  
  
  
  1.1                  jakarta-commons-sandbox/altrmi/src/java/org/apache/commons/altrmi/server/impl/AltrmiSession.java
  
  Index: AltrmiSession.java
  ===================================================================
  
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.commons.altrmi.server.impl;
  
  
  
  import java.util.HashMap;
  
  
  /**
   * Class AltrmiSession
   *
   *
   * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
   * @version $Revision: 1.1 $
   */
  public class AltrmiSession {
  
      private Long mSession;
      private HashMap mBeansInUse = new HashMap();
  
      /**
       * Constructor AltrmiSession
       *
       *
       * @param session
       *
       */
      public AltrmiSession(Long session) {
          mSession = session;
      }
  
      /**
       * Method getSession
       *
       *
       * @return
       *
       */
      public Long getSession() {
          return mSession;
      }
  
      /**
       * Method addBeanInUse
       *
       *
       * @param referenceID
       * @param bean
       *
       */
      public void addBeanInUse(Long referenceID, Object bean) {
          mBeansInUse.put(referenceID, bean);
      }
  
      /**
       * Method removeBeanInUse
       *
       *
       * @param referenceID
       *
       */
      public void removeBeanInUse(Long referenceID) {
          mBeansInUse.remove(referenceID);
      }
  }
  
  
  
  1.7       +20 -9     jakarta-commons-sandbox/altrmi/src/java/org/apache/commons/altrmi/server/impl/adapters/InvocationHandlerAdapter.java
  
  Index: InvocationHandlerAdapter.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/altrmi/src/java/org/apache/commons/altrmi/server/impl/adapters/InvocationHandlerAdapter.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- InvocationHandlerAdapter.java	30 Mar 2002 08:55:45 -0000	1.6
  +++ InvocationHandlerAdapter.java	31 Mar 2002 21:24:28 -0000	1.7
  @@ -42,9 +42,11 @@
   import org.apache.commons.altrmi.server.impl.classretrievers.NoClassRetriever;
   import org.apache.commons.altrmi.server.impl.DefaultAuthenticator;
   import org.apache.commons.altrmi.server.impl.AbstractServer;
  +import org.apache.commons.altrmi.server.impl.AltrmiSession;
   
   import java.util.Vector;
   import java.util.Iterator;
  +import java.util.HashMap;
   
   
   /**
  @@ -52,14 +54,14 @@
    *
    *
    * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
  - * @version $Revision: 1.6 $
  + * @version $Revision: 1.7 $
    */
   public class InvocationHandlerAdapter extends PublicationAdapter
           implements AltrmiInvocationHandler {
   
       private static int SESSION = 0;
       private Long mLastSession = new Long(0);
  -    private Vector mSessions = new Vector();
  +    private HashMap mSessions = new HashMap();
       private boolean mSuspend = false;
       private ClassRetriever mClassRetriever = new NoClassRetriever();
       private AltrmiAuthenticator mAltrmiAuthenticator = new DefaultAuthenticator();
  @@ -111,10 +113,10 @@
                   return new NotPublishedReply();
               }
   
  -            AltrmiInvocationHandler ih =
  -                (AltrmiInvocationHandler) mPublishedObjects.get(publishedThing);
  +            MethodInvocationHandler methodInvocationHandler =
  +                (MethodInvocationHandler) mPublishedObjects.get(publishedThing);
   
  -            return ih.handleInvocation(mReq);
  +            return methodInvocationHandler.handleMethodInvocation(mReq);
           } else if (request.getRequestCode() == AltrmiRequest.METHODFACADEREQUEST) {
               MethodFacadeRequest mFacReq = (MethodFacadeRequest) request;
               String publishedThing = mFacReq.getPublishedServiceName() + "_" + mFacReq.getObjectName();
  @@ -130,7 +132,7 @@
   
               MethodInvocationHandler methodInvocationHandler =
                   (MethodInvocationHandler) mPublishedObjects.get(publishedThing);
  -            AltrmiReply ar = methodInvocationHandler.handleInvocation(mFacReq);
  +            AltrmiReply ar = methodInvocationHandler.handleMethodInvocation(mFacReq);
   
               if (ar.getReplyCode() == AltrmiReply.EXCEPTIONREPLY) {
                   return ar;
  @@ -163,6 +165,9 @@
   
                   //TODO a decent ref number for main?
                   Long newRef = methodInvocationHandler2.getOrMakeReferenceIDForBean(beanImpl);
  +                // make sure the bean is not garbage collected.
  +                AltrmiSession sess = (AltrmiSession) mSessions.get(mFacReq.getSession());
  +                sess.addBeanInUse(newRef, beanImpl);
   
                   //long newRef2 = asih2.getOrMakeReferenceIDForBean(beanImpl);
                   return new MethodFacadeReply(newRef);
  @@ -189,6 +194,9 @@
                           refs[i] = null;
                       } else {
                           refs[i] = methodInvocationHandler2.getOrMakeReferenceIDForBean(beanImpls[i]);
  +
  +                        AltrmiSession sess = (AltrmiSession) mSessions.get(mFacReq.getSession());
  +                        sess.addBeanInUse(refs[i], beanImpls[i]);
                       }
   
                   }
  @@ -207,9 +215,12 @@
                       new AltrmiInvocationException("TODO - you dirty rat/hacker"));
               }
   
  +            AltrmiSession sess = (AltrmiSession) mSessions.get(gcr.getSession());
  +            sess.removeBeanInUse(gcr.getReferenceID());
  +
               MethodInvocationHandler methodInvocationHandler =
                   (MethodInvocationHandler) mPublishedObjects.get(publishedThing);
  -            methodInvocationHandler.garbageCollectionRequest(gcr.getSession(), gcr.getReferenceID());
  +
               return new GarbageCollectionReply();
           } else if (request.getRequestCode() == AltrmiRequest.LOOKUPREQUEST) {
               LookupRequest lr = (LookupRequest) request;
  @@ -237,7 +248,7 @@
           } else if (request.getRequestCode() == AltrmiRequest.OPENCONNECTIONREQUEST) {
               Long session = getNewSession();
   
  -            mSessions.add(session);
  +            mSessions.put(session, new AltrmiSession(session));
   
               return new OpenConnectionReply(mAltrmiAuthenticator.getTextToSign(), session);
           } else if (request.getRequestCode() == AltrmiRequest.PINGREQUEST) {
  @@ -276,7 +287,7 @@
               // buffer last session for performance.
               return true;
           } else {
  -            if (mSessions.contains(session)) {
  +            if (mSessions.containsKey(session)) {
                   mLastSession = session;
   
                   return true;
  
  
  
  1.6       +4 -4      jakarta-commons-sandbox/altrmi/src/java/org/apache/commons/altrmi/server/impl/adapters/PublicationAdapter.java
  
  Index: PublicationAdapter.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/altrmi/src/java/org/apache/commons/altrmi/server/impl/adapters/PublicationAdapter.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- PublicationAdapter.java	30 Mar 2002 08:55:45 -0000	1.5
  +++ PublicationAdapter.java	31 Mar 2002 21:24:28 -0000	1.6
  @@ -28,7 +28,7 @@
    *
    *
    * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
  - * @version $Revision: 1.5 $
  + * @version $Revision: 1.6 $
    */
   public class PublicationAdapter extends AbstractMethodHandler implements AltrmiPublisher {
   
  @@ -79,10 +79,10 @@
   
           // add method maps for main lookup-able service.
           HashMap mainMethodMap = new HashMap();
  -        MethodInvocationHandler mainAsih = new DefaultMethodInvocationHandler(this,
  +        MethodInvocationHandler mainMethodInvocationHandler = new DefaultMethodInvocationHandler(this,
                                                  asName + "_Main", mainMethodMap);
   
  -        mainAsih.addImplementationBean(new Long(0), impl);
  +        mainMethodInvocationHandler.addImplementationBean(new Long(0), impl);
   
           for (int x = 0; x < interfacesToExpose.length; x++) {
               Method methods[] = interfacesToExpose[x].getMethods();
  @@ -98,7 +98,7 @@
           }
   
           // as the main service is lookup-able, it has a prexisting impl.
  -        mPublishedObjects.put(asName + "_Main", mainAsih);
  +        mPublishedObjects.put(asName + "_Main", mainMethodInvocationHandler);
   
           // add method maps for all the additional facades.
           for (int x = 0; x < additionalFacades.length; x++) {
  
  
  
  1.4       +5 -9      jakarta-commons-sandbox/altrmi/src/java/org/apache/commons/altrmi/test/MemoryLeakClientTest.java
  
  Index: MemoryLeakClientTest.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/altrmi/src/java/org/apache/commons/altrmi/test/MemoryLeakClientTest.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- MemoryLeakClientTest.java	28 Mar 2002 06:17:11 -0000	1.3
  +++ MemoryLeakClientTest.java	31 Mar 2002 21:24:29 -0000	1.4
  @@ -26,7 +26,7 @@
    *
    *
    * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
  - * @version $Revision: 1.3 $
  + * @version $Revision: 1.4 $
    */
   public class MemoryLeakClientTest {
   
  @@ -40,23 +40,19 @@
       public MemoryLeakClientTest(MemoryLeak ml) {
   
           long start = System.currentTimeMillis();
  -
           for (int i = 0; i < 100000000; i++) {
               MemoryLeak tmpMl = ml.getNewMemoryLeak();
  -            ml.getHugeString();
  +            ml.getHugeString(); // this does not seem to affect speed.
   
               System.gc(); // pointless ?
               if (i%100 == 0) {
  -                long end = System.currentTimeMillis();
                   System.out.println("Iter "
                           + i + ", "
  -                        + (end-start) / 1000
  -                        + " seconds, Tot Mem :"
  -                        + Runtime.getRuntime().totalMemory()
  -                        + ", Free Mem :"
  +                        + ( System.currentTimeMillis() - start) / 1000
  +                        + " seconds, Free Mem :"
                           + Runtime.getRuntime().freeMemory()
                   );
  -                end = start;
  +                start = System.currentTimeMillis();
               }
           }
       }
  
  
  
  1.3       +7 -1      jakarta-commons-sandbox/altrmi/src/java/org/apache/commons/altrmi/test/MemoryLeakImpl.java
  
  Index: MemoryLeakImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/altrmi/src/java/org/apache/commons/altrmi/test/MemoryLeakImpl.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- MemoryLeakImpl.java	27 Mar 2002 20:54:55 -0000	1.2
  +++ MemoryLeakImpl.java	31 Mar 2002 21:24:29 -0000	1.3
  @@ -15,7 +15,7 @@
    *
    *
    * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
  - * @version $Revision: 1.2 $
  + * @version $Revision: 1.3 $
    */
   public class MemoryLeakImpl implements MemoryLeak {
   
  @@ -61,4 +61,10 @@
       public String getHugeString() {
           return mHugeStr;
       }
  +
  +    protected void finalize() throws Throwable {
  +        super.finalize();
  +        //System.out.println("impl finalized");
  +    }
  +
   }
  
  
  
  1.5       +6 -1      jakarta-commons-sandbox/altrmi/src/java/org/apache/commons/altrmi/test/TestInterfaceImpl.java
  
  Index: TestInterfaceImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/altrmi/src/java/org/apache/commons/altrmi/test/TestInterfaceImpl.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- TestInterfaceImpl.java	6 Mar 2002 12:52:07 -0000	1.4
  +++ TestInterfaceImpl.java	31 Mar 2002 21:24:29 -0000	1.5
  @@ -22,7 +22,7 @@
    *
    *
    * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
  - * @version $Revision: 1.4 $
  + * @version $Revision: 1.5 $
    */
   public class TestInterfaceImpl implements TestInterface {
   
  @@ -239,5 +239,10 @@
           mTestObjects[0] = new TestObject("aAa");
           mTestObjects[1] = new TestObject("bBb");
           mTestObjects[2] = new TestObject("cCc");
  +    }
  +
  +    protected void finalize() throws Throwable {
  +        super.finalize();
  +        System.out.println("impl finalized");
       }
   }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>