[prev in list] [next in list] [prev in thread] [next in thread] 

List:       jboss-user
Subject:    [JBoss-user] [JBossCache] - JBossCacheAop Memory leak ?
From:       ctof <do-not-reply () jboss ! com>
Date:       2005-09-30 13:40:42
Message-ID: 759511.1128087642269.JavaMail.jboss () colo-br-02 ! atl ! jboss ! com
[Download RAW message or body]

Hi, 
Before using JBossCache in a production environnement, i try to test performance and \
memory stability

You can find below an example where a publisher send asap a number of the same object \
and a subscriber which read asp the data (with cache notification)

* First the CPU is always full (all is right, the publisher send  data in a \
while(true) loop) ... but maybe it means the marshaling/unmarshaling have a certainly \
impact on the CP occupation.

* Second, the memory is very stable for the sender but for receiver, the memory \
always grow up ... and a force gc doesn't change nothing.


* the number of created thread (not live) is really incredibale > 2000 after sending \
400000 msg

I have test with different Jgroup config (from JGroups conf example) without succes. 

I run this sample under windows XP(pack 2) whith JVM 1.5.0_03 with a Xmx128m.
I monitor the JVM with JConsole.
I start both processes (publisher and subscriber) on the same machine (Dual xeon)
When the max memory is riched (arround 128m), i have no out of memory exception but \
the publisher and subscriber are suspended (they do nothing).

Any help is welcome, this memory pb is a bottleneck to use JBossCache into my \
company.

Christophe


