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    }