You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2020/04/07 02:42:40 UTC

[dubbo] branch master updated: perf: Reuse Hessian2Output and Hessian2Input instance to reduce memory allocation. (#5889)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 78d5277  perf: Reuse Hessian2Output and Hessian2Input instance to reduce memory allocation. (#5889)
78d5277 is described below

commit 78d527788d6fdc2d27e33261299f20db65f74139
Author: LinShunKang <li...@gmail.com>
AuthorDate: Tue Apr 7 10:42:21 2020 +0800

    perf: Reuse Hessian2Output and Hessian2Input instance to reduce memory allocation. (#5889)
    
    fixes #5892
---
 .../dubbo/common/serialize/hessian2/Hessian2ObjectInput.java | 12 ++++++++++--
 .../common/serialize/hessian2/Hessian2ObjectOutput.java      | 12 ++++++++++--
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2ObjectInput.java b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2ObjectInput.java
index 08c758d..d38b5c0 100644
--- a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2ObjectInput.java
+++ b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2ObjectInput.java
@@ -28,11 +28,19 @@ import java.lang.reflect.Type;
  * Hessian2 object input implementation
  */
 public class Hessian2ObjectInput implements ObjectInput {
+
+    private static ThreadLocal<Hessian2Input> INPUT_TL = ThreadLocal.withInitial(() -> {
+        Hessian2Input h2i = new Hessian2Input(null);
+        h2i.setSerializerFactory(Hessian2SerializerFactory.SERIALIZER_FACTORY);
+        h2i.setCloseStreamOnClose(true);
+        return h2i;
+    });
+
     private final Hessian2Input mH2i;
 
     public Hessian2ObjectInput(InputStream is) {
-        mH2i = new Hessian2Input(is);
-        mH2i.setSerializerFactory(Hessian2SerializerFactory.SERIALIZER_FACTORY);
+        mH2i = INPUT_TL.get();
+        mH2i.init(is);
     }
 
     @Override
diff --git a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2ObjectOutput.java b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2ObjectOutput.java
index 61e38c0..a878593 100644
--- a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2ObjectOutput.java
+++ b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2ObjectOutput.java
@@ -27,11 +27,19 @@ import java.io.OutputStream;
  * Hessian2 object output implementation
  */
 public class Hessian2ObjectOutput implements ObjectOutput {
+
+    private static ThreadLocal<Hessian2Output> OUTPUT_TL = ThreadLocal.withInitial(() -> {
+        Hessian2Output h2o = new Hessian2Output(null);
+        h2o.setSerializerFactory(Hessian2SerializerFactory.SERIALIZER_FACTORY);
+        h2o.setCloseStreamOnClose(true);
+        return h2o;
+    });
+
     private final Hessian2Output mH2o;
 
     public Hessian2ObjectOutput(OutputStream os) {
-        mH2o = new Hessian2Output(os);
-        mH2o.setSerializerFactory(Hessian2SerializerFactory.SERIALIZER_FACTORY);
+        mH2o = OUTPUT_TL.get();
+        mH2o.init(os);
     }
 
     @Override