001 package railo.commons.management; 002 003 import java.lang.management.MemoryNotificationInfo; 004 import java.lang.management.MemoryType; 005 import java.util.Map; 006 007 import javax.management.Notification; 008 import javax.management.NotificationListener; 009 import javax.management.openmbean.CompositeDataSupport; 010 011 import railo.aprint; 012 import railo.runtime.config.Config; 013 import railo.runtime.config.ConfigServer; 014 import railo.runtime.config.ConfigServerImpl; 015 import railo.runtime.engine.Controler; 016 017 public class MemoryNotificationListener implements NotificationListener { 018 019 private Map<String, MemoryType> types; 020 021 public MemoryNotificationListener(Map<String, MemoryType> types) { 022 this.types=types; 023 } 024 025 @Override 026 public void handleNotification(Notification not, Object handback) { 027 028 if (not.getType().equals(MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED)) { 029 CompositeDataSupport data=(CompositeDataSupport) not.getUserData(); 030 031 032 String poolName = (String) data.get("poolName"); 033 MemoryType type = types.get(poolName); 034 if(type==MemoryType.HEAP){ 035 // clear heap 036 aprint.e("Clear heap!"); 037 } 038 else if(type==MemoryType.NON_HEAP) { 039 // clear none-heap 040 ConfigServerImpl.checkPermGenSpace((Config) handback,false); 041 } 042 043 /*CompositeDataSupport usage=(CompositeDataSupport) data.get("usage"); 044 print.e(poolName); 045 print.e(types.get(poolName)); 046 print.e(data.get("count")); 047 048 print.e(usage.get("committed")); 049 print.e(usage.get("init")); 050 print.e(usage.get("max")); 051 print.e(usage.get("used")); 052 053 long max=Caster.toLongValue(usage.get("max"),0); 054 long used=Caster.toLongValue(usage.get("used"),0); 055 long free=max-used; 056 print.o("m:"+max); 057 print.o("f:"+free); 058 print.o("%:"+(100L*used/max)); 059 //not.*/ 060 } 061 /* 062 javax.management.openmbean.CompositeDataSupport( 063 compositeType=javax.management.openmbean.CompositeType( 064 name=java.lang.management.MemoryUsage, 065 items=( 066 (itemName=committed,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)), 067 (itemName=init,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)), 068 (itemName=max,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)), 069 (itemName=used,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)))),contents={committed=101580800, init=65404928, max=110362624, used=101085960}) 070 071 072 073 javax.management.openmbean.CompositeDataSupport( 074 compositeType=javax.management.openmbean.CompositeType( 075 name=java.lang.management.MemoryNotificationInfo, 076 items=( 077 (itemName=count,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)), 078 (itemName=poolName,itemType=javax.management.openmbean.SimpleType(name=java.lang.String)), 079 (itemName=usage,itemType=javax.management.openmbean.CompositeType(name=java.lang.management.MemoryUsage,items=((itemName=committed,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=init,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=max,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=used,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long))))))),contents={count=1, poolName=CMS Old Gen, usage=javax.management.openmbean.CompositeDataSupport(compositeType=javax.management.openmbean.CompositeType(name=java.lang.management.MemoryUsage,items=((itemName=committed,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=init,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=max,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=used,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)))),contents={committed=101580800, init=65404928, max=110362624, used=101085944})}) 080 081 */ 082 /* 083 print.e(data.getCompositeType()); 084 print.e(not.getSource().getClass().getName()); 085 print.e(not.getSource()); 086 ObjectName on=(ObjectName) not.getSource(); 087 print.e(on.getKeyPropertyList()); 088 */ 089 090 091 092 /* 093 print.e(not.getUserData().getClass().getName()); 094 print.e(not.getUserData()); 095 096 print.e(not.getMessage()); 097 print.e(not.getSequenceNumber()); 098 print.e(not.getTimeStamp()); 099 print.e(not.getType());*/ 100 } 101 102 }