使用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.进入路径 ...
随机推荐
- Hdu 4539 【状态DP】.cpp
题意: 一个炮兵可以攻打和他之间曼哈顿距离为2的士兵,给出你一块n*m的战场,告诉你哪些地方可以站人哪些地方不可以,问你最多可以安放多少个士兵? n <= 100, m <= 10 思路: ...
- 【Java】运用JDBC实现一个注册、登录系统的编写
数据库的建立 首先,建立一个数据库,存储注册成功的账户信息. 其SQL的DDL语句如下: CREATE TABLE `jdbctest` ( `id` int(10) NOT NULL auto_in ...
- 灰度图像阈值化分割常见方法总结及VC实现
转载地址:http://blog.csdn.net/likezhaobin/article/details/6915755 在图像处理领域,二值图像运算量小,并且能够体现图像的关键特征,因此被广泛使用 ...
- HttpClient请求服务器代码优化版
HttpClient请求服务器代码优化版 首先,我在前面的两篇博文中介绍了在 Android中,除了使用java.net包下HttpUrlConnection的API访问HTTP服务之外,我们还可以换 ...
- SQL参数化查询的问题
最近碰到个问题, SQL语句中的 "... like '%@strKeyword%'"这样写查不出结果, 非的写成 "... like '%" + strKey ...
- 依赖注入(DI)
依赖注入(DI) IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用“好莱坞原则”是应用程序以被动的方式实现对流程的定制.我们可以采用若干设 ...
- HTML中心在页面上弹出自定义表单层(实现可能拖累)
使用DIV窗体来动态显示内容的原理:首先採用CSS和HTML隐藏弹窗中的内容,然后利用JavaScript(本教程中是JQuery)来动态显示它们.这样的效果不仅可以充分利用有限的版面空间,并且可以提 ...
- Windows远程桌面连接Ubuntu 14.04 (转)
由于xrdp.gnome和unity之间的兼容性问题,在Ubuntu 14.04版本中仍然无法使用xrdp登陆gnome或unity的远程桌面,现象是登录后只有黑白点为背景,无图标也无法操作.与13. ...
- 理解RESTful架构(转)
越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...
- Oracle学习(十四):管理用户安全性
--用户(user) SQL> --创建一个名为 grace password是password 的用户,新用户没有不论什么权限 SQL> create user grace identi ...