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. logstash+ElasticSearch+Kibana VS Splunk

    logstash+ElasticSearch+Kibana VS Splunk 最近帮磊哥移植一套开源的日志管理软件,替代Splunk. Splunk是一个功能强大的日志管理工具,它不仅可以用多种方式 ...

  2. 类似于qq联系人的tablview能够展开和收缩

    在.h文件中定义三个数组和一个tablview UITableView *listTable;     NSMutableArray *listArray;     NSMutableArray *p ...

  3. 记得有一个奇怪的ORA-04028: cannot generate diana for object

    开发商称新一package,目前已经在翻译过程中的一些错误.提示PL/SQL:ORA-00942: table or view does not exists.这是一个非常明显的错误,即要么是表不存在 ...

  4. HGE引擎 - 绘制,声音,碰撞处理

    原帖地址:http://blog.csdn.net/i_dovelemon/article/details/8818037 另外,年代久远,该引擎官网早已上不去了!!! 1.库的安装和下载 从官网上h ...

  5. JQuery日记_5.13 Sizzle选择器(六)选择器的效率

        当选择表达式不符合高速匹配(id,tag,class)和原生QSA不可用或返回错误时,将调用select(selector, context, results, seed)方法,此方法迭代DO ...

  6. JSF教程(9)——生命周期之Process Validations Phase

    在这个过程其中JSF的实现者使用processValidators方法处理全部在tree中的组件中注冊的验证器.验证的过程就是通过每一个组件已有的规则对其已经保存的值进行校验,同一时候也对输入的值进行 ...

  7. SlopOne推荐算法

    在开源框架taste中有SlopOne的Java实现,效果不错.使用movielens的数据,代码例如以下 代码 #coding:utf-8 import re import math #读取数据,并 ...

  8. linux下安装oracle11g 64位最简客户端(转)

    安装环境 Linux服务器:SuSe11 sp1 64位           Oracle客户端:Oracle11gR2 64位(最简客户端) 部署流程 1.准备工作,首先在oracle官网下载最新的 ...

  9. 【原创】ZOJ_1649 Rescue 解题报告

    Rescue Time Limit: 2 Seconds      Memory Limit: 65536 KB Angel was caught by the MOLIGPY! He was put ...

  10. defgen工具

    构造defgen档 由于 Oracle 和 SQL Server 中的数据类型不同.所以您必须建立数据类型转换.GoldenGate 提供了一个名为 DEFGEN 的专用工具.用于生成数据定义,当源表 ...