public final class MemoryWarningSystem {  

    private static MemoryWarningSystem m_instance = null;  

    /**
* Listener to be notified on warning events
*/
public interface MemoryWarningListener {
/**
* @param usedMemory
* @param maxMemory
*/
public void memoryUsageLow(long usedMemory, long maxMemory);
} private final Set<MemoryWarningListener> listeners = new HashSet<MemoryWarningListener>(); private final MemoryPoolMXBean m_memPool = findTenuredGenPool(); /**
* Singleton here?
*/
private MemoryWarningSystem() { final long maxMem = computeMaxMem(); MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
NotificationEmitter emitter = (NotificationEmitter)mbean; emitter.addNotificationListener(new NotificationListener() {
@Override
public void handleNotification(final Notification n, final Object hb) {
if (n.getType().equals(MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED)) {
long computeUsedMem = computeUsedMem();
synchronized (m_instance) {
for (MemoryWarningListener listener : listeners) {
listener.memoryUsageLow(computeUsedMem, maxMem);
}
}
}
}
}, null, null);
} /**
* Register Listener
*
* @param listener
* @return
*/
public synchronized boolean registerListener(final MemoryWarningListener listener) {
return listeners.add(listener);
} /**
* Remove registered Listener
*
* @param listener
* @return
*/
public synchronized boolean removeListener(final MemoryWarningListener listener) {
return listeners.remove(listener);
} /**
* Set percentage level of the amount of memory in tenured space which may be set before a memory warning event is
* thrown
*
* @param percentage
*/
public void setPercentageUsageThreshold(final double percentage) {
if (percentage <= 0.0 || percentage > 1.0) {
throw new IllegalArgumentException("Percentage not in range");
} long warningThreshold = (long)(computeMaxMem() * percentage); m_memPool.setUsageThreshold(warningThreshold);
} private long computeUsedMem() {
return null != m_memPool ? m_memPool.getUsage().getUsed() : Runtime.getRuntime().totalMemory()
- Runtime.getRuntime().freeMemory();
} private long computeMaxMem() {
// Compute the threshold in bytes
long maxMem = null != m_memPool ? m_memPool.getUsage().getMax() : Runtime.getRuntime().maxMemory(); // Workaround for a bug in G1 garbage collector:
// http://bugs.sun.com/view_bug.do?bug_id=6880903
List<String> jvmArgs = ManagementFactory.getRuntimeMXBean().getInputArguments();
if (jvmArgs.contains("-XX:+UseG1GC")) {
boolean xmxArgSet = false;
for (String arg : jvmArgs) {
if (arg.startsWith("-Xmx")) {
xmxArgSet = true;
boolean factorPresent = false;
int factor = -1;
if (arg.toLowerCase().endsWith("k")) {
factorPresent = true;
factor = 1000;
} else if (arg.toLowerCase().endsWith("m")) {
factorPresent = true;
factor = 1000000;
} else if (arg.toLowerCase().endsWith("g")) {
factorPresent = true;
factor = 1000000000;
}
if (factorPresent) {
maxMem = Integer.parseInt(arg.substring(4, arg.length() - 1)) * factor;
} else {
maxMem = Integer.parseInt(arg.substring(4));
}
break;
}
}
if (!xmxArgSet) {
System.err.println("Please, set -Xmx jvm argument " + "due to a bug in G1GC. Otherwise, memory "
+ "intensive nodes might not work correctly.");
}
} return maxMem;
} /**
* Tenured Space Pool can be determined by it being of type HEAP and by it being possible to set the usage
* threshold.
*/
private MemoryPoolMXBean findTenuredGenPool() {
List<String> asList = Arrays.asList("Tenured Gen", "PS Old Gen", "CMS Old Gen", "G1 Old Gen"); for (MemoryPoolMXBean pool : ManagementFactory.getMemoryPoolMXBeans()) {
// I don't know whether this approach is better, or
// whether
// we should rather check for the pool name
// "Tenured Gen"?
if (asList.contains(pool.getName()) && pool.isUsageThresholdSupported()) {
return pool;
}
}
throw new AssertionError("Could not find tenured space");
} /**
* Singleton on MemoryObjectTracker
*/
public static MemoryWarningSystem getInstance() {
if (m_instance == null) {
m_instance = new MemoryWarningSystem();
}
return m_instance;
} }

http://blog.csdn.net/expleeve/article/details/41724693