Listing 1: SubscriberTest.java 
import javax.swing.JLabel;
  | import javax.swing.JPanel;
  | 
  | import org.jboss.cache.CacheException;
  | import org.jboss.cache.Fqn;
  | import org.jboss.cache.PropertyConfigurator;
  | import org.jboss.cache.aop.TreeCacheAop;
  | import org.jdesktop.swingx.JXFrame;
  | 
  | import deai.ft.archi.poc.cache.CacheDataListener;
  | import deai.ft.archi.poc.cache.TreeCacheListenerAdapter;
  | 
  | public class SubscriberTest implements CacheDataListener
  | {
  |     static int cpt = 0;
  |     TreeCacheAop cache;
  |     long startTime = 0;
  |     static Fqn fqn = Fqn.fromString("/TEST/Instrument");
  |     public int msgReceived = 0;
  |     static JLabel info = new JLabel("Read ");
  |     static JLabel cptInfo= new JLabel("");
  |     TreeCacheListenerAdapter cacheAdapter;
  |     public SubscriberTest() throws Exception
  |     {
  |         super();
  |         cache = new TreeCacheAop();
  |         PropertyConfigurator config = new PropertyConfigurator();
  |         config.configure(cache, PublisherTest.CACHE_CFG);
  |         cache.startService();
  |         cacheAdapter = new TreeCacheListenerAdapter(cache);
  |         cacheAdapter.addDataListener(this);
  |     }
  | 
  |      public static void main(String[] args)
  |     {
  |         try
  |         {
  |             new SubscriberTest();
  |             JXFrame frame = new JXFrame("Test Read", true);
  |             JPanel pane = new JPanel();
  |             pane.add(info);
  |             pane.add(cptInfo);
  |             frame.setContentPane(pane);
  |             frame.pack();
  |             frame.setLocation(0, 100);
  |             frame.setVisible(true);
  |         }
  |         catch (Exception e)   {
  |              e.printStackTrace();
  |         }
  | 
  |     }
  | 
  |     public void dataModified(Fqn fqn, Object data)  {
  |         if (startTime == 0)
  |             startTime = System.currentTimeMillis();
  |         
  |         try
  |         {
  |             PublisherTest.instrument instr = \
(PublisherTest.instrument)cache.getObject(fqn);  |             \
System.out.println("receive: "+instr.Id);  |             if ((msgReceived % \
PublisherTest.NB_MSG_MOD) == 0)  |                 cptInfo.setText(""+msgReceived);
  | 
  |             msgReceived++;
  |         }
  |         catch (CacheException e)
  |         {
  |             e.printStackTrace();
  |         }
  |         if (msgReceived == PublisherTest.NB_MSG_TO_SEND)
  |         {
  |             long endTime = System.currentTimeMillis();
  |             double totalTime = (endTime - startTime);
  |             double avg = PublisherTest.NB_MSG_TO_SEND / totalTime * 1000;
  |             System.out.println("Total Read "+msgReceived+" msg, Time: \
"+totalTime+ " ms, avg msg/s read: "+avg);  |             \
cptInfo.setText(""+msgReceived);  |         }
  |     }
  | 
  |     public void dataRemoved(Fqn fqn, Object data) {}
  |     public void dataEvicted(Fqn fqn, Object data) {}
  | }
  | 
  | File: CacheDataListener.java
  | import org.jboss.cache.Fqn;
  | 
  | public interface CacheDataListener
  | {
  |     public void dataModified(Fqn fqn, Object data);
  |     public void dataRemoved(Fqn fqn, Object data);
  |     public void dataEvicted(Fqn fqn, Object data);
  | }
  | 
  | File: TreeCacheListenerAdapter.java
  | import java.util.concurrent.ConcurrentLinkedQueue;
  | 
  | import org.jboss.cache.CacheException;
  | import org.jboss.cache.Fqn;
  | import org.jboss.cache.TreeCache;
  | import org.jboss.cache.TreeCacheListener;
  | import org.jboss.cache.aop.AOPInstance;
  | import org.jboss.cache.aop.TreeCacheAop;
  | import org.jgroups.View;
  | 
  | public class TreeCacheListenerAdapter
  |     implements TreeCacheListener
  | {
  |     protected ConcurrentLinkedQueue<CacheDataListener> listenersData = new \
ConcurrentLinkedQueue<CacheDataListener>();  |     TreeCacheAop cache;
  |     
  |     /**
  |      * 
  |      */
  |     public TreeCacheListenerAdapter(TreeCacheAop cache)
  |     {
  |         super();
  |         this.cache = cache;
  |         cache.addTreeCacheListener(this);
  |     }
  | 
  |     public void addDataListener(CacheDataListener listener)
  |     {
  |         if (!listenersData.contains(listener))
  |             listenersData.add(listener);
  |     }
  |     
  |     public void removeDataListener(CacheDataListener listener)
  |     {
  |         listenersData.remove(listener);
  |     }
  |     
  |      public void nodeCreated(Fqn fqn) { }
  |      public void nodeRemoved(Fqn fqn)  {
  |         notifyDataRemoved(fqn, null);
  |     }
  | 
  |   public void nodeLoaded(Fqn fqn)    {  }
  | 
  |     public void nodeEvicted(Fqn fqn)
  |     {    notifyDataEvicted(fqn, null);  }
  | 
  |  
  |     public void nodeModified(Fqn fqn)
  |     {
  |         try
  |         {
  |             notifyDataModified(fqn, cache.getObject(fqn));
  |         }
  |         catch (CacheException e)
  |         {
  |             // TODO Auto-generated catch block
  |             e.printStackTrace();
  |         }
  |     }
  | 
  |     public void nodeVisited(Fqn fqn)  {  }
  | 
  |      public void cacheStarted(TreeCache cache)   {  }
  | 
  |      public void cacheStopped(TreeCache cache)  {  }
  | 
  |       public void viewChange(View new_view)   {  }
  |     
  |     public void notifyDataModified(Fqn fqn, Object data) {
  |         if (data != null)
  |             if ((data instanceof Class) || (data instanceof AOPInstance) || (data \
instanceof String && data.equals(TreeCacheAop.DUMMY)))   |                 //&& \
((AOPInstance) data).get() == null))  |                 return;
  |             else
  |                 for(CacheDataListener listener : listenersData)
  |                     listener.dataModified(fqn, data);
  |         }
  |     
  |     public void notifyDataRemoved(Fqn fqn, Object data) 
  |     {
  |         for(CacheDataListener listener : listenersData)
  |             listener.dataRemoved(fqn, data);
  |         }
  |     
  |     public void notifyDataEvicted(Fqn fqn, Object data) 
  |     {
  |         for(CacheDataListener listener : listenersData)
  |             listener.dataEvicted(fqn, data);
  |         }
  | 
  | }
  | 

