core/src/main/java/com/taobao/arthas/core/advisor/AdviceListenerManager.java [60:141]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
            @Override
            public void run() {
                try {
                    for (Entry<ClassLoader, ClassLoaderAdviceListenerManager> entry : adviceListenerMap.entrySet()) {
                        ClassLoaderAdviceListenerManager adviceListenerManager = entry.getValue();
                        synchronized (adviceListenerManager) {
                            for (Entry<String, List<AdviceListener>> eee : adviceListenerManager.map.entrySet()) {
                                List<AdviceListener> listeners = eee.getValue();
                                List<AdviceListener> newResult = new ArrayList<AdviceListener>();
                                for (AdviceListener listener : listeners) {
                                    if (listener instanceof ProcessAware) {
                                        ProcessAware processAware = (ProcessAware) listener;
                                        Process process = processAware.getProcess();
                                        if (process == null) {
                                            continue;
                                        }
                                        ExecStatus status = process.status();
                                        if (!status.equals(ExecStatus.TERMINATED)) {
                                            newResult.add(listener);
                                        }
                                    }
                                }

                                if (newResult.size() != listeners.size()) {
                                    adviceListenerManager.map.put(eee.getKey(), newResult);
                                }

                            }
                        }
                    }
                } catch (Throwable e) {
                    try {
                        logger.error("clean AdviceListener error", e);
                    } catch (Throwable t) {
                        // ignore
                    }
                }
            }
        }, 3, 3, TimeUnit.SECONDS);
    }

    private static final ConcurrentWeakKeyHashMap<ClassLoader, ClassLoaderAdviceListenerManager> adviceListenerMap = new ConcurrentWeakKeyHashMap<ClassLoader, ClassLoaderAdviceListenerManager>();

    static class ClassLoaderAdviceListenerManager {
        private ConcurrentHashMap<String, List<AdviceListener>> map = new ConcurrentHashMap<String, List<AdviceListener>>();

        private String key(String className, String methodName, String methodDesc) {
            return className + methodName + methodDesc;
        }

        private String keyForTrace(String className, String owner, String methodName, String methodDesc) {
            return className + owner + methodName + methodDesc;
        }

        public void registerAdviceListener(String className, String methodName, String methodDesc,
                AdviceListener listener) {
            synchronized (this) {
                className = className.replace('/', '.');
                String key = key(className, methodName, methodDesc);

                List<AdviceListener> listeners = map.get(key);
                if (listeners == null) {
                    listeners = new ArrayList<AdviceListener>();
                    map.put(key, listeners);
                }
                if (!listeners.contains(listener)) {
                    listeners.add(listener);
                }
            }
        }

        public List<AdviceListener> queryAdviceListeners(String className, String methodName, String methodDesc) {
            className = className.replace('/', '.');
            String key = key(className, methodName, methodDesc);

            List<AdviceListener> listeners = map.get(key);

            return listeners;
        }

        public void registerTraceAdviceListener(String className, String owner, String methodName, String methodDesc,
                AdviceListener listener) {
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



labs/arthas-grpc-web-proxy/src/main/java/com/taobao/arthas/grpcweb/grpc/service/advisor/AdviceListenerManager.java [61:142]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
            @Override
            public void run() {
                try {
                    for (Entry<ClassLoader, ClassLoaderAdviceListenerManager> entry : adviceListenerMap.entrySet()) {
                        ClassLoaderAdviceListenerManager adviceListenerManager = entry.getValue();
                        synchronized (adviceListenerManager) {
                            for (Entry<String, List<AdviceListener>> eee : adviceListenerManager.map.entrySet()) {
                                List<AdviceListener> listeners = eee.getValue();
                                List<AdviceListener> newResult = new ArrayList<AdviceListener>();
                                for (AdviceListener listener : listeners) {
                                    if (listener instanceof ProcessAware) {
                                        ProcessAware processAware = (ProcessAware) listener;
                                        Process process = processAware.getProcess();
                                        if (process == null) {
                                            continue;
                                        }
                                        ExecStatus status = process.status();
                                        if (!status.equals(ExecStatus.TERMINATED)) {
                                            newResult.add(listener);
                                        }
                                    }
                                }

                                if (newResult.size() != listeners.size()) {
                                    adviceListenerManager.map.put(eee.getKey(), newResult);
                                }

                            }
                        }
                    }
                } catch (Throwable e) {
                    try {
                        logger.error("clean AdviceListener error", e);
                    } catch (Throwable t) {
                        // ignore
                    }
                }
            }
        }, 3, 3, TimeUnit.SECONDS);
    }

    private static final ConcurrentWeakKeyHashMap<ClassLoader, ClassLoaderAdviceListenerManager> adviceListenerMap = new ConcurrentWeakKeyHashMap<ClassLoader, ClassLoaderAdviceListenerManager>();

    static class ClassLoaderAdviceListenerManager {
        private ConcurrentHashMap<String, List<AdviceListener>> map = new ConcurrentHashMap<String, List<AdviceListener>>();

        private String key(String className, String methodName, String methodDesc) {
            return className + methodName + methodDesc;
        }

        private String keyForTrace(String className, String owner, String methodName, String methodDesc) {
            return className + owner + methodName + methodDesc;
        }

        public void registerAdviceListener(String className, String methodName, String methodDesc,
                AdviceListener listener) {
            synchronized (this) {
                className = className.replace('/', '.');
                String key = key(className, methodName, methodDesc);

                List<AdviceListener> listeners = map.get(key);
                if (listeners == null) {
                    listeners = new ArrayList<AdviceListener>();
                    map.put(key, listeners);
                }
                if (!listeners.contains(listener)) {
                    listeners.add(listener);
                }
            }
        }

        public List<AdviceListener> queryAdviceListeners(String className, String methodName, String methodDesc) {
            className = className.replace('/', '.');
            String key = key(className, methodName, methodDesc);

            List<AdviceListener> listeners = map.get(key);

            return listeners;
        }

        public void registerTraceAdviceListener(String className, String owner, String methodName, String methodDesc,
                AdviceListener listener) {
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



