[jboss-user] [JBossCache] - Excesive number of Timers

jorgemoralespou_2 do-not-reply at jboss.com
Mon Jul 2 05:36:43 EDT 2007


Hi,
I have JBC 1.4.1.SP3 in a JBossAS 4.2.0. 
Cache configuration is this:

  | <?xml version="1.0" encoding="UTF-8"?>
  | <server>
  |     <classpath codebase="./lib" archives="jboss-cache.jar, jgroups.jar"/>
  |   <mbean code="org.jboss.cache.TreeCache"
  |         name="jboss.cache:service=ServicesCache">
  |         <depends>jboss:service=Naming</depends>
  |         <depends>jboss:service=TransactionManager</depends>
  |         <attribute name="TransactionManagerLookupClass">org.jboss.cache.JBossTransactionManagerLookup</attribute>
  |         <attribute name="IsolationLevel">NONE</attribute>
  |         <attribute name="CacheMode">REPL_SYNC</attribute>
  |         <attribute name="UseReplQueue">false</attribute>
  |         <attribute name="ReplQueueInterval">0</attribute>
  |         <attribute name="ReplQueueMaxElements">0</attribute>
  |         <attribute name="ClusterName">ServicesCache-Cluster</attribute>
  |         <attribute name="ClusterConfig">
  |             <config>
  |                 .... jgroups config .....
  |             </config>
  |         </attribute>
  |         <attribute name="FetchInMemoryState">true</attribute>
  |         <attribute name="InitialStateRetrievalTimeout">15000</attribute>
  |         <attribute name="SyncReplTimeout">15000</attribute>
  |         <attribute name="LockAcquisitionTimeout">10000</attribute>
  | 
  |       <attribute name="EvictionPolicyClass">org.jboss.cache.eviction.LRUPolicy</attribute>
  |        <attribute name="EvictionPolicyConfig">
  |            <config>
  |              <attribute name="wakeUpIntervalSeconds">5</attribute>
  |               <region name="/_default_">
  |                     <attribute name="maxNodes">500000</attribute>
  |                     <attribute name="timeToLiveSeconds">86400</attribute>
  |               </region>
  |            </config>
  |         </attribute>
  |         <attribute name="UseRegionBasedMarshalling">true</attribute>
  |         <attribute name="InactiveOnStartup">true</attribute>
  |        </mbean>
  | </server>
  | 

Later, in our application, through code we set different eviction policies for different regions, in order to keep a rational cache size ratio.

We do this to activate regions of the cache, as we deploy services that use these regions:

  | 	public void activateRegion(String strFqn) {
  | 		try {
  | 			RegionManager regionManager = getServiceCacheInstance()
  | 					.getRegionManager();
  | 
  | 			if (regionManager.getRegion(strFqn) == null
  | 					|| !regionManager.getRegion(strFqn).isActive()) {
  | 				getServiceCacheInstance().registerClassLoader(strFqn,
  | 						Thread.currentThread().getContextClassLoader());
  | 				getServiceCacheInstance().activateRegion(strFqn);
  | 				log.warn("Activating synchronization of region " + strFqn);
  | 			}
  | 
  | 		} catch (RegionNameConflictException e) {
  | 			log.error("Activating region: " + strFqn, e);
  | 		} catch (CacheException e) {
  | 			log.error("Activating region: " + strFqn, e);
  | 		}
  | 	}
  | 
  | 

We also activate/deactivate different eviction policies for these regions. Like this:


  | 	public void activateEvictionPolicy(String strRegion, EvictionConfiguration config) {
  | 		if (strRegion != null || "".equals(strRegion)) {
  | 			RegionManager regionMgr = getServiceCacheInstance().getEvictionRegionManager();
  | 			Region region;
  | 			EvictionPolicy eviction = null;
  | 			try {
  | 					if (regionMgr.hasRegion(strRegion)) {
  | 						region = regionMgr.getRegion(strRegion);
  | 						region.setEvictionConfiguration(config);
  | 						log.warn("Region " + strRegion + " already had an eviction policy that has been updated now");
  | 					} else {
  | 			       		eviction.configure(getServiceCacheInstance());
  | 						regionMgr.createRegion(strRegion, eviction, config);
  | 						log.warn("Created new region " + strRegion);
  | 					}
  | 					log.warn("Setting "+ evictionPolicy.getType().toString()+ " eviction policy to region " + strRegion + ". Details: " + evictionPolicy);
  | 				} catch (org.jboss.cache.eviction.RegionNameConflictException e) {
  | 					throw new MyCacheRuntimeException(
  | 							"Region name conflict for " + strRegion + ". Impossible to set an eviction policy.");
  | 				}
  | 			} else {
  | 				log.error("There is not any eviction policy provided for region " +  strRegion);
  | 			}
  | 		}
  | 
  | 	}
  | 


My problem is:

The cache gets filled with about 2000 nodes, of 10 (key/value pairs) each, and for every node, I see there is a running Timer, which never gets discarded. At the end, my app fails being unable to create more threads.
I know this can be a memory problem, but I have set 1Gb heap, 384K thead size, and have a machine with 8Gb addresable memory, so my problem seems related to the number of threads being created.
For now, I only have one eviction policy set for one region, which holds the entire 2000 nodes, and I don understand why when a node gets evicted, or when most of them gets evicted, and node number drops to only 500, timers are over 2000.

Thanks.

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

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



More information about the jboss-user mailing list