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);
}