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