使用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

相关文章
|
3月前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
9月前
|
人工智能 监控 机器人
【Valgrind】如何使用Valgrind监控内存
【Valgrind】如何使用Valgrind监控内存
|
3月前
|
存储 Prometheus 监控
监控堆外内存使用情况
监控堆外内存使用情况
99 4
|
5月前
|
缓存 Java 测试技术
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
使用JMeter对项目各个接口进行压力测试,并对前端进行动静分离优化,优化三级分类查询接口的性能
153 10
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
|
4月前
|
监控 数据可视化 Java
如何使用JDK自带的监控工具JConsole来监控线程池的内存使用情况?
如何使用JDK自带的监控工具JConsole来监控线程池的内存使用情况?
|
5月前
|
监控 Ubuntu API
Python脚本监控Ubuntu系统进程内存的实现方式
通过这种方法,我们可以很容易地监控Ubuntu系统中进程的内存使用情况,对于性能分析和资源管理具有很大的帮助。这只是 `psutil`库功能的冰山一角,`psutil`还能够提供更多关于系统和进程的详细信息,强烈推荐进一步探索这个强大的库。
75 1
|
5月前
|
Arthas 监控 Java
监控线程池的内存使用情况以预防内存泄漏
监控线程池的内存使用情况以预防内存泄漏
|
5月前
|
监控 数据可视化 Java
使用JDK自带的监控工具JConsole来监控线程池的内存使用情况
使用JDK自带的监控工具JConsole来监控线程池的内存使用情况
|
9月前
|
监控 Java 网络性能优化
容器内存可观测性新视角:WorkingSet 与 PageCache 监控
本文介绍了 Kubernetes 中的容器工作内存(WorkingSet)概念,它用于表示容器内存的实时使用量,尤其是活跃内存。
56494 28
容器内存可观测性新视角:WorkingSet 与 PageCache 监控
|
7月前
|
存储 消息中间件 监控
JVM内存问题之ARMS监控显示堆内存和我设置的不同如何解决
JVM内存问题之ARMS监控显示堆内存和我设置的不同如何解决

热门文章

最新文章