Listing 2: PublisherTest.java
import java.io.Serializable;
  | 
  | import javax.swing.JLabel;
  | import javax.swing.JPanel;
  | 
  | import org.jboss.cache.CacheException;
  | import org.jboss.cache.Fqn;
  | import org.jboss.cache.PropertyConfigurator;
  | import org.jboss.cache.aop.TreeCacheAop;
  | import org.jdesktop.swingx.JXFrame;
  | 
  | public class PublisherTest
  | {
  |     static int cpt = 0;
  |     public static long NB_MSG_TO_SEND = 100000;
  |     public static long NB_MSG_MOD = 100;
  |     /**
  |      * 
  |      */
  |     static JLabel info = new JLabel("Send ");
  |     static JLabel cptInfo= new JLabel("");
  |     static String CACHE_CFG = fast-service-nothread-test.xml";
  | 
  |      public static class instrument implements Serializable {
  |          long Id;
  |          String label;
  |          double price;
  |          String desc;
  |          int foo;
  |          float bar;
  |         public instrument(long id, float bar, String desc, int foo, String label, \
double price)  |         {
  |             super();
  |             // TODO Auto-generated constructor stub
  |             this.bar = bar;
  |             this.desc = desc;
  |             this.foo = foo;
  |             Id = id;
  |             this.label = label;
  |             this.price = price;
  |         }
  |          
  |      }
  |    
  |     private static void benchSendMsg(TreeCacheAop cache) throws CacheException
  |     {
  |         System.out.println("Start Send Bench");
  |         Fqn fqn = Fqn.fromString("/TEST/Instrument");
  |         long startTime = System.currentTimeMillis();
  |         for (long i = 0 ; i < NB_MSG_TO_SEND ; i++)
  |         {
  |             cache.putObject(fqn, new instrument(i, (float)(i*0.5), "aaa", (int)i, \
"aaaa", (double)i*2));  |             if ((i % NB_MSG_MOD) == 0)
  |                 cptInfo.setText(""+i);
  |             if ((i % 1000) == 0)
  |                 try
  |                 {
  |                     Thread.sleep(2000);
  |                 }
  |                 catch (InterruptedException e)
  |                 {
  |                     // TODO Auto-generated catch block
  |                     e.printStackTrace();
  |                 }
  | 
  |         }
  |         cptInfo.setText(""+NB_MSG_TO_SEND);
  |         long endTime = System.currentTimeMillis();
  |         double totalTime = (endTime - startTime);
  |         double avg = NB_MSG_TO_SEND / totalTime * 1000;
  |         System.out.println("Total Send "+NB_MSG_TO_SEND+"ms Time: "+totalTime+ " \
avg msg/s send: "+avg);  |     }
  |     
  |     /**
  |      * @param args
  |      */
  |     public static void main(String[] args)
  |     {
  |         TreeCacheAop dataCache;
  |         JXFrame frame = new JXFrame("Test Send", true);
  |         JPanel pane = new JPanel();
  |         pane.add(info);
  |         pane.add(cptInfo);
  |         frame.setContentPane(pane);
  |         frame.pack();
  |         frame.setVisible(true);
  | 
  |         try
  |         {
  |             dataCache = new TreeCacheAop();
  |             PropertyConfigurator config = new PropertyConfigurator();
  |             config.configure(dataCache, CACHE_CFG);
  |             dataCache.startService();
  |             
  |             benchSendMsg(dataCache);
  |         }
  |         catch (Exception e)
  |         {
  |             // TODO Auto-generated catch block
  |             e.printStackTrace();
  |         }
  |     }
  | }
  | 


Config-file


View the original post : \
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3898245#3898245

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3898245



-------------------------------------------------------
This SF.Net email is sponsored by:
Power Architecture Resource Center: Free content, downloads, discussions,
and more. http://solutions.newsforge.com/ibmarch.tmpl
_______________________________________________
JBoss-user mailing list
JBoss-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jboss-user


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic