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}