使用JMX实现的内存监控(转)
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实现的内存监控(转)的更多相关文章
- 用python 10min手写一个简易的实时内存监控系统
简易的内存监控系统 本文需要有一定的python和前端基础,如果没基础的,请关注我后续的基础教程系列博客 文章github源地址,还可以看到具体的代码,喜欢请在原链接右上角加个star 腾讯视频链接 ...
- Docker容器内存监控
linux内存监控 要明白docker容器内存是如何计算的,首先要明白linux中内存的相关概念. 使用free命令可以查看当前内存使用情况. [root@localhost ~]$ free tot ...
- iOS微信内存监控
WeTest 导读 目前iOS主流的内存监控工具是Instruments的Allocations,但只能用于开发阶段.本文介绍如何实现离线化的内存监控工具,用于App上线后发现内存问题. FOOM(F ...
- [转]用python 10min手写一个简易的实时内存监控系统
简易的内存监控系统 本文需要有一定的python和前端基础,如果没基础的,请关注我后续的基础教程系列博客 文章github源地址,还可以看到具体的代码,喜欢请在原链接右上角加个star 腾讯视频链接 ...
- docker内存监控与压测
一直运行的docker容器显示内存已经耗尽,并且容器内存耗尽也没出现重启情况,通过后台查看发现进程没有占用多少内存.内存的监控使用的是cadvisor,计算方式也是使用cadvisor的页面计算方式, ...
- 从Container内存监控限制到CPU使用率限制方案
转自:http://blog.csdn.net/Androidlushangderen/article/details/50282593 前言 最近在运维我们部门的hadoop集群时,发现了很多Job ...
- redis内存监控与回收
Redis有自己的内存分配器,当key-value对象被移除时,Redis不会马上向操作系统释放其占用内存.redis之所以这样的设计有两个原因. OS可能会将释放内存交换到虚拟内存,但OS的虚拟内存 ...
- 10min 手写一个内存监控系统
本文的目的在于,尽可能用简单的代码,让大家了解内存监控的原理,及思想.更容易去理解Nagios.Zabbix.Ganglia监控原理,文章最后还有视频教程链接哦,从零敲出来的全过程 思路分为下面几块: ...
- 【性能测试】:JVM内存监控策略的方法,以及监控结果说明
JVM内存监控主要在稳定性压测期间,监控应用服务器内存泄露等问题: [JVM远程监控设置] 1.打开WAS控制台:https://ip:port/ibm/console/login.do 2.进入路径 ...
随机推荐
- hdu2126(求方案数的01背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2126 题意: n个物品,m元钱,每个物品最多买一次,问最多可以买几件物品,并且输出方案数. 分析:一看 ...
- Android学习十九:ContentProvider初步
一.Content Provider基本概念 1.ContentProvider为存储和获取数据提供了统一的接口.ContentProvide对数据进行封装.不用关心数据存储的细节.使用表的形式来组织 ...
- 在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹)
在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹) 1 列出所有需要copy的sh文件 -bash-4.1$ ll /mysqllog/osw/*.sh ...
- _beginThreadex创建多线程解读
_beginThreadex创建多线程解读 一.须要的头文件支持 #include <process.h> // for _beginthread() 须要的设置:Proj ...
- u-boot TFTP: 'Access violation' (2)
今天做tftp下载时间会遇到以下问题. --->8--- Load address: 0x20000000 Loading: * TFTP error: 'Access violation' ( ...
- 观察者模式(Observer Patterns)
今天学习了观察者模式,做个总结,方便以后回想. 首先是定义:观察者模式就是定义对象之间一对多的依赖关系,当一个对象状态发生改变时,全部依赖他的对象都收到推送消息并自己主动更新做出改变. 我的理解:生活 ...
- 由于空间,注定的结果——第五届山东省ACM编程比赛总结
应该是,这是一个很失败的结果.目前省赛玩具.作为志愿者说,,铁匠是一个很丢人的事. 作为队长.全然没有想到会是这种一次旅程.尽管由于去baidu的实习和各种offer的申请,对acm抱着能水就水绝不深 ...
- Zabbix的数据表结构
看到Zabbix的数据表结构吧,就知道数据量大了 性能问题很让人担忧,不过基于Zabbix数据库导出报表,或自动跑报表的时候,就必须去了解一下zabbix的数据表结构了,得知道XX放在哪才能找到XX, ...
- uva 11427 - Expect the Expected(概率)
题目链接:uva 11427 - Expect the Expected 题目大意:你每天晚上都会玩纸牌,每天固定最多玩n盘,每盘胜利的概率为p,你是一个固执的人,每天一定要保证胜局的比例大于p才会结 ...
- [Cocos2d-x v3.x]浅谈容器Vector
转载请注明来自:star特530的CSDN博客 http://blog.csdn.net/start530/article/details/19170853 前两天有人问我说在3.0 beta2版本号 ...