You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ke...@apache.org on 2021/08/09 14:08:38 UTC

[skywalking] branch object-pool created (now 76b7661)

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

kezhenxu94 pushed a change to branch object-pool
in repository https://gitbox.apache.org/repos/asf/skywalking.git.


      at 76b7661  Pool metrics objects

This branch includes the following new commits:

     new 76b7661  Pool metrics objects

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[skywalking] 01/01: Pool metrics objects

Posted by ke...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kezhenxu94 pushed a commit to branch object-pool
in repository https://gitbox.apache.org/repos/asf/skywalking.git

commit 76b76611baee63668604ff631f0b0d25c26ff93d
Author: kezhenxu94 <ke...@apache.org>
AuthorDate: Mon Aug 9 22:08:21 2021 +0800

    Pool metrics objects
---
 .../datacarrier/consumer/BulkConsumePool.java      | 16 +++----
 .../skywalking/oap/meter/analyzer/Analyzer.java    |  5 +-
 .../exporter/provider/grpc/GRPCExporter.java       | 11 +++--
 .../exporter/provider/grpc/GRPCExporterTest.java   | 13 ++---
 .../server/exporter/provider/grpc/MockMetrics.java |  5 ++
 .../code-templates/dispatcher/doMetrics.ftl        |  2 +-
 .../metrics-builder/storage2Entity.ftl             |  4 +-
 .../resources/code-templates/metrics/toDay.ftl     |  4 +-
 .../resources/code-templates/metrics/toHour.ftl    |  4 +-
 .../core/alarm/provider/NotifyHandlerTest.java     |  4 +-
 .../core/alarm/provider/RunningRuleTest.java       | 41 +++++++++++++---
 .../oap/server/core/MetricsObjectPool.java         | 47 ++++++++++++++++++
 .../skywalking/oap/server/core/Recyclable.java     | 26 ++++++++++
 .../core/analysis/data/MergableBufferedData.java   |  4 +-
 .../analysis/manual/endpoint/EndpointTraffic.java  | 11 +++++
 .../analysis/manual/instance/InstanceTraffic.java  | 13 ++++-
 .../manual/networkalias/NetworkAddressAlias.java   | 13 ++++-
 .../endpoint/EndpointCallRelationDispatcher.java   |  3 +-
 .../EndpointRelationServerSideMetrics.java         | 18 +++++--
 .../ServiceInstanceCallRelationDispatcher.java     |  7 ++-
 .../ServiceInstanceRelationClientSideMetrics.java  | 46 +++++++++++++++---
 .../ServiceInstanceRelationServerSideMetrics.java  | 46 +++++++++++++++---
 .../service/ServiceCallRelationDispatcher.java     |  5 +-
 .../service/ServiceRelationClientSideMetrics.java  | 18 +++++--
 .../service/ServiceRelationServerSideMetrics.java  | 18 +++++--
 .../analysis/manual/service/ServiceTraffic.java    | 10 ++++
 .../server/core/analysis/meter/MeterSystem.java    |  8 ++--
 .../analysis/meter/function/HistogramFunction.java |  9 ++++
 .../meter/function/PercentileFunction.java         | 56 +++++++++++++++++-----
 .../analysis/meter/function/avg/AvgFunction.java   | 12 +++++
 .../meter/function/avg/AvgHistogramFunction.java   | 11 +++++
 .../avg/AvgHistogramPercentileFunction.java        | 14 ++++++
 .../meter/function/avg/AvgLabeledFunction.java     | 12 +++++
 .../meter/function/latest/LatestFunction.java      | 25 ++++++++--
 .../analysis/meter/function/sum/SumFunction.java   | 13 ++++-
 .../server/core/analysis/metrics/ApdexMetrics.java | 10 +++-
 .../server/core/analysis/metrics/CPMMetrics.java   |  9 ++++
 .../server/core/analysis/metrics/CountMetrics.java |  8 ++++
 .../server/core/analysis/metrics/DataTable.java    | 16 ++++++-
 .../core/analysis/metrics/DoubleAvgMetrics.java    | 11 +++++
 .../core/analysis/metrics/HistogramMetrics.java    |  8 ++++
 .../oap/server/core/analysis/metrics/IntList.java  | 16 ++++++-
 .../core/analysis/metrics/LongAvgMetrics.java      | 10 ++++
 .../core/analysis/metrics/MaxDoubleMetrics.java    |  8 ++++
 .../core/analysis/metrics/MaxLongMetrics.java      |  8 ++++
 .../oap/server/core/analysis/metrics/Metrics.java  | 11 ++++-
 .../core/analysis/metrics/MinDoubleMetrics.java    |  8 ++++
 .../core/analysis/metrics/MinLongMetrics.java      |  8 ++++
 .../core/analysis/metrics/PercentMetrics.java      | 10 ++++
 .../core/analysis/metrics/PercentileMetrics.java   | 11 +++++
 .../server/core/analysis/metrics/PxxMetrics.java   | 11 +++++
 .../server/core/analysis/metrics/RateMetrics.java  | 10 ++++
 .../server/core/analysis/metrics/SumMetrics.java   |  8 ++++
 .../server/core/analysis/worker/ExportWorker.java  |  4 +-
 .../analysis/worker/MetricsAggregateWorker.java    |  8 ++--
 .../analysis/worker/MetricsPersistentWorker.java   | 29 +++++++----
 .../analysis/worker/MetricsStreamProcessor.java    |  3 +-
 .../oap/server/core/exporter/ExportEvent.java      | 11 ++---
 .../core/remote/client/GRPCRemoteClient.java       |  5 ++
 .../skywalking/oap/server/core/source/Event.java   | 18 +++++++
 .../endpoint/EndpointCallRelationTest.java         | 13 +++--
 .../instance/ServiceInstanceRelationTest.java      | 25 ++++++----
 .../relation/service/ServiceRelationTest.java      | 25 ++++++----
 .../meter/function/HistogramFunctionTest.java      | 21 ++++----
 .../function/avg/AvgHistogramFunctionTest.java     | 21 ++++----
 .../core/analysis/metrics/LongAvgMetricsTest.java  |  9 ++--
 .../core/analysis/metrics/MaxLongMetricsTest.java  |  9 ++--
 .../server/core/analysis/metrics/MetricsTest.java  | 16 +++++--
 68 files changed, 774 insertions(+), 178 deletions(-)

diff --git a/apm-commons/apm-datacarrier/src/main/java/org/apache/skywalking/apm/commons/datacarrier/consumer/BulkConsumePool.java b/apm-commons/apm-datacarrier/src/main/java/org/apache/skywalking/apm/commons/datacarrier/consumer/BulkConsumePool.java
index 2d2195d..0f182a9 100644
--- a/apm-commons/apm-datacarrier/src/main/java/org/apache/skywalking/apm/commons/datacarrier/consumer/BulkConsumePool.java
+++ b/apm-commons/apm-datacarrier/src/main/java/org/apache/skywalking/apm/commons/datacarrier/consumer/BulkConsumePool.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.apm.commons.datacarrier.consumer;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.Callable;
+import lombok.RequiredArgsConstructor;
 import org.apache.skywalking.apm.commons.datacarrier.EnvUtil;
 import org.apache.skywalking.apm.commons.datacarrier.buffer.Channels;
 
