001/**
002 *
003 * Copyright (c) 2014, the Railo Company Ltd. All rights reserved.
004 *
005 * This library is free software; you can redistribute it and/or
006 * modify it under the terms of the GNU Lesser General Public
007 * License as published by the Free Software Foundation; either 
008 * version 2.1 of the License, or (at your option) any later version.
009 * 
010 * This library is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
013 * Lesser General Public License for more details.
014 * 
015 * You should have received a copy of the GNU Lesser General Public 
016 * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
017 * 
018 **/
019package lucee.commons.management;
020
021import java.lang.management.MemoryNotificationInfo;
022import java.lang.management.MemoryType;
023import java.util.Map;
024
025import javax.management.Notification;
026import javax.management.NotificationListener;
027import javax.management.openmbean.CompositeDataSupport;
028
029import lucee.aprint;
030import lucee.runtime.config.Config;
031
032public class MemoryNotificationListener implements NotificationListener {
033
034        private Map<String, MemoryType> types;
035
036        public MemoryNotificationListener(Map<String, MemoryType> types) {
037                this.types=types;
038        }
039
040        @Override
041        public void handleNotification(Notification not, Object handback) {
042                
043                if (not.getType().equals(MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED)) {
044                        CompositeDataSupport data=(CompositeDataSupport) not.getUserData();
045                        
046                        
047                        String poolName = (String) data.get("poolName");
048                        MemoryType type = types.get(poolName);
049                        if(type==MemoryType.HEAP){
050                                // clear heap
051                                aprint.e("Clear heap!");
052                        }
053                        else if(type==MemoryType.NON_HEAP) {
054                                // clear none-heap
055                                ((Config) handback).checkPermGenSpace(false);
056                        }
057                        
058                        /*CompositeDataSupport usage=(CompositeDataSupport) data.get("usage");
059                        print.e(poolName);
060                        print.e(types.get(poolName));
061                        print.e(data.get("count"));
062                        
063                        print.e(usage.get("committed"));
064                        print.e(usage.get("init"));
065                        print.e(usage.get("max"));
066                        print.e(usage.get("used"));
067
068                        long max=Caster.toLongValue(usage.get("max"),0);
069                        long used=Caster.toLongValue(usage.get("used"),0);
070                        long free=max-used;
071                        print.o("m:"+max);
072                        print.o("f:"+free);
073                        print.o("%:"+(100L*used/max));
074                        //not.*/
075                }
076                /*
077                javax.management.openmbean.CompositeDataSupport(
078                        compositeType=javax.management.openmbean.CompositeType(
079                                name=java.lang.management.MemoryUsage,
080                                items=(
081                                        (itemName=committed,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),
082                                        (itemName=init,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),
083                                        (itemName=max,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),
084                                        (itemName=used,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)))),contents={committed=101580800, init=65404928, max=110362624, used=101085960})
085
086                
087                
088                javax.management.openmbean.CompositeDataSupport(
089                                compositeType=javax.management.openmbean.CompositeType(
090                                        name=java.lang.management.MemoryNotificationInfo,
091                                        items=(
092                                                        (itemName=count,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),
093                                                        (itemName=poolName,itemType=javax.management.openmbean.SimpleType(name=java.lang.String)),
094                                                        (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})})
095
096                */
097                /*
098                print.e(data.getCompositeType());
099                print.e(not.getSource().getClass().getName());
100                print.e(not.getSource());
101                ObjectName on=(ObjectName) not.getSource();
102                print.e(on.getKeyPropertyList());
103                */
104                
105                
106                
107                /*
108                print.e(not.getUserData().getClass().getName());
109                print.e(not.getUserData());
110                
111                print.e(not.getMessage());
112                print.e(not.getSequenceNumber());
113                print.e(not.getTimeStamp());
114                print.e(not.getType());*/
115        }
116
117}