[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