@@ -36,7 +37,7 @@ public class BulkConsumePool implements ConsumerPool {
 
     public BulkConsumePool(String name, int size, long consumeCycle) {
         size = EnvUtil.getInt(name + "_THREAD", size);
-        allConsumers = new ArrayList<MultipleChannelsConsumer>(size);
+        allConsumers = new ArrayList<>(size);
         for (int i = 0; i < size; i++) {
             MultipleChannelsConsumer multipleChannelsConsumer = new MultipleChannelsConsumer("DataCarrier." + name + ".BulkConsumePool." + i + ".Thread", consumeCycle);
             multipleChannelsConsumer.setDaemon(true);
@@ -95,16 +96,11 @@ public class BulkConsumePool implements ConsumerPool {
     /**
      * The creator for {@link BulkConsumePool}.
      */
+    @RequiredArgsConstructor
     public static class Creator implements Callable<ConsumerPool> {
-        private String name;
-        private int size;
-        private long consumeCycle;
-
-        public Creator(String name, int poolSize, long consumeCycle) {
-            this.name = name;
-            this.size = poolSize;
-            this.consumeCycle = consumeCycle;
-        }
+        private final String name;
+        private final int size;
+        private final long consumeCycle;
 
         @Override
         public ConsumerPool call() {
diff --git a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/Analyzer.java b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/Analyzer.java
index 5364b0c..37b0ef8 100644
--- a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/Analyzer.java
+++ b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/Analyzer.java
@@ -35,6 +35,7 @@ import org.apache.skywalking.oap.meter.analyzer.dsl.Result;
 import org.apache.skywalking.oap.meter.analyzer.dsl.Sample;
 import org.apache.skywalking.oap.meter.analyzer.dsl.SampleFamily;
 import org.apache.skywalking.oap.meter.analyzer.k8s.K8sInfoRegistry;
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
 import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
 import org.apache.skywalking.oap.server.core.analysis.manual.endpoint.EndpointTraffic;
@@ -285,7 +286,7 @@ public class Analyzer {
     }
 
     private void serverSide(MeterEntity entity) {
-        ServiceRelationServerSideMetrics metrics = new ServiceRelationServerSideMetrics();
+        ServiceRelationServerSideMetrics metrics = MetricsObjectPool.get(ServiceRelationServerSideMetrics.class);
         metrics.setTimeBucket(TimeBucket.getMinuteTimeBucket(System.currentTimeMillis()));
         metrics.setSourceServiceId(entity.sourceServiceId());
         metrics.setDestServiceId(entity.destServiceId());
@@ -295,7 +296,7 @@ public class Analyzer {
     }
 
     private void clientSide(MeterEntity entity) {
-        ServiceRelationClientSideMetrics metrics = new ServiceRelationClientSideMetrics();
+        ServiceRelationClientSideMetrics metrics = MetricsObjectPool.get(ServiceRelationClientSideMetrics.class);
         metrics.setTimeBucket(TimeBucket.getMinuteTimeBucket(System.currentTimeMillis()));
         metrics.setSourceServiceId(entity.sourceServiceId());
         metrics.setDestServiceId(entity.destServiceId());
diff --git a/oap-server/exporter/src/main/java/org/apache/skywalking/oap/server/exporter/provider/grpc/GRPCExporter.java b/oap-server/exporter/src/main/java/org/apache/skywalking/oap/server/exporter/provider/grpc/GRPCExporter.java
index 8758584..c209496 100644
--- a/oap-server/exporter/src/main/java/org/apache/skywalking/oap/server/exporter/provider/grpc/GRPCExporter.java
+++ b/oap-server/exporter/src/main/java/org/apache/skywalking/oap/server/exporter/provider/grpc/GRPCExporter.java
@@ -59,7 +59,7 @@ public class GRPCExporter extends MetricFormatter implements MetricValuesExportS
     private final GRPCExporterSetting setting;
     private final MetricExportServiceGrpc.MetricExportServiceStub exportServiceFutureStub;
     private final MetricExportServiceGrpc.MetricExportServiceBlockingStub blockingStub;
-    private final DataCarrier exportBuffer;
+    private final DataCarrier<ExportData> exportBuffer;
     private final ReentrantLock fetchListLock;
     private volatile List<SubscriptionMetric> subscriptionList;
     private volatile long lastFetchTimestamp = 0;
@@ -71,7 +71,7 @@ public class GRPCExporter extends MetricFormatter implements MetricValuesExportS
         ManagedChannel channel = client.getChannel();
         exportServiceFutureStub = MetricExportServiceGrpc.newStub(channel);
         blockingStub = MetricExportServiceGrpc.newBlockingStub(channel);
-        exportBuffer = new DataCarrier<ExportData>(setting.getBufferChannelNum(), setting.getBufferChannelSize());
+        exportBuffer = new DataCarrier<>(setting.getBufferChannelNum(), setting.getBufferChannelSize());
         exportBuffer.consume(this, 1, 200);
         subscriptionList = new ArrayList<>();
         fetchListLock = new ReentrantLock();
@@ -178,8 +178,9 @@ public class GRPCExporter extends MetricFormatter implements MetricValuesExportS
 
             MetricsMetaInfo meta = row.getMeta();
             builder.setMetricName(meta.getMetricsName());
-            builder.setEventType(
-                EventType.INCREMENT.equals(row.getEventType()) ? EventType.INCREMENT : EventType.TOTAL);
+            builder.setEventType(ExportEvent.EventType.INCREMENT == row.getEventType()
+                                     ? EventType.INCREMENT
+                                     : EventType.TOTAL);
             String entityName = getEntityName(meta);
             if (entityName == null) {
                 return;
@@ -191,6 +192,8 @@ public class GRPCExporter extends MetricFormatter implements MetricValuesExportS
 
             streamObserver.onNext(builder.build());
             exportNum.getAndIncrement();
+
+            metrics.recycle();
         });
 
         streamObserver.onCompleted();
diff --git a/oap-server/exporter/src/test/java/org/apache/skywalking/oap/server/exporter/provider/grpc/GRPCExporterTest.java b/oap-server/exporter/src/test/java/org/apache/skywalking/oap/server/exporter/provider/grpc/GRPCExporterTest.java
index de42ce7..b980f56 100644
--- a/oap-server/exporter/src/test/java/org/apache/skywalking/oap/server/exporter/provider/grpc/GRPCExporterTest.java
+++ b/oap-server/exporter/src/test/java/org/apache/skywalking/oap/server/exporter/provider/grpc/GRPCExporterTest.java
@@ -22,6 +22,7 @@ import io.grpc.testing.GrpcServerRule;
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.metrics.MetricsMetaInfo;
 import org.apache.skywalking.oap.server.core.analysis.metrics.WithMetadata;
 import org.apache.skywalking.oap.server.core.exporter.ExportData;
@@ -60,7 +61,7 @@ public class GRPCExporterTest {
 
     @Test
     public void export() {
-        ExportEvent event = new ExportEvent(new MockExporterMetrics(), ExportEvent.EventType.TOTAL);
+        ExportEvent event = new ExportEvent(MetricsObjectPool.get(MockExporterMetrics.class), ExportEvent.EventType.TOTAL);
         exporter.export(event);
     }
 
@@ -102,10 +103,10 @@ public class GRPCExporterTest {
 
     private List<ExportData> dataList() {
         List<ExportData> dataList = new LinkedList<>();
-        dataList.add(new ExportData(metaInfo, new MockMetrics(), INCREMENT));
-        dataList.add(new ExportData(metaInfo, new MockIntValueMetrics(), INCREMENT));
-        dataList.add(new ExportData(metaInfo, new MockLongValueMetrics(), INCREMENT));
-        dataList.add(new ExportData(metaInfo, new MockDoubleValueMetrics(), INCREMENT));
+        dataList.add(new ExportData(metaInfo, MetricsObjectPool.get(MockMetrics.class), INCREMENT));
+        dataList.add(new ExportData(metaInfo, MetricsObjectPool.get(MockIntValueMetrics.class), INCREMENT));
+        dataList.add(new ExportData(metaInfo, MetricsObjectPool.get(MockLongValueMetrics.class), INCREMENT));
+        dataList.add(new ExportData(metaInfo, MetricsObjectPool.get(MockDoubleValueMetrics.class), INCREMENT));
         return dataList;
     }
-}
\ No newline at end of file
+}
diff --git a/oap-server/exporter/src/test/java/org/apache/skywalking/oap/server/exporter/provider/grpc/MockMetrics.java b/oap-server/exporter/src/test/java/org/apache/skywalking/oap/server/exporter/provider/grpc/MockMetrics.java
index 6a55802..8da3c2d 100644
--- a/oap-server/exporter/src/test/java/org/apache/skywalking/oap/server/exporter/provider/grpc/MockMetrics.java
+++ b/oap-server/exporter/src/test/java/org/apache/skywalking/oap/server/exporter/provider/grpc/MockMetrics.java
@@ -62,4 +62,9 @@ public class MockMetrics extends Metrics {
     public RemoteData.Builder serialize() {
         return null;
     }
+
+    @Override
+    public void recycle() {
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/oal-rt/src/main/resources/code-templates/dispatcher/doMetrics.ftl b/oap-server/oal-rt/src/main/resources/code-templates/dispatcher/doMetrics.ftl
index 6312960..4521f1a 100644
--- a/oap-server/oal-rt/src/main/resources/code-templates/dispatcher/doMetrics.ftl
+++ b/oap-server/oal-rt/src/main/resources/code-templates/dispatcher/doMetrics.ftl
@@ -8,7 +8,7 @@ private void do${metricsName}(${sourcePackage}${sourceName} source) {
     </#list>
 </#if>
 
-${metricsClassPackage}${metricsName}Metrics metrics = new ${metricsClassPackage}${metricsName}Metrics();
+${metricsClassPackage}${metricsName}Metrics metrics = org.apache.skywalking.oap.server.core.MetricsObjectPool.get(${metricsClassPackage}${metricsName}Metrics.class);
 metrics.setTimeBucket(source.getTimeBucket());
 <#list fieldsFromSource as field>
     metrics.${field.fieldSetter}(source.${field.fieldGetter}());
diff --git a/oap-server/oal-rt/src/main/resources/code-templates/metrics-builder/storage2Entity.ftl b/oap-server/oal-rt/src/main/resources/code-templates/metrics-builder/storage2Entity.ftl
index e8f71c9..577b53f 100644
--- a/oap-server/oal-rt/src/main/resources/code-templates/metrics-builder/storage2Entity.ftl
+++ b/oap-server/oal-rt/src/main/resources/code-templates/metrics-builder/storage2Entity.ftl
@@ -1,5 +1,5 @@
 public org.apache.skywalking.oap.server.core.storage.StorageData storage2Entity(java.util.Map dbMap) {
-${metricsClassPackage}${metricsName}Metrics metrics = new ${metricsClassPackage}${metricsName}Metrics();
+${metricsClassPackage}${metricsName}Metrics metrics = org.apache.skywalking.oap.server.core.MetricsObjectPool.get(${metricsClassPackage}${metricsName}Metrics.class);
 <#list fieldsFromSource as field>
     <#if field.typeName == "long" || field.typeName == "int" || field.typeName == "double" || field.typeName == "float">
         metrics.${field.fieldSetter}(((Number)dbMap.get("${field.columnName}")).${field.typeName}Value());
@@ -19,4 +19,4 @@ ${metricsClassPackage}${metricsName}Metrics metrics = new ${metricsClassPackage}
     </#if>
 </#list>
 return metrics;
-}
\ No newline at end of file
+}
diff --git a/oap-server/oal-rt/src/main/resources/code-templates/metrics/toDay.ftl b/oap-server/oal-rt/src/main/resources/code-templates/metrics/toDay.ftl
index e3c5bf9..ea516f7 100644
--- a/oap-server/oal-rt/src/main/resources/code-templates/metrics/toDay.ftl
+++ b/oap-server/oal-rt/src/main/resources/code-templates/metrics/toDay.ftl
@@ -1,5 +1,5 @@
 public org.apache.skywalking.oap.server.core.analysis.metrics.Metrics toDay() {
-${metricsClassPackage}${metricsName}Metrics metrics = new ${metricsClassPackage}${metricsName}Metrics();
+${metricsClassPackage}${metricsName}Metrics metrics = org.apache.skywalking.oap.server.core.MetricsObjectPool.get(${metricsClassPackage}${metricsName}Metrics.class);
 <#list fieldsFromSource as field>
     <#if field.columnName == "time_bucket">
         metrics.setTimeBucket(toTimeBucketInDay());
@@ -23,4 +23,4 @@ ${metricsClassPackage}${metricsName}Metrics metrics = new ${metricsClassPackage}
     </#if>
 </#list>
 return metrics;
-}
\ No newline at end of file
+}
diff --git a/oap-server/oal-rt/src/main/resources/code-templates/metrics/toHour.ftl b/oap-server/oal-rt/src/main/resources/code-templates/metrics/toHour.ftl
index b0bddbd..e1d2b3b 100644
--- a/oap-server/oal-rt/src/main/resources/code-templates/metrics/toHour.ftl
+++ b/oap-server/oal-rt/src/main/resources/code-templates/metrics/toHour.ftl
@@ -1,5 +1,5 @@
 public org.apache.skywalking.oap.server.core.analysis.metrics.Metrics toHour() {
-${metricsClassPackage}${metricsName}Metrics metrics = new ${metricsClassPackage}${metricsName}Metrics();
+${metricsClassPackage}${metricsName}Metrics metrics = org.apache.skywalking.oap.server.core.MetricsObjectPool.get(${metricsClassPackage}${metricsName}Metrics.class);
 <#list fieldsFromSource as field>
     <#if field.columnName == "time_bucket">
         metrics.setTimeBucket(toTimeBucketInHour());
@@ -23,4 +23,4 @@ ${metricsClassPackage}${metricsName}Metrics metrics = new ${metricsClassPackage}
     </#if>
 </#list>
 return metrics;
-}
\ No newline at end of file
+}
diff --git a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandlerTest.java b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandlerTest.java
index 4d252e0..28ac029 100644
--- a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandlerTest.java
+++ b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandlerTest.java
@@ -309,7 +309,7 @@ public class NotifyHandlerTest {
         Whitebox.setInternalState(notifyHandler, "core", core);
     }
 
-    private abstract class MockMetrics extends Metrics implements WithMetadata {
+    private abstract static class MockMetrics extends Metrics implements WithMetadata {
 
     }
-}
\ No newline at end of file
+}
diff --git a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRuleTest.java b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRuleTest.java
index 2802722..8c9ed1e 100644
--- a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRuleTest.java
+++ b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRuleTest.java
@@ -27,6 +27,7 @@ import java.util.Objects;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.Const;
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.alarm.AlarmCallback;
 import org.apache.skywalking.oap.server.core.alarm.AlarmMessage;
 import org.apache.skywalking.oap.server.core.alarm.MetaInAlarm;
@@ -50,7 +51,7 @@ import org.powermock.reflect.Whitebox;
  * So in this test, we need to simulate a lot of scenario to see the reactions.
  */
 public class RunningRuleTest {
-    private static DateTimeFormatter TIME_BUCKET_FORMATTER = DateTimeFormat.forPattern("yyyyMMddHHmm");
+    private static final DateTimeFormatter TIME_BUCKET_FORMATTER = DateTimeFormat.forPattern("yyyyMMddHHmm");
 
     @Test
     public void testInitAndStart() {
@@ -404,14 +405,15 @@ public class RunningRuleTest {
     }
 
     private Metrics getMetrics(long timeBucket, int value) {
-        MockMetrics mockMetrics = new MockMetrics();
+        MockMetrics mockMetrics = MetricsObjectPool.get(MockMetrics.class);
         mockMetrics.setValue(value);
         mockMetrics.setTimeBucket(timeBucket);
         return mockMetrics;
     }
 
     private Metrics getMultipleValueMetrics(long timeBucket, int... values) {
-        MockMultipleValueMetrics mockMultipleValueMetrics = new MockMultipleValueMetrics();
+        MockMultipleValueMetrics mockMultipleValueMetrics =
+            MetricsObjectPool.get(MockMultipleValueMetrics.class);
         mockMultipleValueMetrics.setValues(values);
         mockMultipleValueMetrics.setTimeBucket(timeBucket);
         return mockMultipleValueMetrics;
@@ -419,13 +421,14 @@ public class RunningRuleTest {
     }
 
     private Metrics getLabeledValueMetrics(long timeBucket, String values) {
-        MockLabeledValueMetrics mockLabeledValueMetrics = new MockLabeledValueMetrics();
+        MockLabeledValueMetrics mockLabeledValueMetrics =
+            MetricsObjectPool.get(MockLabeledValueMetrics.class);
         mockLabeledValueMetrics.setValue(new DataTable(values));
         mockLabeledValueMetrics.setTimeBucket(timeBucket);
         return mockLabeledValueMetrics;
     }
 
-    private class MockMetrics extends Metrics implements IntValueHolder {
+    public static class MockMetrics extends Metrics implements IntValueHolder {
         private int value;
 
         @Override
@@ -476,9 +479,17 @@ public class RunningRuleTest {
         public int remoteHashCode() {
             return 0;
         }
+
+        @Override
+        public void recycle() {
+            this.value = 0;
+            setTimeBucket(0);
+            setLastUpdateTimestamp(0);
+            handle.recycle(this);
+        }
     }
 
-    private class MockMultipleValueMetrics extends Metrics implements MultiIntValuesHolder {
+    public static class MockMultipleValueMetrics extends Metrics implements MultiIntValuesHolder {
         private int[] values;
 
         public void setValues(int[] values) {
@@ -529,9 +540,17 @@ public class RunningRuleTest {
         public RemoteData.Builder serialize() {
             return null;
         }
+
+        @Override
+        public void recycle() {
+            this.values = null;
+            setTimeBucket(0);
+            setLastUpdateTimestamp(0);
+            handle.recycle(this);
+        }
     }
 
-    private class MockLabeledValueMetrics extends Metrics implements LabeledValueHolder {
+    public static class MockLabeledValueMetrics extends Metrics implements LabeledValueHolder {
 
         @Getter
         @Setter
@@ -576,6 +595,14 @@ public class RunningRuleTest {
         public RemoteData.Builder serialize() {
             return null;
         }
+
+        @Override
+        public void recycle() {
+            this.value.recycle();
+            setTimeBucket(0);
+            setLastUpdateTimestamp(0);
+            handle.recycle(this);
+        }
     }
 
     private void assertLabeled(AlarmRule alarmRule) {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/MetricsObjectPool.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/MetricsObjectPool.java
new file mode 100644
index 0000000..d6a3966
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/MetricsObjectPool.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.skywalking.oap.server.core;
+
+import io.netty.util.internal.ObjectPool;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics;
+
+@Slf4j
+public final class MetricsObjectPool {
+    private static final Map<Class<? extends Metrics>, ObjectPool<Metrics>> POOLS =
+        new ConcurrentHashMap<>();
+
+    @SuppressWarnings("unchecked")
+    public static <T extends Metrics> T get(Class<T> type) {
+        final ObjectPool<Metrics> pool = POOLS.computeIfAbsent(type, __ -> ObjectPool.newPool(
+            handle -> {
+                try {
+                    final Metrics m = type.getDeclaredConstructor().newInstance();
+                    m.handle(handle);
+                    return m;
+                } catch (Exception e) {
+                    log.error("Failed to create object for {}", type, e);
+                    throw new RuntimeException(e);
+                }
+            })
+        );
+        return (T) pool.get();
+    }
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/Recyclable.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/Recyclable.java
new file mode 100644
index 0000000..6b50c48
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/Recyclable.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.skywalking.oap.server.core;
+
+import io.netty.util.internal.ObjectPool;
+
+public interface Recyclable<T> {
+    void handle(ObjectPool.Handle<T> handle);
+
+    void recycle();
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/data/MergableBufferedData.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/data/MergableBufferedData.java
index 501135d..687d891 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/data/MergableBufferedData.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/data/MergableBufferedData.java
@@ -18,10 +18,10 @@
 
 package org.apache.skywalking.oap.server.core.analysis.data;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics;
 
 /**
@@ -61,7 +61,7 @@ public class MergableBufferedData<METRICS extends Metrics> implements BufferedDa
     @Override
     public List<METRICS> read() {
         try {
-            return buffer.values().stream().collect(Collectors.toList());
+            return new ArrayList<>(buffer.values());
         } finally {
             buffer.clear();
         }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTraffic.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTraffic.java
index e302904..05355f9 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTraffic.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTraffic.java
@@ -44,12 +44,14 @@ public class EndpointTraffic extends Metrics {
     public static final String INDEX_NAME = "endpoint_traffic";
 
     public static final String SERVICE_ID = "service_id";
+
     public static final String NAME = "name";
 
     @Setter
     @Getter
     @Column(columnName = SERVICE_ID)
     private String serviceId;
+
     @Setter
     @Getter
     @Column(columnName = NAME, matchQuery = true)
@@ -86,6 +88,15 @@ public class EndpointTraffic extends Metrics {
         return hashCode();
     }
 
+    @Override
+    public void recycle() {
+        this.serviceId = null;
+        this.name = Const.EMPTY_STRING;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
+
     public static class Builder implements StorageHashMapBuilder<EndpointTraffic> {
 
         @Override
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/instance/InstanceTraffic.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/instance/InstanceTraffic.java
index e66595b..0f972a2 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/instance/InstanceTraffic.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/instance/InstanceTraffic.java
@@ -79,7 +79,7 @@ public class InstanceTraffic extends Metrics {
         if (instanceTraffic.getProperties() != null && instanceTraffic.getProperties().size() > 0) {
             this.properties = instanceTraffic.getProperties();
         }
-        /**
+        /*
          * Keep the time bucket as the same time inserted.
          */
         if (this.getTimeBucket() > metrics.getTimeBucket()) {
@@ -125,6 +125,17 @@ public class InstanceTraffic extends Metrics {
         return IDManager.ServiceInstanceID.buildId(serviceId, name);
     }
 
+    @Override
+    public void recycle() {
+        this.serviceId = null;
+        this.name = null;
+        this.lastPingTimestamp = 0;
+        this.properties = null;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
+
     public static class Builder implements StorageHashMapBuilder<InstanceTraffic> {
         @Override
         public InstanceTraffic storage2Entity(final Map<String, Object> dbMap) {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/networkalias/NetworkAddressAlias.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/networkalias/NetworkAddressAlias.java
index 75b3ff7..964f7f6 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/networkalias/NetworkAddressAlias.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/networkalias/NetworkAddressAlias.java
@@ -72,7 +72,7 @@ public class NetworkAddressAlias extends Metrics {
         this.representServiceId = alias.getRepresentServiceId();
         this.representServiceInstanceId = alias.getRepresentServiceInstanceId();
         this.lastUpdateTimeBucket = alias.getLastUpdateTimeBucket();
-        /**
+        /*
          * Keep the time bucket as the same time inserted.
          */
         if (this.getTimeBucket() > metrics.getTimeBucket()) {
@@ -113,6 +113,17 @@ public class NetworkAddressAlias extends Metrics {
         return builder;
     }
 
+    @Override
+    public void recycle() {
+        this.address = null;
+        this.representServiceId = null;
+        this.representServiceInstanceId = null;
+        this.lastUpdateTimeBucket = 0;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
+
     public static class Builder implements StorageHashMapBuilder<NetworkAddressAlias> {
         @Override
         public NetworkAddressAlias storage2Entity(final Map<String, Object> dbMap) {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointCallRelationDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointCallRelationDispatcher.java
index 562b27e..5f162f1 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointCallRelationDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointCallRelationDispatcher.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.analysis.manual.relation.endpoint;
 
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
 import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
@@ -35,7 +36,7 @@ public class EndpointCallRelationDispatcher implements SourceDispatcher<Endpoint
     }
 
     private void serverSide(EndpointRelation source) {
-        EndpointRelationServerSideMetrics metrics = new EndpointRelationServerSideMetrics();
+        EndpointRelationServerSideMetrics metrics = MetricsObjectPool.get(EndpointRelationServerSideMetrics.class);
         metrics.setTimeBucket(source.getTimeBucket());
         metrics.setSourceEndpoint(
             IDManager.EndpointID.buildId(source.getServiceId(), source.getEndpoint()));
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointRelationServerSideMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointRelationServerSideMetrics.java
index 1feb1af..4be9f8f 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointRelationServerSideMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointRelationServerSideMetrics.java
@@ -24,6 +24,7 @@ import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.Const;
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.Stream;
 import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics;
 import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
@@ -80,7 +81,7 @@ public class EndpointRelationServerSideMetrics extends Metrics {
 
     @Override
     public Metrics toHour() {
-        EndpointRelationServerSideMetrics metrics = new EndpointRelationServerSideMetrics();
+        EndpointRelationServerSideMetrics metrics = MetricsObjectPool.get(EndpointRelationServerSideMetrics.class);
         metrics.setTimeBucket(toTimeBucketInHour());
         metrics.setSourceEndpoint(getSourceEndpoint());
         metrics.setDestEndpoint(getDestEndpoint());
@@ -91,7 +92,7 @@ public class EndpointRelationServerSideMetrics extends Metrics {
 
     @Override
     public Metrics toDay() {
-        EndpointRelationServerSideMetrics metrics = new EndpointRelationServerSideMetrics();
+        EndpointRelationServerSideMetrics metrics = MetricsObjectPool.get(EndpointRelationServerSideMetrics.class);
         metrics.setTimeBucket(toTimeBucketInDay());
         metrics.setSourceEndpoint(getSourceEndpoint());
         metrics.setDestEndpoint(getDestEndpoint());
@@ -132,11 +133,22 @@ public class EndpointRelationServerSideMetrics extends Metrics {
         return remoteBuilder;
     }
 
+    @Override
+    public void recycle() {
+        this.sourceEndpoint = null;
+        this.destEndpoint = null;
+        this.componentId = 0;
+        this.entityId = null;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
+
     public static class Builder implements StorageHashMapBuilder<EndpointRelationServerSideMetrics> {
 
         @Override
         public EndpointRelationServerSideMetrics storage2Entity(Map<String, Object> dbMap) {
-            EndpointRelationServerSideMetrics metrics = new EndpointRelationServerSideMetrics();
+            EndpointRelationServerSideMetrics metrics = MetricsObjectPool.get(EndpointRelationServerSideMetrics.class);
             metrics.setSourceEndpoint((String) dbMap.get(SOURCE_ENDPOINT));
             metrics.setDestEndpoint((String) dbMap.get(DEST_ENDPOINT));
             metrics.setComponentId(((Number) dbMap.get(COMPONENT_ID)).intValue());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceCallRelationDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceCallRelationDispatcher.java
index 19fd61a..c086fb9 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceCallRelationDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceCallRelationDispatcher.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.analysis.manual.relation.instance;
 
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
 import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
 import org.apache.skywalking.oap.server.core.source.ServiceInstanceRelation;
@@ -37,7 +38,8 @@ public class ServiceInstanceCallRelationDispatcher implements SourceDispatcher<S
     }
 
     private void serverSide(ServiceInstanceRelation source) {
-        ServiceInstanceRelationServerSideMetrics metrics = new ServiceInstanceRelationServerSideMetrics();
+        ServiceInstanceRelationServerSideMetrics metrics =
+            MetricsObjectPool.get(ServiceInstanceRelationServerSideMetrics.class);
         metrics.setTimeBucket(source.getTimeBucket());
         metrics.setSourceServiceId(source.getSourceServiceId());
         metrics.setSourceServiceInstanceId(source.getSourceServiceInstanceId());
@@ -49,7 +51,8 @@ public class ServiceInstanceCallRelationDispatcher implements SourceDispatcher<S
     }
 
     private void clientSide(ServiceInstanceRelation source) {
-        ServiceInstanceRelationClientSideMetrics metrics = new ServiceInstanceRelationClientSideMetrics();
+        ServiceInstanceRelationClientSideMetrics metrics =
+            MetricsObjectPool.get(ServiceInstanceRelationClientSideMetrics.class);
         metrics.setTimeBucket(source.getTimeBucket());
         metrics.setSourceServiceId(source.getSourceServiceId());
         metrics.setSourceServiceInstanceId(source.getSourceServiceInstanceId());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationClientSideMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationClientSideMetrics.java
index 1a49b98..d2ff768 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationClientSideMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationClientSideMetrics.java
@@ -24,6 +24,7 @@ import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.Const;
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.Stream;
 import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics;
 import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
@@ -32,40 +33,53 @@ import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 import org.apache.skywalking.oap.server.core.storage.StorageHashMapBuilder;
 import org.apache.skywalking.oap.server.core.storage.annotation.Column;
 
-@Stream(name = ServiceInstanceRelationClientSideMetrics.INDEX_NAME, scopeId = DefaultScopeDefine.SERVICE_INSTANCE_RELATION,
-    builder = ServiceInstanceRelationClientSideMetrics.Builder.class, processor = MetricsStreamProcessor.class)
+@Stream(
+    name = ServiceInstanceRelationClientSideMetrics.INDEX_NAME,
+    scopeId = DefaultScopeDefine.SERVICE_INSTANCE_RELATION,
+    builder = ServiceInstanceRelationClientSideMetrics.Builder.class,
+    processor = MetricsStreamProcessor.class)
 @EqualsAndHashCode(of = {
     "entityId"
 }, callSuper = true)
 public class ServiceInstanceRelationClientSideMetrics extends Metrics {
 
     public static final String INDEX_NAME = "service_instance_relation_client_side";
+
     public static final String SOURCE_SERVICE_ID = "source_service_id";
+
     public static final String SOURCE_SERVICE_INSTANCE_ID = "source_service_instance_id";
+
     public static final String DEST_SERVICE_ID = "dest_service_id";
+
     public static final String DEST_SERVICE_INSTANCE_ID = "dest_service_instance_id";
+
     public static final String COMPONENT_ID = "component_id";
 
     @Setter
     @Getter
     @Column(columnName = SOURCE_SERVICE_ID)
     private String sourceServiceId;
+
     @Setter
     @Getter
     @Column(columnName = SOURCE_SERVICE_INSTANCE_ID)
     private String sourceServiceInstanceId;
+
     @Setter
     @Getter
     @Column(columnName = DEST_SERVICE_ID)
     private String destServiceId;
+
     @Setter
     @Getter
     @Column(columnName = DEST_SERVICE_INSTANCE_ID)
     private String destServiceInstanceId;
+
     @Setter
     @Getter
     @Column(columnName = COMPONENT_ID, storageOnly = true)
     private int componentId;
+
     @Setter
     @Getter
     @Column(columnName = ENTITY_ID, length = 512)
@@ -88,7 +102,8 @@ public class ServiceInstanceRelationClientSideMetrics extends Metrics {
 
     @Override
     public Metrics toHour() {
-        ServiceInstanceRelationClientSideMetrics metrics = new ServiceInstanceRelationClientSideMetrics();
+        ServiceInstanceRelationClientSideMetrics metrics =
+            MetricsObjectPool.get(ServiceInstanceRelationClientSideMetrics.class);
         metrics.setTimeBucket(toTimeBucketInHour());
         metrics.setSourceServiceId(getSourceServiceId());
         metrics.setSourceServiceInstanceId(getSourceServiceInstanceId());
@@ -101,7 +116,8 @@ public class ServiceInstanceRelationClientSideMetrics extends Metrics {
 
     @Override
     public Metrics toDay() {
-        ServiceInstanceRelationClientSideMetrics metrics = new ServiceInstanceRelationClientSideMetrics();
+        ServiceInstanceRelationClientSideMetrics metrics =
+            MetricsObjectPool.get(ServiceInstanceRelationClientSideMetrics.class);
         metrics.setTimeBucket(toTimeBucketInDay());
         metrics.setSourceServiceId(getSourceServiceId());
         metrics.setSourceServiceInstanceId(getSourceServiceInstanceId());
@@ -148,11 +164,26 @@ public class ServiceInstanceRelationClientSideMetrics extends Metrics {
         return remoteBuilder;
     }
 
-    public static class Builder implements StorageHashMapBuilder<ServiceInstanceRelationClientSideMetrics> {
+    @Override
+    public void recycle() {
+        this.sourceServiceId = null;
+        this.sourceServiceInstanceId = null;
+        this.destServiceId = null;
+        this.destServiceInstanceId = null;
+        this.componentId = 0;
+        this.entityId = null;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
+
+    public static class Builder
+        implements StorageHashMapBuilder<ServiceInstanceRelationClientSideMetrics> {
 
         @Override
         public ServiceInstanceRelationClientSideMetrics storage2Entity(Map<String, Object> dbMap) {
-            ServiceInstanceRelationClientSideMetrics metrics = new ServiceInstanceRelationClientSideMetrics();
+            ServiceInstanceRelationClientSideMetrics metrics =
+                MetricsObjectPool.get(ServiceInstanceRelationClientSideMetrics.class);
             metrics.setEntityId((String) dbMap.get(ENTITY_ID));
             metrics.setSourceServiceId((String) dbMap.get(SOURCE_SERVICE_ID));
             metrics.setSourceServiceInstanceId((String) dbMap.get(SOURCE_SERVICE_INSTANCE_ID));
@@ -164,7 +195,8 @@ public class ServiceInstanceRelationClientSideMetrics extends Metrics {
         }
 
         @Override
-        public Map<String, Object> entity2Storage(ServiceInstanceRelationClientSideMetrics storageData) {
+        public Map<String, Object> entity2Storage(
+            ServiceInstanceRelationClientSideMetrics storageData) {
             Map<String, Object> map = new HashMap<>();
             map.put(ENTITY_ID, storageData.getEntityId());
             map.put(SOURCE_SERVICE_ID, storageData.getSourceServiceId());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationServerSideMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationServerSideMetrics.java
index 97fc99d..a21723b 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationServerSideMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationServerSideMetrics.java
@@ -24,6 +24,7 @@ import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.Const;
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.Stream;
 import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics;
 import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
@@ -32,40 +33,53 @@ import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 import org.apache.skywalking.oap.server.core.storage.StorageHashMapBuilder;
 import org.apache.skywalking.oap.server.core.storage.annotation.Column;
 
-@Stream(name = ServiceInstanceRelationServerSideMetrics.INDEX_NAME, scopeId = DefaultScopeDefine.SERVICE_INSTANCE_RELATION,
-    builder = ServiceInstanceRelationServerSideMetrics.Builder.class, processor = MetricsStreamProcessor.class)
+@Stream(
+    name = ServiceInstanceRelationServerSideMetrics.INDEX_NAME,
+    scopeId = DefaultScopeDefine.SERVICE_INSTANCE_RELATION,
+    builder = ServiceInstanceRelationServerSideMetrics.Builder.class,
+    processor = MetricsStreamProcessor.class)
 @EqualsAndHashCode(of = {
     "entityId"
 }, callSuper = true)
 public class ServiceInstanceRelationServerSideMetrics extends Metrics {
 
     public static final String INDEX_NAME = "service_instance_relation_server_side";
+
     public static final String SOURCE_SERVICE_ID = "source_service_id";
+
     public static final String SOURCE_SERVICE_INSTANCE_ID = "source_service_instance_id";
+
     public static final String DEST_SERVICE_ID = "dest_service_id";
+
     public static final String DEST_SERVICE_INSTANCE_ID = "dest_service_instance_id";
+
     public static final String COMPONENT_ID = "component_id";
 
     @Setter
     @Getter
     @Column(columnName = SOURCE_SERVICE_ID)
     private String sourceServiceId;
+
     @Setter
     @Getter
     @Column(columnName = SOURCE_SERVICE_INSTANCE_ID)
     private String sourceServiceInstanceId;
+
     @Setter
     @Getter
     @Column(columnName = DEST_SERVICE_ID)
     private String destServiceId;
+
     @Setter
     @Getter
     @Column(columnName = DEST_SERVICE_INSTANCE_ID)
     private String destServiceInstanceId;
+
     @Setter
     @Getter
     @Column(columnName = COMPONENT_ID, storageOnly = true)
     private int componentId;
+
     @Setter
     @Getter
     @Column(columnName = ENTITY_ID, length = 512)
@@ -88,7 +102,8 @@ public class ServiceInstanceRelationServerSideMetrics extends Metrics {
 
     @Override
     public Metrics toHour() {
-        ServiceInstanceRelationServerSideMetrics metrics = new ServiceInstanceRelationServerSideMetrics();
+        ServiceInstanceRelationServerSideMetrics metrics =
+            MetricsObjectPool.get(ServiceInstanceRelationServerSideMetrics.class);
         metrics.setTimeBucket(toTimeBucketInHour());
         metrics.setSourceServiceId(getSourceServiceId());
         metrics.setSourceServiceInstanceId(getSourceServiceInstanceId());
@@ -101,7 +116,8 @@ public class ServiceInstanceRelationServerSideMetrics extends Metrics {
 
     @Override
     public Metrics toDay() {
-        ServiceInstanceRelationServerSideMetrics metrics = new ServiceInstanceRelationServerSideMetrics();
+        ServiceInstanceRelationServerSideMetrics metrics =
+            MetricsObjectPool.get(ServiceInstanceRelationServerSideMetrics.class);
         metrics.setTimeBucket(toTimeBucketInDay());
         metrics.setSourceServiceId(getSourceServiceId());
         metrics.setSourceServiceInstanceId(getSourceServiceInstanceId());
@@ -148,11 +164,26 @@ public class ServiceInstanceRelationServerSideMetrics extends Metrics {
         return remoteBuilder;
     }
 
-    public static class Builder implements StorageHashMapBuilder<ServiceInstanceRelationServerSideMetrics> {
+    @Override
+    public void recycle() {
+        this.sourceServiceId = null;
+        this.sourceServiceInstanceId = null;
+        this.destServiceId = null;
+        this.destServiceInstanceId = null;
+        this.componentId = 0;
+        this.entityId = null;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
+
+    public static class Builder
+        implements StorageHashMapBuilder<ServiceInstanceRelationServerSideMetrics> {
 
         @Override
         public ServiceInstanceRelationServerSideMetrics storage2Entity(Map<String, Object> dbMap) {
-            ServiceInstanceRelationServerSideMetrics metrics = new ServiceInstanceRelationServerSideMetrics();
+            ServiceInstanceRelationServerSideMetrics metrics =
+                MetricsObjectPool.get(ServiceInstanceRelationServerSideMetrics.class);
             metrics.setEntityId((String) dbMap.get(ENTITY_ID));
             metrics.setSourceServiceId((String) dbMap.get(SOURCE_SERVICE_ID));
             metrics.setSourceServiceInstanceId((String) dbMap.get(SOURCE_SERVICE_INSTANCE_ID));
@@ -164,7 +195,8 @@ public class ServiceInstanceRelationServerSideMetrics extends Metrics {
         }
 
         @Override
-        public Map<String, Object> entity2Storage(ServiceInstanceRelationServerSideMetrics storageData) {
+        public Map<String, Object> entity2Storage(
+            ServiceInstanceRelationServerSideMetrics storageData) {
             Map<String, Object> map = new HashMap<>();
             map.put(ENTITY_ID, storageData.getEntityId());
             map.put(SOURCE_SERVICE_ID, storageData.getSourceServiceId());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceCallRelationDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceCallRelationDispatcher.java
index 867f546..d609bb3 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceCallRelationDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceCallRelationDispatcher.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.analysis.manual.relation.service;
 
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
 import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
 import org.apache.skywalking.oap.server.core.source.ServiceRelation;
@@ -37,7 +38,7 @@ public class ServiceCallRelationDispatcher implements SourceDispatcher<ServiceRe
     }
 
     private void serverSide(ServiceRelation source) {
-        ServiceRelationServerSideMetrics metrics = new ServiceRelationServerSideMetrics();
+        ServiceRelationServerSideMetrics metrics = MetricsObjectPool.get(ServiceRelationServerSideMetrics.class);
         metrics.setTimeBucket(source.getTimeBucket());
         metrics.setSourceServiceId(source.getSourceServiceId());
         metrics.setDestServiceId(source.getDestServiceId());
@@ -47,7 +48,7 @@ public class ServiceCallRelationDispatcher implements SourceDispatcher<ServiceRe
     }
 
     private void clientSide(ServiceRelation source) {
-        ServiceRelationClientSideMetrics metrics = new ServiceRelationClientSideMetrics();
+        ServiceRelationClientSideMetrics metrics = MetricsObjectPool.get(ServiceRelationClientSideMetrics.class);
         metrics.setTimeBucket(source.getTimeBucket());
         metrics.setSourceServiceId(source.getSourceServiceId());
         metrics.setDestServiceId(source.getDestServiceId());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationClientSideMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationClientSideMetrics.java
index 4bacf15..e8d02c8 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationClientSideMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationClientSideMetrics.java
@@ -24,6 +24,7 @@ import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.Const;
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.Stream;
 import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics;
 import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
@@ -85,7 +86,7 @@ public class ServiceRelationClientSideMetrics extends Metrics {
 
     @Override
     public Metrics toHour() {
-        ServiceRelationClientSideMetrics metrics = new ServiceRelationClientSideMetrics();
+        ServiceRelationClientSideMetrics metrics = MetricsObjectPool.get(ServiceRelationClientSideMetrics.class);
         metrics.setEntityId(getEntityId());
         metrics.setTimeBucket(toTimeBucketInHour());
         metrics.setSourceServiceId(getSourceServiceId());
@@ -96,7 +97,7 @@ public class ServiceRelationClientSideMetrics extends Metrics {
 
     @Override
     public Metrics toDay() {
-        ServiceRelationClientSideMetrics metrics = new ServiceRelationClientSideMetrics();
+        ServiceRelationClientSideMetrics metrics = MetricsObjectPool.get(ServiceRelationClientSideMetrics.class);
         metrics.setEntityId(getEntityId());
         metrics.setTimeBucket(toTimeBucketInDay());
         metrics.setSourceServiceId(getSourceServiceId());
@@ -136,11 +137,22 @@ public class ServiceRelationClientSideMetrics extends Metrics {
         return remoteBuilder;
     }
 
+    @Override
+    public void recycle() {
+        this.sourceServiceId = null;
+        this.destServiceId = null;
+        this.componentId = 0;
+        this.entityId = null;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
+
     public static class Builder implements StorageHashMapBuilder<ServiceRelationClientSideMetrics> {
 
         @Override
         public ServiceRelationClientSideMetrics storage2Entity(Map<String, Object> dbMap) {
-            ServiceRelationClientSideMetrics metrics = new ServiceRelationClientSideMetrics();
+            ServiceRelationClientSideMetrics metrics = MetricsObjectPool.get(ServiceRelationClientSideMetrics.class);
             metrics.setSourceServiceId((String) dbMap.get(SOURCE_SERVICE_ID));
             metrics.setDestServiceId((String) dbMap.get(DEST_SERVICE_ID));
             metrics.setComponentId(((Number) dbMap.get(COMPONENT_ID)).intValue());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationServerSideMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationServerSideMetrics.java
index 5e66b00..748d63c 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationServerSideMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationServerSideMetrics.java
@@ -24,6 +24,7 @@ import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.Const;
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.Stream;
 import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics;
 import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
@@ -78,7 +79,7 @@ public class ServiceRelationServerSideMetrics extends Metrics {
 
     @Override
     public Metrics toHour() {
-        ServiceRelationServerSideMetrics metrics = new ServiceRelationServerSideMetrics();
+        ServiceRelationServerSideMetrics metrics = MetricsObjectPool.get(ServiceRelationServerSideMetrics.class);
         metrics.setTimeBucket(toTimeBucketInHour());
         metrics.setSourceServiceId(getSourceServiceId());
         metrics.setDestServiceId(getDestServiceId());
@@ -89,7 +90,7 @@ public class ServiceRelationServerSideMetrics extends Metrics {
 
     @Override
     public Metrics toDay() {
-        ServiceRelationServerSideMetrics metrics = new ServiceRelationServerSideMetrics();
+        ServiceRelationServerSideMetrics metrics = MetricsObjectPool.get(ServiceRelationServerSideMetrics.class);
         metrics.setTimeBucket(toTimeBucketInDay());
         metrics.setSourceServiceId(getSourceServiceId());
         metrics.setDestServiceId(getDestServiceId());
@@ -129,11 +130,22 @@ public class ServiceRelationServerSideMetrics extends Metrics {
         return remoteBuilder;
     }
 
+    @Override
+    public void recycle() {
+        this.sourceServiceId = null;
+        this.destServiceId = null;
+        this.componentId = 0;
+        this.entityId = null;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
+
     public static class Builder implements StorageHashMapBuilder<ServiceRelationServerSideMetrics> {
 
         @Override
         public ServiceRelationServerSideMetrics storage2Entity(Map<String, Object> dbMap) {
-            ServiceRelationServerSideMetrics metrics = new ServiceRelationServerSideMetrics();
+            ServiceRelationServerSideMetrics metrics = MetricsObjectPool.get(ServiceRelationServerSideMetrics.class);
             metrics.setEntityId((String) dbMap.get(ENTITY_ID));
             metrics.setSourceServiceId((String) dbMap.get(SOURCE_SERVICE_ID));
             metrics.setDestServiceId((String) dbMap.get(DEST_SERVICE_ID));
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTraffic.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTraffic.java
index d5ab808..32fdfc9 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTraffic.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTraffic.java
@@ -94,6 +94,16 @@ public class ServiceTraffic extends Metrics {
         return builder;
     }
 
+    @Override
+    public void recycle() {
+        this.name = null;
+        this.nodeType = null;
+        this.group = null;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
+
     public static class Builder implements StorageHashMapBuilder<ServiceTraffic> {
 
         @Override
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystem.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystem.java
index 9930155..aa2beca 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystem.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystem.java
@@ -201,7 +201,7 @@ public class MeterSystem implements Service {
 
         CtClass metricsClass = classPool.makeClass(METER_CLASS_PACKAGE + className, parentClass);
 
-        /**
+        /*
          * Create empty construct
          */
         try {
@@ -213,15 +213,15 @@ public class MeterSystem implements Service {
             throw new UnexpectedException(e.getMessage(), e);
         }
 
-        /**
+        /*
          * Generate `AcceptableValue<T> createNew()` method.
          */
         try {
             metricsClass.addMethod(CtNewMethod.make(
                 ""
                     + "public org.apache.skywalking.oap.server.core.analysis.meter.function.AcceptableValue createNew() {"
-                    + "    return new " + METER_CLASS_PACKAGE + className + "();"
-                    + " }"
+                    + "    return org.apache.skywalking.oap.server.core.MetricsObjectPool.get(" + METER_CLASS_PACKAGE + className + ".class);"
+                    + "}"
                 , metricsClass));
         } catch (CannotCompileException e) {
             log.error("Can't generate createNew method for " + className + ".", e);
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/HistogramFunction.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/HistogramFunction.java
index e6ee54e..46b51b7 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/HistogramFunction.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/HistogramFunction.java
@@ -147,6 +147,15 @@ public abstract class HistogramFunction extends Metrics implements AcceptableVal
         return HistogramFunctionBuilder.class;
     }
 
+    @Override
+    public void recycle() {
+        this.entityId = null;
+        this.dataset.recycle();
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
+
     public static class HistogramFunctionBuilder implements StorageHashMapBuilder<HistogramFunction> {
 
         @Override
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/PercentileFunction.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/PercentileFunction.java
index 2b67047..c2fa640 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/PercentileFunction.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/PercentileFunction.java
@@ -42,28 +42,35 @@ import org.apache.skywalking.oap.server.core.storage.StorageHashMapBuilder;
 import org.apache.skywalking.oap.server.core.storage.annotation.Column;
 
 /**
- * PercentileFunction is the implementation of {@link PercentileMetrics} in the meter system. The major difference is
- * the PercentileFunction accepts the {@link PercentileArgument} as input rather than every single request.
+ * PercentileFunction is the implementation of {@link PercentileMetrics} in the meter system. The
+ * major difference is the PercentileFunction accepts the {@link PercentileArgument} as input rather
+ * than every single request.
  */
 @MeterFunction(functionName = "percentile")
 @Slf4j
-public abstract class PercentileFunction extends Metrics implements AcceptableValue<PercentileFunction.PercentileArgument>, MultiIntValuesHolder {
+public abstract class PercentileFunction extends Metrics
+    implements AcceptableValue<PercentileFunction.PercentileArgument>, MultiIntValuesHolder {
     public static final String DATASET = "dataset";
+
     public static final String RANKS = "ranks";
+
     public static final String VALUE = "value";
 
     @Setter
     @Getter
     @Column(columnName = ENTITY_ID, length = 512)
     private String entityId;
+
     @Getter
     @Setter
     @Column(columnName = VALUE, dataType = Column.ValueDataType.LABELED_VALUE, storageOnly = true)
     private DataTable percentileValues = new DataTable(10);
+
     @Getter
     @Setter
     @Column(columnName = DATASET, storageOnly = true)
     private DataTable dataset = new DataTable(30);
+
     /**
      * Rank
      */
@@ -79,20 +86,23 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa
         if (dataset.size() > 0) {
             if (!value.getBucketedValues().isCompatible(dataset)) {
                 throw new IllegalArgumentException(
-                    "Incompatible BucketedValues [" + value + "] for current PercentileFunction[" + dataset + "]");
+                    "Incompatible BucketedValues [" + value + "] for current PercentileFunction[" +
+                        dataset + "]");
             }
         }
 
         for (final int rank : value.getRanks()) {
             if (rank <= 0) {
-                throw new IllegalArgumentException("Illegal rank value " + rank + ", must be positive");
+                throw new IllegalArgumentException(
+                    "Illegal rank value " + rank + ", must be positive");
             }
         }
 
         if (ranks.size() > 0) {
             if (ranks.size() != value.getRanks().length) {
                 throw new IllegalArgumentException(
-                    "Incompatible ranks size = [" + value.getRanks().length + "] for current PercentileFunction[" + ranks
+                    "Incompatible ranks size = [" + value.getRanks().length +
+                        "] for current PercentileFunction[" + ranks
                         .size() + "]");
             } else {
                 for (final int rank : value.getRanks()) {
@@ -113,7 +123,8 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa
         final long[] values = value.getBucketedValues().getValues();
         for (int i = 0; i < values.length; i++) {
             final long bucket = value.getBucketedValues().getBuckets()[i];
-            String bucketName = bucket == Long.MIN_VALUE ? Bucket.INFINITE_NEGATIVE : String.valueOf(bucket);
+            String bucketName =
+                bucket == Long.MIN_VALUE ? Bucket.INFINITE_NEGATIVE : String.valueOf(bucket);
             final long bucketValue = values[i];
             dataset.valueAccumulation(bucketName, bucketValue);
         }
@@ -140,7 +151,8 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa
                 return true;
             } else {
                 if (!this.ranks.equals(ranksOfThat)) {
-                    log.warn("Rank {} doesn't exist in the previous ranks {}", ranksOfThat, this.ranks);
+                    log.warn(
+                        "Rank {} doesn't exist in the previous ranks {}", ranksOfThat, this.ranks);
                     return true;
                 }
             }
@@ -163,7 +175,8 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa
             }
 
             int count = 0;
-            final List<String> sortedKeys = dataset.sortedKeys(Comparator.comparingInt(Integer::parseInt));
+            final List<String> sortedKeys =
+                dataset.sortedKeys(Comparator.comparingInt(Integer::parseInt));
 
             int loopIndex = 0;
 
@@ -175,7 +188,8 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa
                     int roof = roofs[rankIdx];
 
                     if (count >= roof) {
-                        percentileValues.put(String.valueOf(ranks.get(rankIdx)), Long.parseLong(key));
+                        percentileValues.put(
+                            String.valueOf(ranks.get(rankIdx)), Long.parseLong(key));
                         loopIndex++;
                     } else {
                         break;
@@ -259,10 +273,12 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa
     @Getter
     public static class PercentileArgument {
         private final BucketedValues bucketedValues;
+
         private final int[] ranks;
     }
 
-    public static class PercentileFunctionBuilder implements StorageHashMapBuilder<PercentileFunction> {
+    public static class PercentileFunctionBuilder
+        implements StorageHashMapBuilder<PercentileFunction> {
 
         @Override
         public PercentileFunction storage2Entity(final Map<String, Object> dbMap) {
@@ -294,10 +310,12 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa
 
     @Override
     public boolean equals(Object o) {
-        if (this == o)
+        if (this == o) {
             return true;
-        if (!(o instanceof PercentileFunction))
+        }
+        if (!(o instanceof PercentileFunction)) {
             return false;
+        }
         PercentileFunction function = (PercentileFunction) o;
         return Objects.equals(entityId, function.entityId) &&
             getTimeBucket() == function.getTimeBucket();
@@ -307,4 +325,16 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa
     public int hashCode() {
         return Objects.hash(entityId, getTimeBucket());
     }
+
+    @Override
+    public void recycle() {
+        this.entityId = null;
+        this.percentileValues.recycle();
+        this.dataset.recycle();
+        this.ranks.recycle();
+        this.isCalculated = false;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgFunction.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgFunction.java
index dc2dec3..86687b3 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgFunction.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgFunction.java
@@ -213,4 +213,16 @@ public abstract class AvgFunction extends Metrics implements AcceptableValue<Lon
     public int hashCode() {
         return Objects.hash(entityId, getTimeBucket());
     }
+
+    @Override
+    public void recycle() {
+        this.entityId = null;
+        this.serviceId = null;
+        this.summation = 0;
+        this.count = 0;
+        this.value = 0;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramFunction.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramFunction.java
index f2bfc39..1bf6580 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramFunction.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramFunction.java
@@ -221,4 +221,15 @@ public abstract class AvgHistogramFunction extends Metrics implements Acceptable
     public int hashCode() {
         return Objects.hash(entityId, getTimeBucket());
     }
+
+    @Override
+    public void recycle() {
+        this.entityId = null;
+        this.summation.recycle();
+        this.count.recycle();
+        this.dataset.recycle();
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramPercentileFunction.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramPercentileFunction.java
index 1dd353f..50b0282 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramPercentileFunction.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramPercentileFunction.java
@@ -378,4 +378,18 @@ public abstract class AvgHistogramPercentileFunction extends Metrics implements
     public int hashCode() {
         return Objects.hash(entityId, getTimeBucket());
     }
+
+    @Override
+    public void recycle() {
+        this.entityId = null;
+        this.percentileValues.recycle();
+        this.summation.recycle();
+        this.count.recycle();
+        this.dataset.recycle();
+        this.ranks.recycle();
+        this.isCalculated = false;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgLabeledFunction.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgLabeledFunction.java
index 5e11958..ae88c19 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgLabeledFunction.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgLabeledFunction.java
@@ -217,4 +217,16 @@ public abstract class AvgLabeledFunction extends Metrics implements AcceptableVa
     public int hashCode() {
         return Objects.hash(entityId, getTimeBucket());
     }
+
+    @Override
+    public void recycle() {
+        this.entityId = null;
+        this.serviceId = null;
+        this.summation.recycle();
+        this.count.recycle();
+        this.value.recycle();
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/latest/LatestFunction.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/latest/LatestFunction.java
index 9e49426..5c619c6 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/latest/LatestFunction.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/latest/LatestFunction.java
@@ -41,7 +41,8 @@ import org.apache.skywalking.oap.server.core.storage.annotation.Column;
 
 @MeterFunction(functionName = "latest")
 @ToString
-public abstract class LatestFunction extends Metrics implements AcceptableValue<Long>, LongValueHolder {
+public abstract class LatestFunction extends Metrics
+    implements AcceptableValue<Long>, LongValueHolder {
     protected static final String VALUE = "value";
 
     @Setter
@@ -62,23 +63,27 @@ public abstract class LatestFunction extends Metrics implements AcceptableValue<
     @Column(columnName = VALUE, dataType = Column.ValueDataType.COMMON_VALUE, function = Function.Latest)
     private long value;
 
-    @Override public void accept(MeterEntity entity, Long value) {
+    @Override
+    public void accept(MeterEntity entity, Long value) {
         this.entityId = entity.id();
         this.serviceId = entity.serviceId();
         this.value = value;
     }
 
-    @Entrance public final void combine(@SourceFrom long value) {
+    @Entrance
+    public final void combine(@SourceFrom long value) {
         this.value = value;
     }
 
-    @Override public final boolean combine(Metrics metrics) {
+    @Override
+    public final boolean combine(Metrics metrics) {
         LatestFunction latestFunction = (LatestFunction) metrics;
         combine(latestFunction.value);
         return true;
     }
 
-    @Override public void calculate() {
+    @Override
+    public void calculate() {
 
     }
 
@@ -138,6 +143,16 @@ public abstract class LatestFunction extends Metrics implements AcceptableValue<
         return LatestFunction.LastestStorageBuilder.class;
     }
 
+    @Override
+    public void recycle() {
+        this.entityId = null;
+        this.serviceId = null;
+        this.value = 0;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
+
     public static class LastestStorageBuilder implements StorageHashMapBuilder<LatestFunction> {
         @Override
         public LatestFunction storage2Entity(final Map<String, Object> dbMap) {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/sum/SumFunction.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/sum/SumFunction.java
index d229f6b..bd712fc 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/sum/SumFunction.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/sum/SumFunction.java
@@ -41,7 +41,8 @@ import org.apache.skywalking.oap.server.core.storage.annotation.Column;
 
 @ToString
 @MeterFunction(functionName = "sum")
-public abstract class SumFunction extends Metrics implements AcceptableValue<Long>, LongValueHolder {
+public abstract class SumFunction extends Metrics
+    implements AcceptableValue<Long>, LongValueHolder {
     protected static final String VALUE = "value";
 
     @Setter
@@ -183,4 +184,14 @@ public abstract class SumFunction extends Metrics implements AcceptableValue<Lon
     public int hashCode() {
         return Objects.hash(getEntityId(), getTimeBucket());
     }
+
+    @Override
+    public void recycle() {
+        this.entityId = null;
+        this.serviceId = null;
+        this.value = 0;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/ApdexMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/ApdexMetrics.java
index 14b4750..ba275b1 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/ApdexMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/ApdexMetrics.java
@@ -92,7 +92,13 @@ public abstract class ApdexMetrics extends Metrics implements IntValueHolder {
     }
 
     @Override
-    public int getValue() {
-        return value;
+    public void recycle() {
+        this.totalNum = 0;
+        this.sNum = 0;
+        this.tNum = 0;
+        this.value = 0;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
     }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/CPMMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/CPMMetrics.java
index bc0f02f..ae2e90d 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/CPMMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/CPMMetrics.java
@@ -57,5 +57,14 @@ public abstract class CPMMetrics extends Metrics implements LongValueHolder {
     public void calculate() {
         this.value = total / getDurationInMinute();
     }
+
+    @Override
+    public void recycle() {
+        this.value = 0;
+        this.total = 0;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/CountMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/CountMetrics.java
index 9a22314..383dbd0 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/CountMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/CountMetrics.java
@@ -51,4 +51,12 @@ public abstract class CountMetrics extends Metrics implements LongValueHolder {
     @Override
     public void calculate() {
     }
+
+    @Override
+    public void recycle() {
+        this.value = 0;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DataTable.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DataTable.java
index 0640d68..3ec0a10 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DataTable.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DataTable.java
@@ -17,6 +17,7 @@
 
 package org.apache.skywalking.oap.server.core.analysis.metrics;
 
+import io.netty.util.internal.ObjectPool;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -26,6 +27,7 @@ import java.util.stream.Collectors;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
 import org.apache.skywalking.oap.server.core.Const;
+import org.apache.skywalking.oap.server.core.Recyclable;
 import org.apache.skywalking.oap.server.core.storage.type.StorageDataComplexObject;
 
 /**
@@ -33,8 +35,8 @@ import org.apache.skywalking.oap.server.core.storage.type.StorageDataComplexObje
  */
 @ToString
 @EqualsAndHashCode
-public class DataTable implements StorageDataComplexObject<DataTable> {
-    private HashMap<String, Long> data;
+public class DataTable implements StorageDataComplexObject<DataTable>, Recyclable<DataTable> {
+    private final HashMap<String, Long> data;
 
     public DataTable() {
         data = new HashMap<>();
@@ -153,4 +155,14 @@ public class DataTable implements StorageDataComplexObject<DataTable> {
         });
         return this;
     }
+
+    @Override
+    public void handle(final ObjectPool.Handle<DataTable> handle) {
+        // This is not directly pooled, don't need to handle it
+    }
+
+    @Override
+    public void recycle() {
+        this.data.clear();
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DoubleAvgMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DoubleAvgMetrics.java
index 9356c21..15e72a6 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DoubleAvgMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DoubleAvgMetrics.java
@@ -64,4 +64,15 @@ public abstract class DoubleAvgMetrics extends Metrics implements DoubleValueHol
     public final void calculate() {
         this.value = this.summation / this.count;
     }
+
+    @Override
+    public void recycle() {
+        this.summation = 0;
+        this.count = 0;
+        this.value = 0;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/HistogramMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/HistogramMetrics.java
index dbb4870..208ced2 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/HistogramMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/HistogramMetrics.java
@@ -87,4 +87,12 @@ public abstract class HistogramMetrics extends Metrics {
     @Override
     public final void calculate() {
     }
+
+    @Override
+    public void recycle() {
+        this.dataset.recycle();
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/IntList.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/IntList.java
index b5bd9ef..ce3ee10 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/IntList.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/IntList.java
@@ -18,11 +18,13 @@
 
 package org.apache.skywalking.oap.server.core.analysis.metrics;
 
+import io.netty.util.internal.ObjectPool;
 import java.util.ArrayList;
 import java.util.List;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
 import org.apache.skywalking.oap.server.core.Const;
+import org.apache.skywalking.oap.server.core.Recyclable;
 import org.apache.skywalking.oap.server.core.storage.type.StorageDataComplexObject;
 
 /**
@@ -30,11 +32,11 @@ import org.apache.skywalking.oap.server.core.storage.type.StorageDataComplexObje
  */
 @ToString
 @EqualsAndHashCode
-public class IntList implements StorageDataComplexObject<IntList> {
+public class IntList implements StorageDataComplexObject<IntList>, Recyclable<IntList> {
     private List<Integer> data;
 
     public IntList(int initialSize) {
-        this.data = new ArrayList(initialSize);
+        this.data = new ArrayList<>(initialSize);
     }
 
     public IntList(String valueString) {
@@ -84,4 +86,14 @@ public class IntList implements StorageDataComplexObject<IntList> {
     public int get(final int idx) {
         return this.data.get(idx);
     }
+
+    @Override
+    public void handle(final ObjectPool.Handle<IntList> handle) {
+        // This is not directly pooled, don't need to handle it
+    }
+
+    @Override
+    public void recycle() {
+        this.data.clear();
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetrics.java
index 661281c..45e6be9 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetrics.java
@@ -64,4 +64,14 @@ public abstract class LongAvgMetrics extends Metrics implements LongValueHolder
     public final void calculate() {
         this.value = this.summation / this.count;
     }
+
+    @Override
+    public void recycle() {
+        this.summation = 0;
+        this.count = 0;
+        this.value = 0;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxDoubleMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxDoubleMetrics.java
index 5dcef23..0c4d2bc 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxDoubleMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxDoubleMetrics.java
@@ -52,4 +52,12 @@ public abstract class MaxDoubleMetrics extends Metrics implements DoubleValueHol
     @Override
     public void calculate() {
     }
+
+    @Override
+    public void recycle() {
+        this.value = 0;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetrics.java
index 9b70a47..a7387dc 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetrics.java
@@ -55,4 +55,12 @@ public abstract class MaxLongMetrics extends Metrics implements LongValueHolder
     @Override
     public void calculate() {
     }
+
+    @Override
+    public void recycle() {
+        this.value = 0;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/Metrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/Metrics.java
index 1bbcd06..b80d5e1 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/Metrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/Metrics.java
@@ -18,9 +18,11 @@
 
 package org.apache.skywalking.oap.server.core.analysis.metrics;
 
+import io.netty.util.internal.ObjectPool;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.skywalking.oap.server.core.Recyclable;
 import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
 import org.apache.skywalking.oap.server.core.remote.data.StreamData;
 import org.apache.skywalking.oap.server.core.storage.StorageData;
@@ -33,7 +35,7 @@ import org.apache.skywalking.oap.server.core.storage.annotation.Column;
 @EqualsAndHashCode(of = {
     "timeBucket"
 })
-public abstract class Metrics extends StreamData implements StorageData {
+public abstract class Metrics extends StreamData implements StorageData, Recyclable<Metrics> {
 
     public static final String TIME_BUCKET = "time_bucket";
     public static final String ENTITY_ID = "entity_id";
@@ -52,6 +54,8 @@ public abstract class Metrics extends StreamData implements StorageData {
     @Getter
     private long lastUpdateTimestamp = 0L;
 
+    protected ObjectPool.Handle<Metrics> handle;
+
     /**
      * Merge the given metrics instance, these two must be the same metrics type.
      *
@@ -153,4 +157,9 @@ public abstract class Metrics extends StreamData implements StorageData {
     }
 
     protected abstract String id0();
+
+    @Override
+    public void handle(final ObjectPool.Handle<Metrics> handle) {
+        this.handle = handle;
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinDoubleMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinDoubleMetrics.java
index bdc45e6..8cc4300 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinDoubleMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinDoubleMetrics.java
@@ -52,4 +52,12 @@ public abstract class MinDoubleMetrics extends Metrics implements DoubleValueHol
     @Override
     public void calculate() {
     }
+
+    @Override
+    public void recycle() {
+        this.value = 0;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinLongMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinLongMetrics.java
index 88f7fab..9be2984 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinLongMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinLongMetrics.java
@@ -52,4 +52,12 @@ public abstract class MinLongMetrics extends Metrics implements LongValueHolder
     @Override
     public void calculate() {
     }
+
+    @Override
+    public void recycle() {
+        this.value = 0;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetrics.java
index aa6d32f..85bf20d 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetrics.java
@@ -69,4 +69,14 @@ public abstract class PercentMetrics extends Metrics implements IntValueHolder {
     public int getValue() {
         return percentage;
     }
+
+    @Override
+    public void recycle() {
+        this.total = 0;
+        this.percentage = 0;
+        this.match = 0;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentileMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentileMetrics.java
index 0e1b2a6..e65bb19 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentileMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentileMetrics.java
@@ -124,4 +124,15 @@ public abstract class PercentileMetrics extends Metrics implements MultiIntValue
                                .flatMapToInt(l -> IntStream.of(l.intValue()))
                                .toArray();
     }
+
+    @Override
+    public void recycle() {
+        this.percentileValues.recycle();
+        this.precision = 0;
+        this.dataset.recycle();
+        this.isCalculated = false;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PxxMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PxxMetrics.java
index a65ebce..6c31844 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PxxMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PxxMetrics.java
@@ -106,4 +106,15 @@ public abstract class PxxMetrics extends Metrics implements IntValueHolder {
             }
         }
     }
+
+    @Override
+    public void recycle() {
+        this.value = 0;
+        this.precision = 0;
+        this.isCalculated = false;
+        this.detailGroup.recycle();
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/RateMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/RateMetrics.java
index 830f1d7..839a8d7 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/RateMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/RateMetrics.java
@@ -73,4 +73,14 @@ public abstract class RateMetrics extends Metrics implements IntValueHolder {
     public int getValue() {
         return percentage;
     }
+
+    @Override
+    public void recycle() {
+        this.denominator = 0;
+        this.percentage = 0;
+        this.numerator = 0;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/SumMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/SumMetrics.java
index a2f3d61..7eae61c 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/SumMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/SumMetrics.java
@@ -51,4 +51,12 @@ public abstract class SumMetrics extends Metrics implements LongValueHolder {
     @Override
     public void calculate() {
     }
+
+    @Override
+    public void recycle() {
+        this.value = 0;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/ExportWorker.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/ExportWorker.java
index 63090bc..b6f322d 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/ExportWorker.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/ExportWorker.java
@@ -25,8 +25,8 @@ import org.apache.skywalking.oap.server.core.worker.AbstractWorker;
 import org.apache.skywalking.oap.server.library.module.ModuleDefineHolder;
 
 /**
- * A bridge worker. If the {@link ExporterModule} provider declared and provides a implementation of {@link
- * MetricValuesExportService}, forward the export data to it.
+ * A bridge worker. If the {@link ExporterModule} provider declared and provides an implementation
+ * of {@link MetricValuesExportService}, forward the export data to it.
  */
 public class ExportWorker extends AbstractWorker<ExportEvent> {
     private MetricValuesExportService exportService;
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsAggregateWorker.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsAggregateWorker.java
index 4e7c59e..5e8a20b 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsAggregateWorker.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsAggregateWorker.java
@@ -43,17 +43,17 @@ import org.apache.skywalking.oap.server.telemetry.api.MetricsTag;
 @Slf4j
 public class MetricsAggregateWorker extends AbstractWorker<Metrics> {
     public final long l1FlushPeriod;
-    private AbstractWorker<Metrics> nextWorker;
+    private final AbstractWorker<Metrics> nextWorker;
     private final DataCarrier<Metrics> dataCarrier;
     private final MergableBufferedData<Metrics> mergeDataCache;
-    private CounterMetrics aggregationCounter;
+    private final CounterMetrics aggregationCounter;
     private long lastSendTime = 0;
 
     MetricsAggregateWorker(ModuleDefineHolder moduleDefineHolder, AbstractWorker<Metrics> nextWorker,
                            String modelName, long l1FlushPeriod) {
         super(moduleDefineHolder);
         this.nextWorker = nextWorker;
-        this.mergeDataCache = new MergableBufferedData();
+        this.mergeDataCache = new MergableBufferedData<>();
         String name = "METRICS_L1_AGGREGATION";
         this.dataCarrier = new DataCarrier<>("MetricsAggregateWorker." + modelName, name, 2, 10000);
 
@@ -139,4 +139,4 @@ public class MetricsAggregateWorker extends AbstractWorker<Metrics> {
             flush();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsPersistentWorker.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsPersistentWorker.java
index b216bd0..1f30473 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsPersistentWorker.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsPersistentWorker.java
@@ -67,7 +67,7 @@ public class MetricsPersistentWorker extends PersistenceWorker<Metrics> {
     private final boolean enableDatabaseSession;
     private final boolean supportUpdate;
     private long sessionTimeout;
-    private CounterMetrics aggregationCounter;
+    private final CounterMetrics aggregationCounter;
     /**
      * The counter for the round of persistent.
      */
@@ -81,13 +81,13 @@ public class MetricsPersistentWorker extends PersistenceWorker<Metrics> {
     /**
      * @since 8.7.0 TTL settings from {@link org.apache.skywalking.oap.server.core.CoreModuleConfig#getMetricsDataTTL()}
      */
-    private int metricsDataTTL;
+    private final int metricsDataTTL;
 
     MetricsPersistentWorker(ModuleDefineHolder moduleDefineHolder, Model model, IMetricsDAO metricsDAO,
                             AbstractWorker<Metrics> nextAlarmWorker, AbstractWorker<ExportEvent> nextExportWorker,
                             MetricsTransWorker transWorker, boolean enableDatabaseSession, boolean supportUpdate,
                             long storageSessionTimeout, int metricsDataTTL) {
-        super(moduleDefineHolder, new ReadWriteSafeCache<>(new MergableBufferedData(), new MergableBufferedData()));
+        super(moduleDefineHolder, new ReadWriteSafeCache<>(new MergableBufferedData<>(), new MergableBufferedData<>()));
         this.model = model;
         this.context = new HashMap<>(100);
         this.enableDatabaseSession = enableDatabaseSession;
@@ -161,12 +161,12 @@ public class MetricsPersistentWorker extends PersistenceWorker<Metrics> {
     @Override
     public List<PrepareRequest> prepareBatch(Collection<Metrics> lastCollection) {
         if (persistentCounter++ % persistentMod != 0) {
-            return Collections.EMPTY_LIST;
+            return Collections.emptyList();
         }
 
         long start = System.currentTimeMillis();
         if (lastCollection.size() == 0) {
-            return Collections.EMPTY_LIST;
+            return Collections.emptyList();
         }
 
         /*
@@ -233,11 +233,20 @@ public class MetricsPersistentWorker extends PersistenceWorker<Metrics> {
                     metrics.setLastUpdateTimestamp(timestamp);
                 }
 
-                /*
-                 * The `metrics` should be not changed in all above process. Exporter is an async process.
-                 */
-                nextExportWorker.ifPresent(exportEvenWorker -> exportEvenWorker.in(
-                    new ExportEvent(metrics, ExportEvent.EventType.INCREMENT)));
+                if (nextExportWorker.isPresent()) {
+                    /*
+                     * The `metrics` should be not changed in all above process as exporter is an
+                     * async process.
+                     *
+                     * Exporter is also responsible to recycle the passed-in metrics.
+                     */
+                    nextExportWorker.get().in(new ExportEvent(metrics, ExportEvent.EventType.INCREMENT));
+                } else {
+                    /*
+                     * No exporter is configured, metrics can be recycled right now.
+                     */
+                    metrics.recycle();
+                }
             }
         } catch (Throwable t) {
             log.error(t.getMessage(), t);
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsStreamProcessor.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsStreamProcessor.java
index 1fb1d41..d4691d9 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsStreamProcessor.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsStreamProcessor.java
@@ -119,7 +119,6 @@ public class MetricsStreamProcessor implements StreamProcessor<Metrics> {
         this.create(moduleDefineHolder, StreamDefinition.from(stream), metricsClass);
     }
 
-    @SuppressWarnings("unchecked")
     public void create(ModuleDefineHolder moduleDefineHolder,
                        StreamDefinition stream,
                        Class<? extends Metrics> metricsClass) throws StorageException {
@@ -148,7 +147,7 @@ public class MetricsStreamProcessor implements StreamProcessor<Metrics> {
         MetricsTransWorker transWorker = null;
 
         final MetricsExtension metricsExtension = metricsClass.getAnnotation(MetricsExtension.class);
-        /**
+        /*
          * All metrics default are `supportDownSampling` and `insertAndUpdate`, unless it has explicit definition.
          */
         boolean supportDownSampling = true;
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/exporter/ExportEvent.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/exporter/ExportEvent.java
index 8a38efc..524ed7a 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/exporter/ExportEvent.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/exporter/ExportEvent.java
@@ -19,6 +19,7 @@
 package org.apache.skywalking.oap.server.core.exporter;
 
 import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics;
 
 /**
@@ -26,17 +27,13 @@ import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics;
  * changed in any case.
  */
 @Getter
+@RequiredArgsConstructor
 public class ExportEvent {
     /**
      * Fields of this should not be changed in any case.
      */
-    private Metrics metrics;
-    private EventType type;
-
-    public ExportEvent(Metrics metrics, EventType type) {
-        this.metrics = metrics;
-        this.type = type;
-    }
+    private final Metrics metrics;
+    private final EventType type;
 
     public enum EventType {
         /**
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/GRPCRemoteClient.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/GRPCRemoteClient.java
index 51fda20..b2e90ae 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/GRPCRemoteClient.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/GRPCRemoteClient.java
@@ -28,6 +28,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.apm.commons.datacarrier.DataCarrier;
 import org.apache.skywalking.apm.commons.datacarrier.consumer.IConsumer;
+import org.apache.skywalking.oap.server.core.Recyclable;
 import org.apache.skywalking.oap.server.core.remote.data.StreamData;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.Empty;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteMessage;
@@ -149,6 +150,10 @@ public class GRPCRemoteClient implements RemoteClient {
         builder.setRemoteData(streamData.serialize());
 
         this.getDataCarrier().produce(builder.build());
+
+        if (streamData instanceof Recyclable) {
+            ((Recyclable<?>) streamData).recycle();
+        }
     }
 
     class RemoteMessageConsumer implements IConsumer<RemoteMessage> {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Event.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Event.java
index f985d08..7d8a14e 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Event.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Event.java
@@ -230,6 +230,24 @@ public class Event extends Metrics implements ISource, WithMetadata, LongValueHo
         return id;
     }
 
+    @Override
+    public void recycle() {
+        this.uuid = null;
+        this.service = null;
+        this.serviceInstance = null;
+        this.endpoint = null;
+        this.name = null;
+        this.type = null;
+        this.message = null;
+        this.parameters = null;
+        this.startTime = 0;
+        this.endTime = 0;
+        this.value = 0;
+        setTimeBucket(0);
+        setLastUpdateTimestamp(0);
+        handle.recycle(this);
+    }
+
     public static class Builder implements StorageHashMapBuilder<Event> {
         @Override
         public Map<String, Object> entity2Storage(Event storageData) {
diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointCallRelationTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointCallRelationTest.java
index c509604..f9846ef 100644
--- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointCallRelationTest.java
+++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointCallRelationTest.java
@@ -18,18 +18,21 @@
 
 package org.apache.skywalking.oap.server.core.analysis.manual.relation.endpoint;
 
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.junit.Assert;
 import org.junit.Test;
 
 public class EndpointCallRelationTest {
     @Test
     public void testEndpointRelationServerSideMetricsEquals() {
-        EndpointRelationServerSideMetrics thisObject = new EndpointRelationServerSideMetrics();
+        EndpointRelationServerSideMetrics thisObject =
+            MetricsObjectPool.get(EndpointRelationServerSideMetrics.class);
         thisObject.setEntityId(
             "VXNlcg==.0-VXNlcg==-em1iaXotcHJvbW90aW9uMi1hZG1pbkAxMjUyNw==.1-L0Bpbi9hcGkvaGVhbHRo");
         thisObject.setTimeBucket(202101071505L);
 
-        EndpointRelationServerSideMetrics otherObject = new EndpointRelationServerSideMetrics();
+        EndpointRelationServerSideMetrics otherObject =
+            MetricsObjectPool.get(EndpointRelationServerSideMetrics.class);
         otherObject.setEntityId(
             "VXNlcg==.0-VXNlcg==-em1iaXotcHJvbW90aW9uMi1hZG1pbkAxMjUyNw==.1-L0Bpbi9hcGkvaGVhbHRo");
         otherObject.setTimeBucket(202101071505L);
@@ -39,12 +42,14 @@ public class EndpointCallRelationTest {
 
     @Test
     public void testEndpointRelationServerSideMetricsNotEquals() {
-        EndpointRelationServerSideMetrics thisObject = new EndpointRelationServerSideMetrics();
+        EndpointRelationServerSideMetrics thisObject =
+            MetricsObjectPool.get(EndpointRelationServerSideMetrics.class);
         thisObject.setEntityId(
             "VXNlcg==.0-VXNlcg==-em1iaXotcHJvbW90aW9uMi1hZG1pbkAxMjUyNw==.1-L0Bpbi9hcGkvaGVhbHRo");
         thisObject.setTimeBucket(202101071505L);
 
-        EndpointRelationServerSideMetrics otherObject = new EndpointRelationServerSideMetrics();
+        EndpointRelationServerSideMetrics otherObject =
+            MetricsObjectPool.get(EndpointRelationServerSideMetrics.class);
         otherObject.setEntityId(
             "VXNlcg==.0-VXNlcg==-em1iaXotcHJvbW90aW9uMi1hZG1pbkAxMjUyNw==.1-L0Bpbi9hcGkvaGVhbHRo");
         otherObject.setTimeBucket(202101071506L);
diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationTest.java
index 18dc008..5d3b696 100644
--- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationTest.java
+++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationTest.java
@@ -18,18 +18,21 @@
 
 package org.apache.skywalking.oap.server.core.analysis.manual.relation.instance;
 
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.junit.Assert;
 import org.junit.Test;
 
 public class ServiceInstanceRelationTest {
     @Test
     public void testServiceInstanceRelationClientSideMetricsEquals() {
-        ServiceInstanceRelationClientSideMetrics thisObject = new ServiceInstanceRelationClientSideMetrics();
+        ServiceInstanceRelationClientSideMetrics thisObject =
+            MetricsObjectPool.get(ServiceInstanceRelationClientSideMetrics.class);
         thisObject.setEntityId(
             "em1jLWJlYWNvbi1taWRkbGV3YXJlQDExMTIz.1_MTAuMTExLjIzMi4yMDc=-MTkyLjE2OC40Ni4xNDM6NDY2MDY=.0_MTkyLjE2OC40Ni4xNDM6NDY2MDY=");
         thisObject.setTimeBucket(202101071505L);
 
-        ServiceInstanceRelationClientSideMetrics otherObject = new ServiceInstanceRelationClientSideMetrics();
+        ServiceInstanceRelationClientSideMetrics otherObject =
+            MetricsObjectPool.get(ServiceInstanceRelationClientSideMetrics.class);
         otherObject.setEntityId(
             "em1jLWJlYWNvbi1taWRkbGV3YXJlQDExMTIz.1_MTAuMTExLjIzMi4yMDc=-MTkyLjE2OC40Ni4xNDM6NDY2MDY=.0_MTkyLjE2OC40Ni4xNDM6NDY2MDY=");
         otherObject.setTimeBucket(202101071505L);
@@ -39,12 +42,14 @@ public class ServiceInstanceRelationTest {
 
     @Test
     public void testServiceInstanceRelationClientSideMetricsNotEquals() {
-        ServiceInstanceRelationClientSideMetrics thisObject = new ServiceInstanceRelationClientSideMetrics();
+        ServiceInstanceRelationClientSideMetrics thisObject =
+            MetricsObjectPool.get(ServiceInstanceRelationClientSideMetrics.class);
         thisObject.setEntityId(
             "em1jLWJlYWNvbi1taWRkbGV3YXJlQDExMTIz.1_MTAuMTExLjIzMi4yMDc=-MTkyLjE2OC40Ni4xNDM6NDY2MDY=.0_MTkyLjE2OC40Ni4xNDM6NDY2MDY=");
         thisObject.setTimeBucket(202101071505L);
 
-        ServiceInstanceRelationClientSideMetrics otherObject = new ServiceInstanceRelationClientSideMetrics();
+        ServiceInstanceRelationClientSideMetrics otherObject =
+            MetricsObjectPool.get(ServiceInstanceRelationClientSideMetrics.class);
         otherObject.setEntityId(
             "em1jLWJlYWNvbi1taWRkbGV3YXJlQDExMTIz.1_MTAuMTExLjIzMi4yMDc=-MTkyLjE2OC40Ni4xNDM6NDY2MDY=.0_MTkyLjE2OC40Ni4xNDM6NDY2MDY=");
         otherObject.setTimeBucket(202101071506L);
@@ -54,12 +59,14 @@ public class ServiceInstanceRelationTest {
 
     @Test
     public void testServiceInstanceRelationServerSideMetricsEquals() {
-        ServiceInstanceRelationServerSideMetrics thisObject = new ServiceInstanceRelationServerSideMetrics();
+        ServiceInstanceRelationServerSideMetrics thisObject =
+            MetricsObjectPool.get(ServiceInstanceRelationServerSideMetrics.class);
         thisObject.setEntityId(
             "em1jLWJlYWNvbi1taWRkbGV3YXJlQDExMTIz.1_MTAuMTExLjIzMi4yMDc=-MTkyLjE2OC40Ni4xNDM6NDY2MDY=.0_MTkyLjE2OC40Ni4xNDM6NDY2MDY=");
         thisObject.setTimeBucket(202101071505L);
 
-        ServiceInstanceRelationServerSideMetrics otherObject = new ServiceInstanceRelationServerSideMetrics();
+        ServiceInstanceRelationServerSideMetrics otherObject =
+            MetricsObjectPool.get(ServiceInstanceRelationServerSideMetrics.class);
         otherObject.setEntityId(
             "em1jLWJlYWNvbi1taWRkbGV3YXJlQDExMTIz.1_MTAuMTExLjIzMi4yMDc=-MTkyLjE2OC40Ni4xNDM6NDY2MDY=.0_MTkyLjE2OC40Ni4xNDM6NDY2MDY=");
         otherObject.setTimeBucket(202101071505L);
@@ -69,12 +76,14 @@ public class ServiceInstanceRelationTest {
 
     @Test
     public void testServiceInstanceRelationServerSideMetricsNotEquals() {
-        ServiceInstanceRelationServerSideMetrics thisObject = new ServiceInstanceRelationServerSideMetrics();
+        ServiceInstanceRelationServerSideMetrics thisObject =
+            MetricsObjectPool.get(ServiceInstanceRelationServerSideMetrics.class);
         thisObject.setEntityId(
             "em1jLWJlYWNvbi1taWRkbGV3YXJlQDExMTIz.1_MTAuMTExLjIzMi4yMDc=-MTkyLjE2OC40Ni4xNDM6NDY2MDY=.0_MTkyLjE2OC40Ni4xNDM6NDY2MDY=");
         thisObject.setTimeBucket(202101071505L);
 
-        ServiceInstanceRelationServerSideMetrics otherObject = new ServiceInstanceRelationServerSideMetrics();
+        ServiceInstanceRelationServerSideMetrics otherObject =
+            MetricsObjectPool.get(ServiceInstanceRelationServerSideMetrics.class);
         otherObject.setEntityId(
             "em1jLWJlYWNvbi1taWRkbGV3YXJlQDExMTIz.1_MTAuMTExLjIzMi4yMDc=-MTkyLjE2OC40Ni4xNDM6NDY2MDY=.0_MTkyLjE2OC40Ni4xNDM6NDY2MDY=");
         otherObject.setTimeBucket(202101071506L);
diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationTest.java
index 6bf8282..002250d 100644
--- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationTest.java
+++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationTest.java
@@ -18,17 +18,20 @@
 
 package org.apache.skywalking.oap.server.core.analysis.manual.relation.service;
 
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.junit.Assert;
 import org.junit.Test;
 
 public class ServiceRelationTest {
     @Test
     public void testServiceRelationClientSideMetricsEquals() {
-        ServiceRelationClientSideMetrics thisObject = new ServiceRelationClientSideMetrics();
+        ServiceRelationClientSideMetrics thisObject =
+            MetricsObjectPool.get(ServiceRelationClientSideMetrics.class);
         thisObject.setEntityId("VXNlcg==.0-em0tY2xpZW50LXNldHRpbmctd2ViYXBpQDEwNjQ4.1");
         thisObject.setTimeBucket(202101071505L);
 
-        ServiceRelationClientSideMetrics otherObject = new ServiceRelationClientSideMetrics();
+        ServiceRelationClientSideMetrics otherObject =
+            MetricsObjectPool.get(ServiceRelationClientSideMetrics.class);
         otherObject.setEntityId("VXNlcg==.0-em0tY2xpZW50LXNldHRpbmctd2ViYXBpQDEwNjQ4.1");
         otherObject.setTimeBucket(202101071505L);
 
@@ -37,11 +40,13 @@ public class ServiceRelationTest {
 
     @Test
     public void testServiceRelationClientSideMetricsNotEquals() {
-        ServiceRelationClientSideMetrics thisObject = new ServiceRelationClientSideMetrics();
+        ServiceRelationClientSideMetrics thisObject =
+            MetricsObjectPool.get(ServiceRelationClientSideMetrics.class);
         thisObject.setEntityId("VXNlcg==.0-em0tY2xpZW50LXNldHRpbmctd2ViYXBpQDEwNjQ4.1");
         thisObject.setTimeBucket(202101071505L);
 
-        ServiceRelationClientSideMetrics otherObject = new ServiceRelationClientSideMetrics();
+        ServiceRelationClientSideMetrics otherObject =
+            MetricsObjectPool.get(ServiceRelationClientSideMetrics.class);
         otherObject.setEntityId("VXNlcg==.0-em0tY2xpZW50LXNldHRpbmctd2ViYXBpQDEwNjQ4.1");
         otherObject.setTimeBucket(202101071506L);
 
@@ -50,11 +55,13 @@ public class ServiceRelationTest {
 
     @Test
     public void testServiceRelationServerSideMetricsEquals() {
-        ServiceRelationServerSideMetrics thisObject = new ServiceRelationServerSideMetrics();
+        ServiceRelationServerSideMetrics thisObject =
+            MetricsObjectPool.get(ServiceRelationServerSideMetrics.class);
         thisObject.setEntityId("VXNlcg==.0-em0tY2xpZW50LXNldHRpbmctd2ViYXBpQDEwNjQ4.1");
         thisObject.setTimeBucket(202101071505L);
 
-        ServiceRelationServerSideMetrics otherObject = new ServiceRelationServerSideMetrics();
+        ServiceRelationServerSideMetrics otherObject =
+            MetricsObjectPool.get(ServiceRelationServerSideMetrics.class);
         otherObject.setEntityId("VXNlcg==.0-em0tY2xpZW50LXNldHRpbmctd2ViYXBpQDEwNjQ4.1");
         otherObject.setTimeBucket(202101071505L);
 
@@ -63,11 +70,13 @@ public class ServiceRelationTest {
 
     @Test
     public void testServiceRelationServerSideMetricsNotEquals() {
-        ServiceRelationServerSideMetrics thisObject = new ServiceRelationServerSideMetrics();
+        ServiceRelationServerSideMetrics thisObject =
+            MetricsObjectPool.get(ServiceRelationServerSideMetrics.class);
         thisObject.setEntityId("VXNlcg==.0-em0tY2xpZW50LXNldHRpbmctd2ViYXBpQDEwNjQ4.1");
         thisObject.setTimeBucket(202101071505L);
 
-        ServiceRelationServerSideMetrics otherObject = new ServiceRelationServerSideMetrics();
+        ServiceRelationServerSideMetrics otherObject =
+            MetricsObjectPool.get(ServiceRelationServerSideMetrics.class);
         otherObject.setEntityId("VXNlcg==.0-em0tY2xpZW50LXNldHRpbmctd2ViYXBpQDEwNjQ4.1");
         otherObject.setTimeBucket(202101071506L);
 
diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/function/HistogramFunctionTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/function/HistogramFunctionTest.java
index 5ddbb0a..9804a4a 100644
--- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/function/HistogramFunctionTest.java
+++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/function/HistogramFunctionTest.java
@@ -20,6 +20,7 @@ package org.apache.skywalking.oap.server.core.analysis.meter.function;
 
 import java.util.Map;
 import java.util.stream.IntStream;
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.meter.MeterEntity;
 import org.apache.skywalking.oap.server.core.analysis.metrics.DataTable;
 import org.apache.skywalking.oap.server.core.query.type.Bucket;
@@ -54,7 +55,7 @@ public class HistogramFunctionTest {
 
     @Test
     public void testFunction() {
-        HistogramFunctionInst inst = new HistogramFunctionInst();
+        HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class);
         inst.accept(
             MeterEntity.newService("service-test"),
             new BucketedValues(
@@ -90,7 +91,7 @@ public class HistogramFunctionTest {
 
     @Test
     public void testFunctionWithInfinite() {
-        HistogramFunctionInst inst = new HistogramFunctionInst();
+        HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class);
         inst.accept(
             MeterEntity.newService("service-test"),
             new BucketedValues(
@@ -118,7 +119,7 @@ public class HistogramFunctionTest {
 
     @Test(expected = IllegalArgumentException.class)
     public void testIncompatible() {
-        HistogramFunctionInst inst = new HistogramFunctionInst();
+        HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class);
         inst.accept(
             MeterEntity.newService("service-test"),
             new BucketedValues(
@@ -144,7 +145,7 @@ public class HistogramFunctionTest {
 
     @Test
     public void testSerialization() {
-        HistogramFunctionInst inst = new HistogramFunctionInst();
+        HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class);
         inst.accept(
             MeterEntity.newService("service-test"),
             new BucketedValues(
@@ -156,7 +157,7 @@ public class HistogramFunctionTest {
             })
         );
 
-        final HistogramFunctionInst inst2 = new HistogramFunctionInst();
+        final HistogramFunctionInst inst2 = MetricsObjectPool.get(HistogramFunctionInst.class);
         inst2.deserialize(inst.serialize().build());
 
         Assert.assertEquals(inst, inst2);
@@ -166,7 +167,7 @@ public class HistogramFunctionTest {
 
     @Test
     public void testSerializationInInfinite() {
-        HistogramFunctionInst inst = new HistogramFunctionInst();
+        HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class);
         inst.accept(
             MeterEntity.newService("service-test"),
             new BucketedValues(
@@ -178,7 +179,7 @@ public class HistogramFunctionTest {
             })
         );
 
-        final HistogramFunctionInst inst2 = new HistogramFunctionInst();
+        final HistogramFunctionInst inst2 = MetricsObjectPool.get(HistogramFunctionInst.class);
         inst2.deserialize(inst.serialize().build());
 
         Assert.assertEquals(inst, inst2);
@@ -188,7 +189,7 @@ public class HistogramFunctionTest {
 
     @Test
     public void testBuilder() throws IllegalAccessException, InstantiationException {
-        HistogramFunctionInst inst = new HistogramFunctionInst();
+        HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class);
         inst.accept(
             MeterEntity.newService("service-test"),
             new BucketedValues(
@@ -212,11 +213,11 @@ public class HistogramFunctionTest {
         Assert.assertEquals(inst.getDataset(), inst2.getDataset());
     }
 
-    private static class HistogramFunctionInst extends HistogramFunction {
+    public static class HistogramFunctionInst extends HistogramFunction {
 
         @Override
         public AcceptableValue<BucketedValues> createNew() {
-            return new HistogramFunctionInst();
+            return MetricsObjectPool.get(HistogramFunctionInst.class);
         }
     }
 }
diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramFunctionTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramFunctionTest.java
index b5d0588..b9a2800 100644
--- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramFunctionTest.java
+++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramFunctionTest.java
@@ -20,6 +20,7 @@ package org.apache.skywalking.oap.server.core.analysis.meter.function.avg;
 
 import java.util.Map;
 import java.util.stream.IntStream;
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.meter.MeterEntity;
 import org.apache.skywalking.oap.server.core.analysis.meter.function.AcceptableValue;
 import org.apache.skywalking.oap.server.core.analysis.meter.function.BucketedValues;
@@ -51,7 +52,7 @@ public class AvgHistogramFunctionTest {
 
     @Test
     public void testFunction() {
-        HistogramFunctionInst inst = new HistogramFunctionInst();
+        HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class);
         inst.accept(
             MeterEntity.newService("service-test"),
             new BucketedValues(
@@ -88,7 +89,7 @@ public class AvgHistogramFunctionTest {
 
     @Test
     public void testFunctionWithInfinite() {
-        HistogramFunctionInst inst = new HistogramFunctionInst();
+        HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class);
         inst.accept(
             MeterEntity.newService("service-test"),
             new BucketedValues(
@@ -118,7 +119,7 @@ public class AvgHistogramFunctionTest {
 
     @Test
     public void testSerialization() {
-        HistogramFunctionInst inst = new HistogramFunctionInst();
+        HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class);
         inst.accept(
             MeterEntity.newService("service-test"),
             new BucketedValues(
@@ -131,7 +132,7 @@ public class AvgHistogramFunctionTest {
         );
         inst.calculate();
 
-        final HistogramFunctionInst inst2 = new HistogramFunctionInst();
+        final HistogramFunctionInst inst2 = MetricsObjectPool.get(HistogramFunctionInst.class);
         inst2.deserialize(inst.serialize().build());
 
         Assert.assertEquals(inst, inst2);
@@ -141,7 +142,7 @@ public class AvgHistogramFunctionTest {
 
     @Test
     public void testSerializationInInfinite() {
-        HistogramFunctionInst inst = new HistogramFunctionInst();
+        HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class);
         inst.accept(
             MeterEntity.newService("service-test"),
             new BucketedValues(
@@ -153,7 +154,7 @@ public class AvgHistogramFunctionTest {
             })
         );
 
-        final HistogramFunctionInst inst2 = new HistogramFunctionInst();
+        final HistogramFunctionInst inst2 = MetricsObjectPool.get(HistogramFunctionInst.class);
         inst2.deserialize(inst.serialize().build());
 
         Assert.assertEquals(inst, inst2);
@@ -163,7 +164,7 @@ public class AvgHistogramFunctionTest {
 
     @Test
     public void testBuilder() throws IllegalAccessException, InstantiationException {
-        HistogramFunctionInst inst = new HistogramFunctionInst();
+        HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class);
         inst.accept(
             MeterEntity.newService("service-test"),
             new BucketedValues(
@@ -193,7 +194,7 @@ public class AvgHistogramFunctionTest {
     @Test
     public void testGroup() {
 
-        HistogramFunctionInst inst = new HistogramFunctionInst();
+        HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class);
         BucketedValues bv1 = new BucketedValues(
             BUCKETS, new long[] {
             0,
@@ -244,11 +245,11 @@ public class AvgHistogramFunctionTest {
         }, results);
     }
 
-    private static class HistogramFunctionInst extends AvgHistogramFunction {
+    public static class HistogramFunctionInst extends AvgHistogramFunction {
 
         @Override
         public AcceptableValue<BucketedValues> createNew() {
-            return new HistogramFunctionInst();
+            return MetricsObjectPool.get(HistogramFunctionInst.class);
         }
     }
 }
diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetricsTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetricsTest.java
index 4867dc5..9e848d6 100644
--- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetricsTest.java
+++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetricsTest.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.analysis.metrics;
 
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
 import org.junit.Assert;
 import org.junit.Test;
@@ -25,7 +26,7 @@ import org.junit.Test;
 public class LongAvgMetricsTest {
     @Test
     public void testEntranceCombine() {
-        LongAvgMetricsImpl impl = new LongAvgMetricsImpl();
+        LongAvgMetricsImpl impl = MetricsObjectPool.get(LongAvgMetricsImpl.class);
         impl.combine(12, 1);
         impl.combine(24, 2);
         impl.combine(36, 3);
@@ -35,11 +36,11 @@ public class LongAvgMetricsTest {
 
     @Test
     public void testSelfCombine() {
-        LongAvgMetricsImpl impl = new LongAvgMetricsImpl();
+        LongAvgMetricsImpl impl = MetricsObjectPool.get(LongAvgMetricsImpl.class);
         impl.combine(12, 1);
         impl.combine(24, 2);
 
-        LongAvgMetricsImpl impl2 = new LongAvgMetricsImpl();
+        LongAvgMetricsImpl impl2 = MetricsObjectPool.get(LongAvgMetricsImpl.class);
         impl2.combine(24, 1);
         impl2.combine(48, 2);
 
@@ -49,7 +50,7 @@ public class LongAvgMetricsTest {
         Assert.assertEquals(18, impl.getValue());
     }
 
-    public class LongAvgMetricsImpl extends LongAvgMetrics {
+    public static class LongAvgMetricsImpl extends LongAvgMetrics {
 
         @Override
         protected String id0() {
diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetricsTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetricsTest.java
index f3dcd24..0c7be6e 100644
--- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetricsTest.java
+++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetricsTest.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.analysis.metrics;
 
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
 import org.junit.Assert;
 import org.junit.Test;
@@ -29,7 +30,7 @@ public class MaxLongMetricsTest {
 
     @Test
     public void testEntranceCombine() {
-        MaxLongMetricsImpl impl = new MaxLongMetricsImpl();
+        MaxLongMetricsImpl impl = MetricsObjectPool.get(MaxLongMetricsImpl.class);
         impl.combine(10);
         impl.combine(5);
         impl.combine(20);
@@ -39,11 +40,11 @@ public class MaxLongMetricsTest {
 
     @Test
     public void testSelfCombine() {
-        MaxLongMetricsImpl impl = new MaxLongMetricsImpl();
+        MaxLongMetricsImpl impl = MetricsObjectPool.get(MaxLongMetricsImpl.class);
         impl.combine(10);
         impl.combine(5);
 
-        MaxLongMetricsImpl impl2 = new MaxLongMetricsImpl();
+        MaxLongMetricsImpl impl2 = MetricsObjectPool.get(MaxLongMetricsImpl.class);
         impl2.combine(2);
         impl2.combine(6);
 
@@ -51,7 +52,7 @@ public class MaxLongMetricsTest {
         Assert.assertEquals(10, impl.getValue());
     }
 
-    public class MaxLongMetricsImpl extends MaxLongMetrics {
+    public static class MaxLongMetricsImpl extends MaxLongMetrics {
 
         @Override
         protected String id0() {
diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MetricsTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MetricsTest.java
index 351441e..2b9dcfd 100644
--- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MetricsTest.java
+++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MetricsTest.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.analysis.metrics;
 
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
 import org.junit.Assert;
 import org.junit.Test;
@@ -25,13 +26,13 @@ import org.junit.Test;
 public class MetricsTest {
     @Test
     public void testTransferToTimeBucket() {
-        MetricsMocker mocker = new MetricsMocker();
+        MetricsMocker mocker = MetricsObjectPool.get(MetricsMocker.class);
 
         mocker.setTimeBucket(201809120511L);
         Assert.assertEquals(2018091205L, mocker.toTimeBucketInHour());
         Assert.assertEquals(20180912L, mocker.toTimeBucketInDay());
 
-        mocker = new MetricsMocker();
+        mocker = MetricsObjectPool.get(MetricsMocker.class);
 
         mocker.setTimeBucket(2018091205L);
         Assert.assertEquals(20180912L, mocker.toTimeBucketInDay());
@@ -39,7 +40,7 @@ public class MetricsTest {
 
     @Test
     public void testIllegalTransferToTimeBucket() {
-        MetricsMocker mocker = new MetricsMocker();
+        MetricsMocker mocker = MetricsObjectPool.get(MetricsMocker.class);
         mocker.setTimeBucket(2018091205L);
 
         boolean status = true;
@@ -50,7 +51,7 @@ public class MetricsTest {
         }
         Assert.assertFalse(status);
 
-        mocker = new MetricsMocker();
+        mocker = MetricsObjectPool.get(MetricsMocker.class);
         mocker.setTimeBucket(20180912L);
 
         status = true;
@@ -70,7 +71,7 @@ public class MetricsTest {
         Assert.assertFalse(status);
     }
 
-    public class MetricsMocker extends Metrics {
+    public static class MetricsMocker extends Metrics {
 
         @Override
         protected String id0() {
@@ -111,5 +112,10 @@ public class MetricsTest {
         public int remoteHashCode() {
             return 0;
         }
+
+        @Override
+        public void recycle() {
+            handle.recycle(this);
+        }
     }
 }