使用JMX实现的内存监控(转)的更多相关文章

  1. 用python 10min手写一个简易的实时内存监控系统

    简易的内存监控系统 本文需要有一定的python和前端基础,如果没基础的,请关注我后续的基础教程系列博客 文章github源地址,还可以看到具体的代码,喜欢请在原链接右上角加个star 腾讯视频链接 ...

  2. Docker容器内存监控

    linux内存监控 要明白docker容器内存是如何计算的,首先要明白linux中内存的相关概念. 使用free命令可以查看当前内存使用情况. [root@localhost ~]$ free tot ...

  3. iOS微信内存监控

    WeTest 导读 目前iOS主流的内存监控工具是Instruments的Allocations,但只能用于开发阶段.本文介绍如何实现离线化的内存监控工具,用于App上线后发现内存问题. FOOM(F ...

  4. [转]用python 10min手写一个简易的实时内存监控系统

    简易的内存监控系统 本文需要有一定的python和前端基础,如果没基础的,请关注我后续的基础教程系列博客 文章github源地址,还可以看到具体的代码,喜欢请在原链接右上角加个star 腾讯视频链接 ...

  5. docker内存监控与压测

    一直运行的docker容器显示内存已经耗尽,并且容器内存耗尽也没出现重启情况,通过后台查看发现进程没有占用多少内存.内存的监控使用的是cadvisor,计算方式也是使用cadvisor的页面计算方式, ...

  6. 从Container内存监控限制到CPU使用率限制方案

    转自:http://blog.csdn.net/Androidlushangderen/article/details/50282593 前言 最近在运维我们部门的hadoop集群时,发现了很多Job ...

  7. redis内存监控与回收

    Redis有自己的内存分配器,当key-value对象被移除时,Redis不会马上向操作系统释放其占用内存.redis之所以这样的设计有两个原因. OS可能会将释放内存交换到虚拟内存,但OS的虚拟内存 ...

  8. 10min 手写一个内存监控系统

    本文的目的在于,尽可能用简单的代码,让大家了解内存监控的原理,及思想.更容易去理解Nagios.Zabbix.Ganglia监控原理,文章最后还有视频教程链接哦,从零敲出来的全过程 思路分为下面几块: ...

  9. 【性能测试】:JVM内存监控策略的方法,以及监控结果说明

    JVM内存监控主要在稳定性压测期间,监控应用服务器内存泄露等问题: [JVM远程监控设置] 1.打开WAS控制台:https://ip:port/ibm/console/login.do 2.进入路径 ...

随机推荐

  1. 我的Android学习之旅(转)

    去年大概在七月份的时候误打误撞接触了一阵子Android,之后由于工作时间比较忙,无暇顾及,九月份的时候自己空闲的时间比较多,公司相对来说加班情况没以前严重.开启了个人的Android学习之旅,初衷是 ...

  2. Android FragmentStatePageAdapter的使用Demo

    上一篇写过FragmentPagerAdapter,这篇来介绍FragmentStatePagerAdapter,那么两者之间有何差别呢: FragmentPagerAdapter很多其它的用于少量界 ...

  3. tab功能菜单——使用tab之间不同的交换机div

    需求:在web实现类型的接口tab标签效应 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem91eXVqaWUxMTI3/font/5a6L5L2T/fo ...

  4. H264 编解码框架简单介绍

    阅读完H264/AVC 编解码器的介绍,脑海中仅仅是留下下面三条: 1.H264并没有明白规定一个编解码器怎样实现,仅仅是规定了一个编码后的视频比特流的句法,和该比特流的解码方法,这个与MPEG 类似 ...

  5. The mell hall——坑爹

    The mell hall 题目描述 In HUST,there are always manystudents go to the mell hall at the same time as soo ...

  6. 《深入浅出 Java Concurrency》—锁紧机构(一)Lock与ReentrantLock

    转会:http://www.blogjava.net/xylz/archive/2010/07/05/325274.html 前面的章节主要谈谈原子操作,至于与原子操作一些相关的问题或者说陷阱就放到最 ...

  7. Android编程心得-Service数据绑定初步

    在Android里,Service的数据绑定是一种重要的用法,我们知道Service与Activity一样是运行在当前应用进程的主线程里面的,他们之间交互的方式有多种,下面我来介绍一下如何使用数据绑定 ...

  8. Qt国际化相关类

    QTextCodec QTextCodec为文本编码之间提供转换. Qt用Unicode 来存储,绘制和操作字符串.在很多情况下你可能希望操作不同编码的数据.例如,大部分日本文档是以Shift-JIS ...

  9. (七)unity4.6Ugui中国教程文档-------摘要-UGUI Auto Layout

    大家好,我是太阳广东. 转载请注明出处:http://write.blog.csdn.net/postedit/38922399 更全的内容请看我的游戏蛮牛地址:http://www.unityman ...

  10. Left Menu抽屉效果ScrollView姿态共存冲突

    我们有一个小项目,需要做主页ScrollView嵌套TableView. 再就是Left与Right抽屉效果. 课前有眼似的,然后完成忘. 非常糟糕的记忆.真应了那句话:好记性不如烂博客. 由于我首页 ...