/*
* Copyright 2015 the original author or authors.
* @https://github.com/scouter-project/scouter
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package scouter.agent.counter.task;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryUsage;
import java.util.List;
import scouter.agent.Configure;
import scouter.agent.counter.CounterBasket;
import scouter.agent.counter.anotation.Counter;
import scouter.agent.counter.meter.MeterResource;
import scouter.agent.trace.AlertProxy;
import scouter.lang.AlertLevel;
import scouter.lang.TimeTypeEnum;
import scouter.lang.counters.CounterConstants;
import scouter.lang.pack.PerfCounterPack;
import scouter.lang.value.FloatValue;
public class PermGen {
MemoryPoolMXBean permGenBean;
public MeterResource meter = new MeterResource();
@Counter
public void getPermGen(CounterBasket pw) {
if (permGenBean == null) {
try {
List<MemoryPoolMXBean> beans = ManagementFactory.getMemoryPoolMXBeans();
for (MemoryPoolMXBean bean : beans) {
if (bean.getName().toUpperCase().contains("PERM GEN")) {
permGenBean = bean;
break;
}
}
} catch (Throwable th) {
}
}
if (permGenBean == null)
return;
MemoryUsage usage = permGenBean.getUsage();
long used = usage.getUsed();
meter.add(used);
float usedM = (used / 1024.f / 1024.f);
float max = (usage.getMax() / 1024.f / 1024.f);
PerfCounterPack p = pw.getPack(TimeTypeEnum.REALTIME);
p.put(CounterConstants.JAVA_PERM_USED, new FloatValue(usedM));
p.put(CounterConstants.JAVA_PERM_PERCENT, new FloatValue(usedM * 100 / max));
Configure conf = Configure.getInstance();
float rate = used * 100 / usage.getMax();
// /////////////////////////////////////////////////
// PermGen Warning
if (rate >= conf.alert_perm_warning_pct) {
AlertProxy.sendAlert(AlertLevel.WARN, "WARNING_MEMORY_HIGH", "warning perm usage used="
+ (used / 1024 / 1024) + "MB rate=" + rate + "%");
}
// /////////////////////////////////////////////////
p = pw.getPack(TimeTypeEnum.FIVE_MIN);
p.put(CounterConstants.JAVA_PERM_USED, new FloatValue((float) (meter.getAvg(300) / 1024.f / 1024.f)));
}
}