This is an automated email from the ASF dual-hosted git repository.

iluo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git


The following commit(s) were added to refs/heads/master by this push:
     new 833ba03  Fix DubboShutdownHook Memory Leak (#2922)
833ba03 is described below

commit 833ba033ccb3cd2a573776637c6db9d154d9f5ba
Author: LiZhen <[email protected]>
AuthorDate: Mon Dec 10 13:39:16 2018 +0800

    Fix DubboShutdownHook Memory Leak (#2922)
---
 .../org/apache/dubbo/config/AbstractConfig.java    |  2 +-
 .../org/apache/dubbo/config/DubboShutdownHook.java | 28 ++++++++++++++++++++--
 .../spring/extension/SpringExtensionFactory.java   |  2 +-
 3 files changed, 28 insertions(+), 4 deletions(-)

diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
index fada00e..7cddb97 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
@@ -74,7 +74,7 @@ public abstract class AbstractConfig implements Serializable {
         legacyProperties.put("dubbo.service.url", "dubbo.service.address");
 
         // this is only for compatibility
-        
Runtime.getRuntime().addShutdownHook(DubboShutdownHook.getDubboShutdownHook());
+        DubboShutdownHook.getDubboShutdownHook().register();
     }
 
     protected String id;
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java
index d554281..05c3643 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java
@@ -41,13 +41,16 @@ public class DubboShutdownHook extends Thread {
     }
 
     /**
+     * Has it already been registered or not?
+     */
+    private final AtomicBoolean registered = new AtomicBoolean(false);
+    /**
      * Has it already been destroyed or not?
      */
-    private final AtomicBoolean destroyed;
+    private final AtomicBoolean destroyed= new AtomicBoolean(false);
 
     private DubboShutdownHook(String name) {
         super(name);
-        this.destroyed = new AtomicBoolean(false);
     }
 
     @Override
@@ -59,12 +62,32 @@ public class DubboShutdownHook extends Thread {
     }
 
     /**
+     * Register the ShutdownHook
+     */
+    public void register() {
+        if (!registered.get() && registered.compareAndSet(false, true)) {
+            Runtime.getRuntime().addShutdownHook(getDubboShutdownHook());
+        }
+    }
+
+    /**
+     * Unregister the ShutdownHook
+     */
+    public void unregister() {
+        if (registered.get() && registered.compareAndSet(true, false)) {
+            Runtime.getRuntime().removeShutdownHook(getDubboShutdownHook());
+        }
+    }
+
+    /**
      * Destroy all the resources, including registries and protocols.
      */
     public void doDestroy() {
         if (!destroyed.compareAndSet(false, true)) {
             return;
         }
+        // unregister the shutdownHook
+        unregister();
         // destroy all the registries
         AbstractRegistryFactory.destroyAll();
         // destroy all the protocols
@@ -88,4 +111,5 @@ public class DubboShutdownHook extends Thread {
         }
     }
 
+
 }
diff --git 
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java
 
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java
index 755db1a..6d66365 100644
--- 
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java
+++ 
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java
@@ -44,7 +44,7 @@ public class SpringExtensionFactory implements 
ExtensionFactory {
 
     public static void addApplicationContext(ApplicationContext context) {
         contexts.add(context);
-        
Runtime.getRuntime().removeShutdownHook(DubboShutdownHook.getDubboShutdownHook());
+        DubboShutdownHook.getDubboShutdownHook().unregister();
         BeanFactoryUtils.addApplicationListener(context, shutdownHookListener);
     }
 

Reply via email to