使用JMX实现的内存监控(转)

简介: public final class MemoryWarningSystem { private static MemoryWarningSystem m_instance = null; /** * Listener to be not...
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

相关文章
|
13天前
|
存储 监控 异构计算
【Python】GPU内存监控脚本
【Python】GPU内存监控脚本
|
1月前
|
缓存 监控 Linux
linux 内存监控
linux 内存监控
14 1
|
6月前
|
Rust 监控 并行计算
用Rust构建电脑网络监控软件:内存安全性和多线程编程
在当今数字化世界中,网络安全一直是至关重要的问题。电脑网络监控软件是确保网络系统安全和高效运行的关键工具。然而,编写电脑网络监控软件需要处理复杂的多线程编程和内存安全性问题。Rust编程语言提供了一种强大的方式来构建安全的电脑网络监控软件,同时避免了许多常见的编程错误。
274 0
|
2月前
|
监控 Linux
|
4月前
|
监控 算法 搜索推荐
C++内部监控软件:内存管理与性能调优的完美结合
在当今高度竞争的软件开发领域,内存管理和性能调优是构建高效应用的两个关键方面。本文将介绍一种基于C++的内部监控软件,通过结合精细的内存管理和有效的性能调优,实现了出色的应用性能。我们将深入探讨一些示例代码,演示如何在代码层面实现内存管理和性能优化,最后介绍如何将监控到的数据自动提交到网站。
220 1
|
10月前
|
监控 Python
【python】实现cpu/内存监控的功能(非常简单)
【python】实现cpu/内存监控的功能(非常简单)
424 0
|
5月前
|
监控 Java
游戏服务器的内存监控日志
游戏服务器的内存监控日志
60 0
|
5月前
|
监控 Java
电脑内存阈值监控代码示例
监控计算机内存的阈值有时候很重要。在Java中,可以使用Java Management Extensions (JMX) 来监控计算机内存的阈值。
466 0
|
8月前
|
监控 Shell Linux
linux实现shell脚本监控磁盘内存达到阈值时清理catalina.out日志
linux实现shell脚本监控磁盘内存达到阈值时清理catalina.out日志
237 0
|
9月前
|
监控 Shell
监控内存和磁盘容量,小于给定值时报警
监控内存和磁盘容量,小于给定值时报警
116 1