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/11 05:03:45 UTC

[skywalking] branch object-pool updated (9196835 -> cded2e4)

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.


 discard 9196835  Pool metrics objects
     new cded2e4  Pool metrics objects

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (9196835)
            \
             N -- N -- N   refs/heads/object-pool (cded2e4)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

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.


Summary of changes:
 .../apache/skywalking/oap/server/core/analysis/DispatcherManager.java | 4 ++++
 .../core/analysis/manual/database/DatabaseStatementDispatcher.java    | 1 -
 .../server/core/analysis/manual/endpoint/EndpointMetaDispatcher.java  | 1 -
 .../core/analysis/manual/endpoint/EndpointTrafficDispatcher.java      | 1 -
 .../core/analysis/manual/instance/InstanceTrafficDispatcher.java      | 1 -
 .../core/analysis/manual/instance/InstanceUpdateDispatcher.java       | 1 -
 .../oap/server/core/analysis/manual/log/LogRecordDispatcher.java      | 1 -
 .../manual/networkalias/NetworkAddressAliasSetupDispatcher.java       | 1 -
 .../manual/relation/endpoint/EndpointCallRelationDispatcher.java      | 1 -
 .../relation/instance/ServiceInstanceCallRelationDispatcher.java      | 2 --
 .../manual/relation/service/ServiceCallRelationDispatcher.java        | 2 --
 .../oap/server/core/analysis/manual/segment/SegmentDispatcher.java    | 1 -
 .../server/core/analysis/manual/service/ServiceMetaDispatcher.java    | 1 -
 .../server/core/analysis/manual/service/ServiceTrafficDispatcher.java | 1 -
 .../core/browser/manual/endpoint/BrowserAppPageTrafficDispatcher.java | 1 -
 .../core/browser/manual/errorlog/BrowserErrorLogRecordDispatcher.java | 1 -
 .../manual/instance/BrowserAppSingleVersionTrafficDispatcher.java     | 1 -
 .../core/browser/manual/service/BrowserAppTrafficDispatcher.java      | 1 -
 18 files changed, 4 insertions(+), 19 deletions(-)

[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 cded2e49ef0f8f533289ecd3d9c1f18bd01b34c1
Author: kezhenxu94 <ke...@apache.org>
AuthorDate: Mon Aug 9 22:08:21 2021 +0800

    Pool metrics objects
---
 .../datacarrier/consumer/BulkConsumePool.java      | 16 ++---
 .../analyzer/provider/jvm/JVMSourceDispatcher.java | 13 ++--
 .../listener/DatabaseSlowStatementBuilder.java     |  3 +-
 .../NetworkAddressAliasMappingListener.java        |  3 +-
 .../parser/listener/SegmentAnalysisListener.java   |  3 +-
 .../trace/parser/listener/SourceBuilder.java       | 17 ++---
 .../listener/EventRecordAnalyzerListener.java      |  3 +-
 .../log/listener/RecordAnalysisListener.java       |  3 +-
 .../log/listener/TrafficAnalysisListener.java      |  7 +-
 .../skywalking/oap/meter/analyzer/Analyzer.java    |  9 +--
 .../exporter/provider/grpc/GRPCExporter.java       | 80 ++++++++++++----------
 .../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         | 48 +++++++++++++
 .../core/{source/Source.java => Recyclable.java}   | 13 ++--
 .../oap/server/core/SourceObjectPool.java          | 48 +++++++++++++
 .../server/core/analysis/DispatcherManager.java    |  4 ++
 .../core/analysis/data/MergableBufferedData.java   |  7 +-
 .../manual/endpoint/EndpointMetaDispatcher.java    |  3 +-
 .../analysis/manual/endpoint/EndpointTraffic.java  | 11 +++
 .../manual/endpoint/EndpointTrafficDispatcher.java |  3 +-
 .../analysis/manual/instance/InstanceTraffic.java  | 16 ++++-
 .../manual/instance/InstanceTrafficDispatcher.java |  3 +-
 .../manual/instance/InstanceUpdateDispatcher.java  |  3 +-
 .../manual/networkalias/NetworkAddressAlias.java   | 16 ++++-
 .../NetworkAddressAliasSetupDispatcher.java        |  3 +-
 .../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 ++++-
 .../manual/service/ServiceMetaDispatcher.java      |  3 +-
 .../analysis/manual/service/ServiceTraffic.java    | 13 +++-
 .../manual/service/ServiceTrafficDispatcher.java   |  3 +-
 .../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  | 12 +++-
 .../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  |  6 +-
 .../analysis/worker/MetricsAggregateWorker.java    |  8 +--
 .../analysis/worker/MetricsPersistentWorker.java   | 29 +++++---
 .../analysis/worker/MetricsStreamProcessor.java    |  3 +-
 .../core/analysis/worker/PersistenceWorker.java    |  9 ++-
 .../server/core/analysis/worker/TopNWorker.java    |  2 +-
 .../endpoint/BrowserAppPageTrafficDispatcher.java  |  3 +-
 .../BrowserAppSingleVersionTrafficDispatcher.java  |  3 +-
 .../service/BrowserAppTrafficDispatcher.java       |  3 +-
 .../core/browser/source/BrowserAppPagePerf.java    |  6 ++
 .../core/browser/source/BrowserAppPageTraffic.java |  6 ++
 .../server/core/browser/source/BrowserAppPerf.java |  4 ++
 .../core/browser/source/BrowserAppPerfSource.java  | 24 +++++++
 .../source/BrowserAppSingleVersionPerf.java        |  6 ++
 .../source/BrowserAppSingleVersionTraffic.java     |  6 ++
 .../core/browser/source/BrowserAppTraffic.java     |  4 ++
 .../browser/source/BrowserAppTrafficSource.java    | 11 +++
 .../core/browser/source/BrowserErrorLog.java       | 14 ++++
 .../oap/server/core/exporter/ExportEvent.java      | 11 ++-
 .../server/core/remote/RemoteServiceHandler.java   | 15 ++--
 .../core/remote/client/GRPCRemoteClient.java       | 24 ++++---
 .../core/remote/client/RemoteClientManager.java    |  2 +-
 .../core/remote/client/SelfRemoteClient.java       | 11 +--
 .../oap/server/core/source/AbstractLog.java        | 22 ++++++
 .../skywalking/oap/server/core/source/All.java     | 14 ++++
 .../oap/server/core/source/DatabaseAccess.java     | 10 +++
 .../server/core/source/DatabaseSlowStatement.java  | 10 +++
 .../oap/server/core/source/Endpoint.java           | 18 +++++
 .../oap/server/core/source/EndpointMeta.java       | 10 +++
 .../oap/server/core/source/EndpointRelation.java   | 22 ++++++
 .../server/core/source/EnvoyInstanceMetric.java    | 12 ++++
 .../skywalking/oap/server/core/source/Event.java   | 21 +++++-
 .../skywalking/oap/server/core/source/Log.java     |  5 ++
 .../core/source/NetworkAddressAliasSetup.java      | 12 ++++
 .../skywalking/oap/server/core/source/Segment.java | 41 +++++------
 .../skywalking/oap/server/core/source/Service.java | 18 +++++
 .../oap/server/core/source/ServiceInstance.java    | 19 +++++
 .../server/core/source/ServiceInstanceCLRCPU.java  | 13 +++-
 .../server/core/source/ServiceInstanceCLRGC.java   | 16 ++++-
 .../core/source/ServiceInstanceCLRThread.java      | 16 ++++-
 .../server/core/source/ServiceInstanceJVMCPU.java  | 11 +++
 .../core/source/ServiceInstanceJVMClass.java       | 13 ++++
 .../server/core/source/ServiceInstanceJVMGC.java   | 13 ++++
 .../core/source/ServiceInstanceJVMMemory.java      | 15 ++++
 .../core/source/ServiceInstanceJVMMemoryPool.java  | 15 ++++
 .../core/source/ServiceInstanceJVMThread.java      | 17 +++++
 .../core/source/ServiceInstanceRelation.java       | 27 ++++++++
 .../server/core/source/ServiceInstanceUpdate.java  |  9 +++
 .../oap/server/core/source/ServiceMeta.java        |  8 +++
 .../oap/server/core/source/ServiceRelation.java    | 25 +++++++
 .../skywalking/oap/server/core/source/SideCar.java | 14 +++-
 .../skywalking/oap/server/core/source/Source.java  | 11 ++-
 .../skywalking/oap/server/core/source/TCPInfo.java | 15 +++-
 .../oap/server/core/worker/RemoteHandleWorker.java |  2 +-
 .../endpoint/EndpointCallRelationTest.java         | 13 ++--
 .../instance/ServiceInstanceRelationTest.java      | 25 ++++---
 .../relation/service/ServiceRelationTest.java      | 25 ++++---
 .../manual/service/ServiceTrafficTest.java         |  5 +-
 .../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 +++--
 .../provider/handler/ServiceManagementHandler.java |  5 +-
 .../errorlog/listener/ErrorLogRecordListener.java  |  3 +-
 .../parser/errorlog/listener/SourceBuilder.java    |  7 +-
 .../parser/performance/listener/SourceBuilder.java | 13 ++--
 .../clr/provider/handler/CLRSourceDispatcher.java  |  7 +-
 .../handler/v8/grpc/ManagementServiceHandler.java  |  7 +-
 .../v8/rest/ManagementServiceKeepAliveHandler.java |  5 +-
 .../ManagementServiceReportPropertiesHandler.java  |  3 +-
 .../receiver/mesh/TelemetryDataDispatcher.java     | 13 ++--
 .../listener/MultiScopesAnalysisListenerTest.java  |  3 +-
 .../server/receiver/zipkin/trace/SpanForward.java  |  7 +-
 .../server/storage/plugin/zipkin/ZipkinSpan.java   | 19 +++++
 145 files changed, 1502 insertions(+), 352 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/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/jvm/JVMSourceDispatcher.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/jvm/JVMSourceDispatcher.java
index bed6241..faa13cf 100644
--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/jvm/JVMSourceDispatcher.java
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/jvm/JVMSourceDispatcher.java
@@ -28,6 +28,7 @@ import org.apache.skywalking.apm.network.language.agent.v3.Memory;
 import org.apache.skywalking.apm.network.language.agent.v3.MemoryPool;
 import org.apache.skywalking.apm.network.language.agent.v3.Thread;
 import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.SourceObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
 import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
@@ -76,7 +77,7 @@ public class JVMSourceDispatcher {
                                         String serviceInstanceId,
                                         long timeBucket,
                                         CPU cpu) {
-        ServiceInstanceJVMCPU serviceInstanceJVMCPU = new ServiceInstanceJVMCPU();
+        ServiceInstanceJVMCPU serviceInstanceJVMCPU = SourceObjectPool.get(ServiceInstanceJVMCPU.class);
         serviceInstanceJVMCPU.setId(serviceInstanceId);
         serviceInstanceJVMCPU.setName(serviceInstance);
         serviceInstanceJVMCPU.setServiceId(serviceId);
@@ -95,7 +96,7 @@ public class JVMSourceDispatcher {
                                        long timeBucket,
                                        List<GC> gcs) {
         gcs.forEach(gc -> {
-            ServiceInstanceJVMGC serviceInstanceJVMGC = new ServiceInstanceJVMGC();
+            ServiceInstanceJVMGC serviceInstanceJVMGC = SourceObjectPool.get(ServiceInstanceJVMGC.class);
             serviceInstanceJVMGC.setId(serviceInstanceId);
             serviceInstanceJVMGC.setName(serviceInstance);
             serviceInstanceJVMGC.setServiceId(serviceId);
@@ -124,7 +125,7 @@ public class JVMSourceDispatcher {
                                            long timeBucket,
                                            List<Memory> memories) {
         memories.forEach(memory -> {
-            ServiceInstanceJVMMemory serviceInstanceJVMMemory = new ServiceInstanceJVMMemory();
+            ServiceInstanceJVMMemory serviceInstanceJVMMemory = SourceObjectPool.get(ServiceInstanceJVMMemory.class);
             serviceInstanceJVMMemory.setId(serviceInstanceId);
             serviceInstanceJVMMemory.setName(serviceInstance);
             serviceInstanceJVMMemory.setServiceId(serviceId);
@@ -147,7 +148,7 @@ public class JVMSourceDispatcher {
                                                List<MemoryPool> memoryPools) {
 
         memoryPools.forEach(memoryPool -> {
-            ServiceInstanceJVMMemoryPool serviceInstanceJVMMemoryPool = new ServiceInstanceJVMMemoryPool();
+            ServiceInstanceJVMMemoryPool serviceInstanceJVMMemoryPool = SourceObjectPool.get(ServiceInstanceJVMMemoryPool.class);
             serviceInstanceJVMMemoryPool.setId(serviceInstanceId);
             serviceInstanceJVMMemoryPool.setName(serviceInstance);
             serviceInstanceJVMMemoryPool.setServiceId(serviceId);
@@ -189,7 +190,7 @@ public class JVMSourceDispatcher {
                                            String serviceInstanceId,
                                            long timeBucket,
                                            Thread thread) {
-        ServiceInstanceJVMThread serviceInstanceJVMThread = new ServiceInstanceJVMThread();
+        ServiceInstanceJVMThread serviceInstanceJVMThread = SourceObjectPool.get(ServiceInstanceJVMThread.class);
         serviceInstanceJVMThread.setId(serviceInstanceId);
         serviceInstanceJVMThread.setName(serviceInstance);
         serviceInstanceJVMThread.setServiceId(serviceId);
@@ -211,7 +212,7 @@ public class JVMSourceDispatcher {
                                           String serviceInstanceId,
                                           long timeBucket,
                                           Class clazz) {
-        ServiceInstanceJVMClass serviceInstanceJVMClass = new ServiceInstanceJVMClass();
+        ServiceInstanceJVMClass serviceInstanceJVMClass = SourceObjectPool.get(ServiceInstanceJVMClass.class);
         serviceInstanceJVMClass.setId(serviceInstanceId);
         serviceInstanceJVMClass.setName(serviceInstance);
         serviceInstanceJVMClass.setServiceId(serviceId);
diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/DatabaseSlowStatementBuilder.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/DatabaseSlowStatementBuilder.java
index 056e9e1..6e4c82f 100644
--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/DatabaseSlowStatementBuilder.java
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/DatabaseSlowStatementBuilder.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
+import org.apache.skywalking.oap.server.core.SourceObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
 import org.apache.skywalking.oap.server.core.config.NamingControl;
@@ -57,7 +58,7 @@ public class DatabaseSlowStatementBuilder {
     }
 
     DatabaseSlowStatement toDatabaseSlowStatement() {
-        DatabaseSlowStatement dbSlowStat = new DatabaseSlowStatement();
+        DatabaseSlowStatement dbSlowStat = SourceObjectPool.get(DatabaseSlowStatement.class);
         dbSlowStat.setId(id);
         dbSlowStat.setTraceId(traceId);
         dbSlowStat.setDatabaseServiceId(IDManager.ServiceID.buildId(serviceName, type));
diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/NetworkAddressAliasMappingListener.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/NetworkAddressAliasMappingListener.java
index 3622e3e..703fa7d 100644
--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/NetworkAddressAliasMappingListener.java
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/NetworkAddressAliasMappingListener.java
@@ -25,6 +25,7 @@ import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject;
 import org.apache.skywalking.apm.network.language.agent.v3.SpanLayer;
 import org.apache.skywalking.apm.network.language.agent.v3.SpanObject;
 import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.SourceObjectPool;
 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.config.NamingControl;
@@ -72,7 +73,7 @@ public class NetworkAddressAliasMappingListener implements EntryAnalysisListener
                     final String instanceName = namingControl.formatInstanceName(
                         segmentObject.getServiceInstance());
 
-                    final NetworkAddressAliasSetup networkAddressAliasSetup = new NetworkAddressAliasSetup();
+                    final NetworkAddressAliasSetup networkAddressAliasSetup = SourceObjectPool.get(NetworkAddressAliasSetup.class);
                     networkAddressAliasSetup.setAddress(networkAddressUsedAtPeer);
                     networkAddressAliasSetup.setRepresentService(serviceName);
                     networkAddressAliasSetup.setRepresentServiceNodeType(NodeType.Normal);
diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SegmentAnalysisListener.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SegmentAnalysisListener.java
index 7085a33..8464871 100644
--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SegmentAnalysisListener.java
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SegmentAnalysisListener.java
@@ -32,6 +32,7 @@ import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener.
 import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener.strategy.SegmentStatusStrategy;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.SourceObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
 import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
@@ -57,7 +58,7 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal
     private final SegmentStatusAnalyzer segmentStatusAnalyzer;
     private final TraceLatencyThresholdsAndWatcher traceLatencyThresholdsAndWatcher;
 
-    private final Segment segment = new Segment();
+    private final Segment segment = SourceObjectPool.get(Segment.class);
     private SAMPLE_STATUS sampleStatus = SAMPLE_STATUS.UNKNOWN;
     private String serviceName = Const.EMPTY_STRING;
     private String serviceId = Const.EMPTY_STRING;
diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java
index c5e243b..2b6d882 100644
--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java
@@ -25,6 +25,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import org.apache.skywalking.apm.network.common.v3.KeyStringValuePair;
 import org.apache.skywalking.apm.util.StringUtil;
+import org.apache.skywalking.oap.server.core.SourceObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
 import org.apache.skywalking.oap.server.core.config.NamingControl;
 import org.apache.skywalking.oap.server.core.source.All;
@@ -112,7 +113,7 @@ class SourceBuilder {
      * The global level metrics source
      */
     All toAll() {
-        All all = new All();
+        All all = SourceObjectPool.get(All.class);
         all.setName(destServiceName);
         all.setServiceInstanceName(destServiceInstanceName);
         all.setEndpointName(destEndpointName);
@@ -129,7 +130,7 @@ class SourceBuilder {
      * Service meta and metrics related source of {@link #destServiceName}. The metrics base on the OAL scripts.
      */
     Service toService() {
-        Service service = new Service();
+        Service service = SourceObjectPool.get(Service.class);
         service.setName(destServiceName);
         service.setServiceInstanceName(destServiceInstanceName);
         service.setEndpointName(destEndpointName);
@@ -147,7 +148,7 @@ class SourceBuilder {
      * Service topology meta and metrics related source. The metrics base on the OAL scripts.
      */
     ServiceRelation toServiceRelation() {
-        ServiceRelation serviceRelation = new ServiceRelation();
+        ServiceRelation serviceRelation = SourceObjectPool.get(ServiceRelation.class);
         serviceRelation.setSourceServiceName(sourceServiceName);
         serviceRelation.setSourceServiceNodeType(sourceNodeType);
         serviceRelation.setSourceServiceInstanceName(sourceServiceInstanceName);
@@ -170,7 +171,7 @@ class SourceBuilder {
      * scripts.
      */
     ServiceInstance toServiceInstance() {
-        ServiceInstance serviceInstance = new ServiceInstance();
+        ServiceInstance serviceInstance = SourceObjectPool.get(ServiceInstance.class);
         serviceInstance.setName(destServiceInstanceName);
         serviceInstance.setServiceName(destServiceName);
         serviceInstance.setNodeType(destNodeType);
@@ -191,7 +192,7 @@ class SourceBuilder {
         if (StringUtil.isEmpty(sourceServiceInstanceName) || StringUtil.isEmpty(destServiceInstanceName)) {
             return null;
         }
-        ServiceInstanceRelation serviceInstanceRelation = new ServiceInstanceRelation();
+        ServiceInstanceRelation serviceInstanceRelation = SourceObjectPool.get(ServiceInstanceRelation.class);
         serviceInstanceRelation.setSourceServiceName(sourceServiceName);
         serviceInstanceRelation.setSourceServiceNodeType(sourceNodeType);
         serviceInstanceRelation.setSourceServiceInstanceName(sourceServiceInstanceName);
@@ -213,7 +214,7 @@ class SourceBuilder {
      * Endpoint meta and metrics of {@link #destEndpointName} related source. The metrics base on the OAL scripts.
      */
     Endpoint toEndpoint() {
-        Endpoint endpoint = new Endpoint();
+        Endpoint endpoint = SourceObjectPool.get(Endpoint.class);
         endpoint.setName(destEndpointName);
         endpoint.setServiceName(destServiceName);
         endpoint.setServiceNodeType(destNodeType);
@@ -263,7 +264,7 @@ class SourceBuilder {
      * generate traffic and metrics both.
      */
     ServiceMeta toServiceMeta() {
-        ServiceMeta service = new ServiceMeta();
+        ServiceMeta service = SourceObjectPool.get(ServiceMeta.class);
         service.setName(destServiceName);
         service.setNodeType(destNodeType);
         service.setTimeBucket(timeBucket);
@@ -277,7 +278,7 @@ class SourceBuilder {
         if (!RequestType.DATABASE.equals(type)) {
             return null;
         }
-        DatabaseAccess databaseAccess = new DatabaseAccess();
+        DatabaseAccess databaseAccess = SourceObjectPool.get(DatabaseAccess.class);
         databaseAccess.setDatabaseTypeId(componentId);
         databaseAccess.setLatency(latency);
         databaseAccess.setName(destServiceName);
diff --git a/oap-server/analyzer/event-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/event/listener/EventRecordAnalyzerListener.java b/oap-server/analyzer/event-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/event/listener/EventRecordAnalyzerListener.java
index b8c0d18..fa39178 100644
--- a/oap-server/analyzer/event-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/event/listener/EventRecordAnalyzerListener.java
+++ b/oap-server/analyzer/event-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/event/listener/EventRecordAnalyzerListener.java
@@ -22,6 +22,7 @@ import com.google.gson.Gson;
 import lombok.RequiredArgsConstructor;
 import org.apache.skywalking.apm.network.event.v3.Source;
 import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
 import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
 import org.apache.skywalking.oap.server.core.config.NamingControl;
@@ -40,7 +41,7 @@ public class EventRecordAnalyzerListener implements EventAnalyzerListener {
 
     private final SourceReceiver sourceReceiver;
 
-    private final Event event = new Event();
+    private final Event event = MetricsObjectPool.get(Event.class);
 
     @Override
     public void build() {
diff --git a/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/provider/log/listener/RecordAnalysisListener.java b/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/provider/log/listener/RecordAnalysisListener.java
index a312cec..9341dee 100644
--- a/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/provider/log/listener/RecordAnalysisListener.java
+++ b/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/provider/log/listener/RecordAnalysisListener.java
@@ -32,6 +32,7 @@ import org.apache.skywalking.apm.util.StringUtil;
 import org.apache.skywalking.oap.log.analyzer.provider.LogAnalyzerModuleConfig;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.SourceObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
 import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
@@ -53,7 +54,7 @@ public class RecordAnalysisListener implements LogAnalysisListener {
     private final SourceReceiver sourceReceiver;
     private final NamingControl namingControl;
     private final List<String> searchableTagKeys;
-    private final Log log = new Log();
+    private final Log log = SourceObjectPool.get(Log.class);
 
     @Override
     public void build() {
diff --git a/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/provider/log/listener/TrafficAnalysisListener.java b/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/provider/log/listener/TrafficAnalysisListener.java
index 615abd4..337394f 100644
--- a/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/provider/log/listener/TrafficAnalysisListener.java
+++ b/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/provider/log/listener/TrafficAnalysisListener.java
@@ -23,6 +23,7 @@ import org.apache.skywalking.apm.network.logging.v3.LogData;
 import org.apache.skywalking.apm.util.StringUtil;
 import org.apache.skywalking.oap.log.analyzer.provider.LogAnalyzerModuleConfig;
 import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.SourceObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.DownSampling;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
@@ -68,20 +69,20 @@ public class TrafficAnalysisListener implements LogAnalysisListener {
         // to service traffic
         String serviceName = namingControl.formatServiceName(logData.getService());
         String serviceId = IDManager.ServiceID.buildId(serviceName, NodeType.Normal);
-        serviceMeta = new ServiceMeta();
+        serviceMeta = SourceObjectPool.get(ServiceMeta.class);
         serviceMeta.setName(namingControl.formatServiceName(logData.getService()));
         serviceMeta.setNodeType(NodeType.Normal);
         serviceMeta.setTimeBucket(timeBucket);
         // to service instance traffic
         if (StringUtil.isNotEmpty(logData.getServiceInstance())) {
-            instanceMeta = new ServiceInstanceUpdate();
+            instanceMeta = SourceObjectPool.get(ServiceInstanceUpdate.class);
             instanceMeta.setServiceId(serviceId);
             instanceMeta.setName(namingControl.formatInstanceName(logData.getServiceInstance()));
             instanceMeta.setTimeBucket(timeBucket);
         }
         // to endpoint traffic
         if (StringUtil.isNotEmpty(logData.getEndpoint())) {
-            endpointMeta = new EndpointMeta();
+            endpointMeta = SourceObjectPool.get(EndpointMeta.class);
             endpointMeta.setServiceName(serviceName);
             endpointMeta.setServiceNodeType(NodeType.Normal);
             endpointMeta.setEndpoint(namingControl.formatEndpointName(serviceName, logData.getEndpoint()));
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..eea0609 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;
@@ -260,7 +261,7 @@ public class Analyzer {
         }
 
         if (!com.google.common.base.Strings.isNullOrEmpty(entity.getInstanceName())) {
-            InstanceTraffic instanceTraffic = new InstanceTraffic();
+            InstanceTraffic instanceTraffic = MetricsObjectPool.get(InstanceTraffic.class);
             instanceTraffic.setName(entity.getInstanceName());
             instanceTraffic.setServiceId(entity.serviceId());
             instanceTraffic.setTimeBucket(TimeBucket.getMinuteTimeBucket(System.currentTimeMillis()));
@@ -277,7 +278,7 @@ public class Analyzer {
     }
 
     private void toService(String serviceName) {
-        ServiceTraffic s = new ServiceTraffic();
+        ServiceTraffic s = MetricsObjectPool.get(ServiceTraffic.class);
         s.setName(requireNonNull(serviceName));
         s.setNodeType(NodeType.Normal);
         s.setTimeBucket(TimeBucket.getMinuteTimeBucket(System.currentTimeMillis()));
@@ -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..b6efb25 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();
@@ -151,46 +151,52 @@ public class GRPCExporter extends MetricFormatter implements MetricValuesExportS
                                        });
         AtomicInteger exportNum = new AtomicInteger();
         data.forEach(row -> {
-            ExportMetricValue.Builder builder = ExportMetricValue.newBuilder();
-
             Metrics metrics = row.getMetrics();
-            if (metrics instanceof LongValueHolder) {
-                long value = ((LongValueHolder) metrics).getValue();
-                builder.setLongValue(value);
-                builder.setType(ValueType.LONG);
-            } else if (metrics instanceof IntValueHolder) {
-                long value = ((IntValueHolder) metrics).getValue();
-                builder.setLongValue(value);
-                builder.setType(ValueType.LONG);
-            } else if (metrics instanceof DoubleValueHolder) {
-                double value = ((DoubleValueHolder) metrics).getValue();
-                builder.setDoubleValue(value);
-                builder.setType(ValueType.DOUBLE);
-            } else if (metrics instanceof MultiIntValuesHolder) {
-                int[] values = ((MultiIntValuesHolder) metrics).getValues();
-                for (int value : values) {
-                    builder.addLongValues(value);
+            try {
+                ExportMetricValue.Builder builder = ExportMetricValue.newBuilder();
+
+                if (metrics instanceof LongValueHolder) {
+                    long value = ((LongValueHolder) metrics).getValue();
+                    builder.setLongValue(value);
+                    builder.setType(ValueType.LONG);
+                } else if (metrics instanceof IntValueHolder) {
+                    long value = ((IntValueHolder) metrics).getValue();
+                    builder.setLongValue(value);
+                    builder.setType(ValueType.LONG);
+                } else if (metrics instanceof DoubleValueHolder) {
+                    double value = ((DoubleValueHolder) metrics).getValue();
+                    builder.setDoubleValue(value);
+                    builder.setType(ValueType.DOUBLE);
+                } else if (metrics instanceof MultiIntValuesHolder) {
+                    int[] values = ((MultiIntValuesHolder) metrics).getValues();
+                    for (int value : values) {
+                        builder.addLongValues(value);
+                    }
+                    builder.setType(ValueType.MULTI_LONG);
+                } else {
+                    return;
                 }
-                builder.setType(ValueType.MULTI_LONG);
-            } else {
-                return;
-            }
 
-            MetricsMetaInfo meta = row.getMeta();
-            builder.setMetricName(meta.getMetricsName());
-            builder.setEventType(
-                EventType.INCREMENT.equals(row.getEventType()) ? EventType.INCREMENT : EventType.TOTAL);
-            String entityName = getEntityName(meta);
-            if (entityName == null) {
-                return;
-            }
-            builder.setEntityName(entityName);
-            builder.setEntityId(meta.getId());
+                MetricsMetaInfo meta = row.getMeta();
+                builder.setMetricName(meta.getMetricsName());
+                builder.setEventType(ExportEvent.EventType.INCREMENT == row.getEventType()
+                                         ? EventType.INCREMENT
+                                         : EventType.TOTAL);
+                String entityName = getEntityName(meta);
+                if (entityName == null) {
+                    return;
+                }
+                builder.setEntityName(entityName);
+                builder.setEntityId(meta.getId());
 
-            builder.setTimeBucket(metrics.getTimeBucket());
+                builder.setTimeBucket(metrics.getTimeBucket());
 
-            streamObserver.onNext(builder.build());
-            exportNum.getAndIncrement();
+                streamObserver.onNext(builder.build());
+                exportNum.getAndIncrement();
+            } finally {
+                log.info("Recycling pooled objects");
+                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..1e7ec61 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 = (${metricsClassPackage}${metricsName}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..690b5c5 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 = (${metricsClassPackage}${metricsName}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..062fb2a 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 = (${metricsClassPackage}${metricsName}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..2ed29ae 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 = (${metricsClassPackage}${metricsName}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..189ef55
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/MetricsObjectPool.java
@@ -0,0 +1,48 @@
+/*
+ * 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.Recycler;
+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>, Recycler<Metrics>> POOLS =
+        new ConcurrentHashMap<>();
+
+    @SuppressWarnings("unchecked")
+    public static <T extends Metrics> T get(Class<T> type) {
+        final Recycler<Metrics> pool = POOLS.computeIfAbsent(type, __ -> new Recycler<Metrics>() {
+            @Override
+            protected Metrics newObject(Handle<Metrics> 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/source/Source.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/Recyclable.java
similarity index 79%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/Recyclable.java
index 5c99722..bab8809 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/Recyclable.java
@@ -13,17 +13,14 @@
  * 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.source;
+package org.apache.skywalking.oap.server.core;
 
-import lombok.Getter;
-import lombok.Setter;
+import io.netty.util.Recycler;
 
-public abstract class Source implements ISource {
+public interface Recyclable<T> {
+    void handle(Recycler.Handle<T> handle);
 
-    @Getter
-    @Setter
-    private long timeBucket;
+    void recycle();
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/SourceObjectPool.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/SourceObjectPool.java
new file mode 100644
index 0000000..c00d032
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/SourceObjectPool.java
@@ -0,0 +1,48 @@
+/*
+ * 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.Recycler;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.skywalking.oap.server.core.source.Source;
+
+@Slf4j
+public final class SourceObjectPool {
+    private static final Map<Class<? extends Source>, Recycler<Source>> POOLS =
+        new ConcurrentHashMap<>();
+
+    @SuppressWarnings("unchecked")
+    public static <T extends Source> T get(Class<T> type) {
+        final Recycler<Source> pool = POOLS.computeIfAbsent(type, __ -> new Recycler<Source>() {
+            @Override
+            protected Source newObject(Handle<Source> handle) {
+                try {
+                    final Source 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/analysis/DispatcherManager.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/DispatcherManager.java
index 890d1a4..9bb3f73 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/DispatcherManager.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/DispatcherManager.java
@@ -28,6 +28,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.skywalking.oap.server.core.Recyclable;
 import org.apache.skywalking.oap.server.core.UnexpectedException;
 import org.apache.skywalking.oap.server.core.source.ISource;
 import org.slf4j.Logger;
@@ -60,6 +61,9 @@ public class DispatcherManager implements DispatcherDetectorListener {
             for (SourceDispatcher dispatcher : dispatchers) {
                 dispatcher.dispatch(source);
             }
+            if (source instanceof Recyclable<?>) {
+                ((Recyclable<?>) source).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..211beb0 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;
 
 /**
@@ -31,7 +31,7 @@ import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics;
  * Concurrency {@link #accept(Metrics)}s and {@link #read()} while {@link #accept(Metrics)} are both not recommended.
  */
 public class MergableBufferedData<METRICS extends Metrics> implements BufferedData<METRICS> {
-    private Map<String, METRICS> buffer;
+    private final Map<String, METRICS> buffer;
 
     public MergableBufferedData() {
         buffer = new HashMap<>();
@@ -52,6 +52,7 @@ public class MergableBufferedData<METRICS extends Metrics> implements BufferedDa
             buffer.put(id, data);
         } else {
             final boolean isAbandoned = !existed.combine(data);
+            data.recycle();
             if (isAbandoned) {
                 buffer.remove(id);
             }
@@ -61,7 +62,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/EndpointMetaDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointMetaDispatcher.java
index fa5fe48..8ce2fcd 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointMetaDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointMetaDispatcher.java
@@ -17,6 +17,7 @@
 
 package org.apache.skywalking.oap.server.core.analysis.manual.endpoint;
 
+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.EndpointMeta;
@@ -25,7 +26,7 @@ public class EndpointMetaDispatcher implements SourceDispatcher<EndpointMeta> {
 
     @Override
     public void dispatch(final EndpointMeta source) {
-        EndpointTraffic traffic = new EndpointTraffic();
+        EndpointTraffic traffic = MetricsObjectPool.get(EndpointTraffic.class);
         traffic.setTimeBucket(source.getTimeBucket());
         traffic.setName(source.getEndpoint());
         traffic.setServiceId(source.getServiceId());
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/endpoint/EndpointTrafficDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTrafficDispatcher.java
index 44ff6d9..a53f0fe 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTrafficDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTrafficDispatcher.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.analysis.manual.endpoint;
 
+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.Endpoint;
@@ -26,7 +27,7 @@ public class EndpointTrafficDispatcher implements SourceDispatcher<Endpoint> {
 
     @Override
     public void dispatch(final Endpoint source) {
-        EndpointTraffic traffic = new EndpointTraffic();
+        EndpointTraffic traffic = MetricsObjectPool.get(EndpointTraffic.class);
         traffic.setTimeBucket(source.getTimeBucket());
         traffic.setName(source.getName());
         traffic.setServiceId(source.getServiceId());
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..ddaa497 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
@@ -27,6 +27,7 @@ import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.apm.util.StringUtil;
 import org.apache.skywalking.oap.server.core.Const;
+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.MetricsExtension;
 import org.apache.skywalking.oap.server.core.analysis.Stream;
@@ -79,7 +80,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,10 +126,21 @@ 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) {
-            InstanceTraffic instanceTraffic = new InstanceTraffic();
+            InstanceTraffic instanceTraffic = MetricsObjectPool.get(InstanceTraffic.class);
             instanceTraffic.setServiceId((String) dbMap.get(SERVICE_ID));
             instanceTraffic.setName((String) dbMap.get(NAME));
             final String propString = (String) dbMap.get(PROPERTIES);
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/instance/InstanceTrafficDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/instance/InstanceTrafficDispatcher.java
index 92ef395..4b13aad 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/instance/InstanceTrafficDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/instance/InstanceTrafficDispatcher.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.analysis.manual.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.ServiceInstance;
@@ -25,7 +26,7 @@ import org.apache.skywalking.oap.server.core.source.ServiceInstance;
 public class InstanceTrafficDispatcher implements SourceDispatcher<ServiceInstance> {
     @Override
     public void dispatch(final ServiceInstance source) {
-        InstanceTraffic traffic = new InstanceTraffic();
+        InstanceTraffic traffic = MetricsObjectPool.get(InstanceTraffic.class);
         traffic.setTimeBucket(source.getTimeBucket());
         traffic.setName(source.getName());
         traffic.setServiceId(source.getServiceId());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/instance/InstanceUpdateDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/instance/InstanceUpdateDispatcher.java
index 5a2cf78..0229994 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/instance/InstanceUpdateDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/instance/InstanceUpdateDispatcher.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.analysis.manual.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.ServiceInstanceUpdate;
@@ -25,7 +26,7 @@ import org.apache.skywalking.oap.server.core.source.ServiceInstanceUpdate;
 public class InstanceUpdateDispatcher implements SourceDispatcher<ServiceInstanceUpdate> {
     @Override
     public void dispatch(final ServiceInstanceUpdate source) {
-        InstanceTraffic traffic = new InstanceTraffic();
+        InstanceTraffic traffic = MetricsObjectPool.get(InstanceTraffic.class);
         traffic.setTimeBucket(source.getTimeBucket());
         traffic.setName(source.getName());
         traffic.setServiceId(source.getServiceId());
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..eaab4ae 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
@@ -23,6 +23,7 @@ import java.util.Map;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Setter;
+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.MetricsExtension;
 import org.apache.skywalking.oap.server.core.analysis.Stream;
@@ -72,7 +73,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,10 +114,21 @@ 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) {
-            final NetworkAddressAlias networkAddressAlias = new NetworkAddressAlias();
+            final NetworkAddressAlias networkAddressAlias = MetricsObjectPool.get(NetworkAddressAlias.class);
             networkAddressAlias.setAddress((String) dbMap.get(ADDRESS));
             networkAddressAlias.setRepresentServiceId((String) dbMap.get(REPRESENT_SERVICE_ID));
             networkAddressAlias.setRepresentServiceInstanceId((String) dbMap.get(REPRESENT_SERVICE_INSTANCE_ID));
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/networkalias/NetworkAddressAliasSetupDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/networkalias/NetworkAddressAliasSetupDispatcher.java
index b368a01..bfb423b 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/networkalias/NetworkAddressAliasSetupDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/networkalias/NetworkAddressAliasSetupDispatcher.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.analysis.manual.networkalias;
 
+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.NetworkAddressAliasSetup;
@@ -25,7 +26,7 @@ import org.apache.skywalking.oap.server.core.source.NetworkAddressAliasSetup;
 public class NetworkAddressAliasSetupDispatcher implements SourceDispatcher<NetworkAddressAliasSetup> {
     @Override
     public void dispatch(final NetworkAddressAliasSetup source) {
-        final NetworkAddressAlias networkAddressAlias = new NetworkAddressAlias();
+        final NetworkAddressAlias networkAddressAlias = MetricsObjectPool.get(NetworkAddressAlias.class);
         networkAddressAlias.setTimeBucket(source.getTimeBucket());
         networkAddressAlias.setAddress(source.getAddress());
         networkAddressAlias.setRepresentServiceId(source.getRepresentServiceId());
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/ServiceMetaDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceMetaDispatcher.java
index 3e91671..2a55ebf 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceMetaDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceMetaDispatcher.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.analysis.manual.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.ServiceMeta;
@@ -25,7 +26,7 @@ import org.apache.skywalking.oap.server.core.source.ServiceMeta;
 public class ServiceMetaDispatcher implements SourceDispatcher<ServiceMeta> {
     @Override
     public void dispatch(final ServiceMeta source) {
-        ServiceTraffic traffic = new ServiceTraffic();
+        ServiceTraffic traffic = MetricsObjectPool.get(ServiceTraffic.class);
         traffic.setTimeBucket(source.getTimeBucket());
         traffic.setName(source.getName());
         traffic.setNodeType(source.getNodeType());
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..b8e5662 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
@@ -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.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.MetricsExtension;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
@@ -94,11 +95,21 @@ 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
         public ServiceTraffic storage2Entity(final Map<String, Object> dbMap) {
-            ServiceTraffic serviceTraffic = new ServiceTraffic();
+            ServiceTraffic serviceTraffic = MetricsObjectPool.get(ServiceTraffic.class);
             serviceTraffic.setName((String) dbMap.get(NAME));
             serviceTraffic.setNodeType(NodeType.valueOf(((Number) dbMap.get(NODE_TYPE)).intValue()));
             serviceTraffic.setGroup((String) dbMap.get(GROUP));
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTrafficDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTrafficDispatcher.java
index ace9e7c..711752f 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTrafficDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTrafficDispatcher.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.analysis.manual.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.Service;
@@ -25,7 +26,7 @@ import org.apache.skywalking.oap.server.core.source.Service;
 public class ServiceTrafficDispatcher implements SourceDispatcher<Service> {
     @Override
     public void dispatch(final Service source) {
-        ServiceTraffic traffic = new ServiceTraffic();
+        ServiceTraffic traffic = MetricsObjectPool.get(ServiceTraffic.class);
         traffic.setTimeBucket(source.getTimeBucket());
         traffic.setName(source.getName());
         traffic.setNodeType(source.getNodeType());
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..89df844 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.Recycler;
 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 Recycler.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..9368587 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.Recycler;
 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 Recycler.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..5710bb8 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,12 @@
 
 package org.apache.skywalking.oap.server.core.analysis.metrics;
 
+import io.netty.util.Recycler;
+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 +36,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 +55,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 +158,9 @@ public abstract class Metrics extends StreamData implements StorageData {
     }
 
     protected abstract String id0();
+
+    @Override
+    public void handle(final Recycler.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..f3ff3db 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;
@@ -44,6 +44,8 @@ public class ExportWorker extends AbstractWorker<ExportEvent> {
                                                        .getService(MetricValuesExportService.class);
             }
             exportService.export(event);
+        } else {
+            event.getMetrics().recycle();
         }
     }
 
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/analysis/worker/PersistenceWorker.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/PersistenceWorker.java
index 2ce8725..4446f74 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/PersistenceWorker.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/PersistenceWorker.java
@@ -23,6 +23,7 @@ import java.util.List;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.skywalking.oap.server.core.Recyclable;
 import org.apache.skywalking.oap.server.core.analysis.data.ReadWriteSafeCache;
 import org.apache.skywalking.oap.server.core.storage.StorageData;
 import org.apache.skywalking.oap.server.core.worker.AbstractWorker;
@@ -68,6 +69,12 @@ public abstract class PersistenceWorker<INPUT extends StorageData> extends Abstr
 
     public List<PrepareRequest> buildBatchRequests() {
         final List<INPUT> dataList = getCache().read();
-        return prepareBatch(dataList);
+        try {
+            return prepareBatch(dataList);
+        } finally {
+            dataList.stream().filter(it -> it instanceof Recyclable<?>)
+                    .<Recyclable<?>>map(it -> (Recyclable<?>) it)
+                    .forEach(Recyclable::recycle);
+        }
     }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/TopNWorker.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/TopNWorker.java
index 1e9db5e..1c3f459 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/TopNWorker.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/TopNWorker.java
@@ -67,7 +67,7 @@ public class TopNWorker extends PersistenceWorker<TopN> {
         long now = System.currentTimeMillis();
         if (now - lastReportTimestamp <= reportPeriod) {
             // Only do report in its own report period.
-            return Collections.EMPTY_LIST;
+            return Collections.emptyList();
         }
         lastReportTimestamp = now;
         return super.buildBatchRequests();
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/manual/endpoint/BrowserAppPageTrafficDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/manual/endpoint/BrowserAppPageTrafficDispatcher.java
index 8df13e6..92543ff 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/manual/endpoint/BrowserAppPageTrafficDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/manual/endpoint/BrowserAppPageTrafficDispatcher.java
@@ -17,6 +17,7 @@
 
 package org.apache.skywalking.oap.server.core.browser.manual.endpoint;
 
+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.manual.endpoint.EndpointTraffic;
 import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
@@ -26,7 +27,7 @@ import org.apache.skywalking.oap.server.core.browser.source.BrowserAppPageTraffi
 public class BrowserAppPageTrafficDispatcher extends BrowserAppTrafficSourceDispatcher<BrowserAppPageTraffic> implements SourceDispatcher<BrowserAppPageTraffic> {
     @Override
     protected void dispatchInterval(final BrowserAppPageTraffic source) {
-        EndpointTraffic traffic = new EndpointTraffic();
+        EndpointTraffic traffic = MetricsObjectPool.get(EndpointTraffic.class);
         traffic.setTimeBucket(source.getTimeBucket());
         traffic.setName(source.getName());
         traffic.setServiceId(source.getServiceId());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/manual/instance/BrowserAppSingleVersionTrafficDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/manual/instance/BrowserAppSingleVersionTrafficDispatcher.java
index 7ea9b3d..9d9bd43 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/manual/instance/BrowserAppSingleVersionTrafficDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/manual/instance/BrowserAppSingleVersionTrafficDispatcher.java
@@ -17,6 +17,7 @@
 
 package org.apache.skywalking.oap.server.core.browser.manual.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.manual.instance.InstanceTraffic;
 import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
@@ -26,7 +27,7 @@ import org.apache.skywalking.oap.server.core.browser.source.BrowserAppSingleVers
 public class BrowserAppSingleVersionTrafficDispatcher extends BrowserAppTrafficSourceDispatcher<BrowserAppSingleVersionTraffic> implements SourceDispatcher<BrowserAppSingleVersionTraffic> {
     @Override
     protected void dispatchInterval(final BrowserAppSingleVersionTraffic source) {
-        InstanceTraffic traffic = new InstanceTraffic();
+        InstanceTraffic traffic = MetricsObjectPool.get(InstanceTraffic.class);
         traffic.setTimeBucket(source.getTimeBucket());
         traffic.setName(source.getName());
         traffic.setServiceId(source.getServiceId());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/manual/service/BrowserAppTrafficDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/manual/service/BrowserAppTrafficDispatcher.java
index f710872..0eaf029 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/manual/service/BrowserAppTrafficDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/manual/service/BrowserAppTrafficDispatcher.java
@@ -17,6 +17,7 @@
 
 package org.apache.skywalking.oap.server.core.browser.manual.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.manual.service.ServiceTraffic;
 import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
@@ -26,7 +27,7 @@ import org.apache.skywalking.oap.server.core.browser.source.BrowserAppTraffic;
 public class BrowserAppTrafficDispatcher extends BrowserAppTrafficSourceDispatcher<BrowserAppTraffic> implements SourceDispatcher<BrowserAppTraffic> {
     @Override
     protected void dispatchInterval(final BrowserAppTraffic source) {
-        ServiceTraffic traffic = new ServiceTraffic();
+        ServiceTraffic traffic = MetricsObjectPool.get(ServiceTraffic.class);
         traffic.setTimeBucket(source.getTimeBucket());
         traffic.setName(source.getName());
         traffic.setNodeType(source.getNodeType());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppPagePerf.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppPagePerf.java
index 3a1f95c..2832453 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppPagePerf.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppPagePerf.java
@@ -51,4 +51,10 @@ public class BrowserAppPagePerf extends BrowserAppPerfSource {
     public void prepare() {
         serviceId = IDManager.ServiceID.buildId(serviceName, nodeType);
     }
+
+    @Override
+    protected void recycle0() {
+        serviceId = null;
+        serviceName = null;
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppPageTraffic.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppPageTraffic.java
index b040e2b..d326c2d 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppPageTraffic.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppPageTraffic.java
@@ -51,4 +51,10 @@ public class BrowserAppPageTraffic extends BrowserAppTrafficSource {
     public void prepare() {
         serviceId = IDManager.ServiceID.buildId(serviceName, nodeType);
     }
+
+    @Override
+    protected void recycle0() {
+        serviceId = null;
+        serviceName = null;
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppPerf.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppPerf.java
index 12730ad..9811658 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppPerf.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppPerf.java
@@ -36,4 +36,8 @@ public class BrowserAppPerf extends BrowserAppPerfSource {
     public String getEntityId() {
         return IDManager.ServiceID.buildId(name, nodeType);
     }
+
+    @Override
+    protected void recycle0() {
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppPerfSource.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppPerfSource.java
index c3bbe65..291f59b 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppPerfSource.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppPerfSource.java
@@ -44,4 +44,28 @@ public abstract class BrowserAppPerfSource extends Source {
     private int ttlTime;
     private int firstPackTime;
     private int fmpTime;
+
+    @Override
+    public void recycle() {
+        name = null;
+        redirectTime = 0;
+        dnsTime = 0;
+        ttfbTime = 0;
+        tcpTime = 0;
+        transTime = 0;
+        domAnalysisTime = 0;
+        fptTime = 0;
+        domReadyTime = 0;
+        loadPageTime = 0;
+        resTime = 0;
+        sslTime = 0;
+        ttlTime = 0;
+        firstPackTime = 0;
+        fmpTime = 0;
+        setTimeBucket(0);
+        handle.recycle(this);
+        recycle0();
+    }
+
+    protected abstract void recycle0();
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppSingleVersionPerf.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppSingleVersionPerf.java
index bc86999..c4f9d2e 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppSingleVersionPerf.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppSingleVersionPerf.java
@@ -51,4 +51,10 @@ public class BrowserAppSingleVersionPerf extends BrowserAppPerfSource {
     public void prepare() {
         serviceId = IDManager.ServiceID.buildId(serviceName, nodeType);
     }
+
+    @Override
+    protected void recycle0() {
+        serviceId = null;
+        serviceName = null;
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppSingleVersionTraffic.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppSingleVersionTraffic.java
index 9adce36..9f8258a 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppSingleVersionTraffic.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppSingleVersionTraffic.java
@@ -51,4 +51,10 @@ public class BrowserAppSingleVersionTraffic extends BrowserAppTrafficSource {
     public void prepare() {
         serviceId = IDManager.ServiceID.buildId(serviceName, nodeType);
     }
+
+    @Override
+    protected void recycle0() {
+        serviceId = null;
+        serviceName = null;
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppTraffic.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppTraffic.java
index aa0cb84..9cf8c50 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppTraffic.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppTraffic.java
@@ -36,4 +36,8 @@ public class BrowserAppTraffic extends BrowserAppTrafficSource {
     public String getEntityId() {
         return IDManager.ServiceID.buildId(name, nodeType);
     }
+
+    @Override
+    protected void recycle0() {
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppTrafficSource.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppTrafficSource.java
index f01eb70..260a4f1 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppTrafficSource.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserAppTrafficSource.java
@@ -39,4 +39,15 @@ public abstract class BrowserAppTrafficSource extends Source {
      * if {@link #trafficCategory} is {@link BrowserAppTrafficCategory#NORMAL}, errorCategory is null.
      */
     private BrowserErrorCategory errorCategory;
+
+    @Override
+    public void recycle() {
+        name = null;
+        trafficCategory = null;
+        errorCategory = null;
+        recycle0();
+        handle.recycle(this);
+    }
+
+    protected abstract void recycle0();
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserErrorLog.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserErrorLog.java
index b8a723f..623704d 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserErrorLog.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/browser/source/BrowserErrorLog.java
@@ -63,4 +63,18 @@ public class BrowserErrorLog extends Source {
     @Getter
     @Setter
     private byte[] dataBinary;
+
+    @Override
+    public void recycle() {
+        uniqueId = null;
+        serviceId = null;
+        serviceVersionId = null;
+        pagePathId = null;
+        pagePath = null;
+        timestamp = 0;
+        errorCategory = null;
+        dataBinary = null;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
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/RemoteServiceHandler.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/RemoteServiceHandler.java
index 2a37193..1185b60 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/RemoteServiceHandler.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/RemoteServiceHandler.java
@@ -50,10 +50,10 @@ public class RemoteServiceHandler extends RemoteServiceGrpc.RemoteServiceImplBas
 
     private final ModuleDefineHolder moduleDefineHolder;
     private IWorkerInstanceGetter workerInstanceGetter;
-    private CounterMetrics remoteInCounter;
-    private CounterMetrics remoteInErrorCounter;
-    private CounterMetrics remoteInTargetNotFoundCounter;
-    private HistogramMetrics remoteInHistogram;
+    private final CounterMetrics remoteInCounter;
+    private final CounterMetrics remoteInErrorCounter;
+    private final CounterMetrics remoteInTargetNotFoundCounter;
+    private final HistogramMetrics remoteInHistogram;
 
     public RemoteServiceHandler(ModuleDefineHolder moduleDefineHolder) {
         this.moduleDefineHolder = moduleDefineHolder;
@@ -111,15 +111,14 @@ public class RemoteServiceHandler extends RemoteServiceGrpc.RemoteServiceImplBas
             @Override
             public void onNext(RemoteMessage message) {
                 remoteInCounter.inc();
-                HistogramMetrics.Timer timer = remoteInHistogram.createTimer();
-                try {
+                try (HistogramMetrics.Timer ignored = remoteInHistogram.createTimer()) {
                     String nextWorkerName = message.getNextWorkerName();
                     RemoteData remoteData = message.getRemoteData();
 
                     try {
                         RemoteHandleWorker handleWorker = workerInstanceGetter.get(nextWorkerName);
                         if (handleWorker != null) {
-                            AbstractWorker nextWorker = handleWorker.getWorker();
+                            AbstractWorker<StreamData> nextWorker = handleWorker.getWorker();
                             StreamData streamData = handleWorker.getStreamDataClass().newInstance();
                             streamData.deserialize(remoteData);
                             nextWorker.in(streamData);
@@ -134,8 +133,6 @@ public class RemoteServiceHandler extends RemoteServiceGrpc.RemoteServiceImplBas
                         remoteInErrorCounter.inc();
                         LOGGER.error(t.getMessage(), t);
                     }
-                } finally {
-                    timer.finish();
                 }
             }
 
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..6569775 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;
@@ -49,13 +50,13 @@ public class GRPCRemoteClient implements RemoteClient {
     private final int bufferSize;
     private final Address address;
     private final AtomicInteger concurrentStreamObserverNumber = new AtomicInteger(0);
-    private SslContext sslContext;
+    private final SslContext sslContext;
     private GRPCClient client;
     private DataCarrier<RemoteMessage> carrier;
     private boolean isConnect;
-    private CounterMetrics remoteOutCounter;
-    private CounterMetrics remoteOutErrorCounter;
-    private int remoteTimeout;
+    private final CounterMetrics remoteOutCounter;
+    private final CounterMetrics remoteOutErrorCounter;
+    private final int remoteTimeout;
 
     public GRPCRemoteClient(final ModuleDefineHolder moduleDefineHolder,
                             final Address address,
@@ -76,9 +77,8 @@ public class GRPCRemoteClient implements RemoteClient {
                                              .createCounter(
                                                  "remote_out_count",
                                                  "The number(client side) of inside remote inside aggregate rpc.",
-                                                 new MetricsTag.Keys("dest", "self"), new MetricsTag.Values(
-                                                     address
-                                                         .toString(), "N")
+                                                 new MetricsTag.Keys("dest", "self"),
+                                                 new MetricsTag.Values(address.toString(), "N")
                                              );
         remoteOutErrorCounter = moduleDefineHolder.find(TelemetryModule.NAME)
                                                   .provider()
@@ -86,9 +86,8 @@ public class GRPCRemoteClient implements RemoteClient {
                                                   .createCounter(
                                                       "remote_out_error_count",
                                                       "The error number(client side) of inside remote inside aggregate rpc.",
-                                                      new MetricsTag.Keys("dest", "self"), new MetricsTag.Values(
-                                                          address
-                                                              .toString(), "N")
+                                                      new MetricsTag.Keys("dest", "self"),
+                                                      new MetricsTag.Values(address.toString(), "N")
                                                   );
     }
 
@@ -149,6 +148,11 @@ public class GRPCRemoteClient implements RemoteClient {
         builder.setRemoteData(streamData.serialize());
 
         this.getDataCarrier().produce(builder.build());
+
+        if (streamData instanceof Recyclable) {
+            log.info("Recycling pooled objects");
+            ((Recyclable<?>) streamData).recycle();
+        }
     }
 
     class RemoteMessageConsumer implements IConsumer<RemoteMessage> {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManager.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManager.java
index c7ee112..2e94567 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManager.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManager.java
@@ -61,7 +61,7 @@ public class RemoteClientManager implements Service {
     private ClusterNodesQuery clusterNodesQuery;
     private volatile List<RemoteClient> usingClients;
     private GaugeMetrics gauge;
-    private int remoteTimeout;
+    private final int remoteTimeout;
 
     /**
      * Initial the manager for all remote communication clients.
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/SelfRemoteClient.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/SelfRemoteClient.java
index 7d445fd..a24d868 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/SelfRemoteClient.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/SelfRemoteClient.java
@@ -23,15 +23,11 @@ import org.apache.skywalking.oap.server.core.UnexpectedException;
 import org.apache.skywalking.oap.server.core.remote.data.StreamData;
 import org.apache.skywalking.oap.server.core.worker.IWorkerInstanceGetter;
 import org.apache.skywalking.oap.server.library.module.ModuleDefineHolder;
-import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
-import org.apache.skywalking.oap.server.telemetry.api.CounterMetrics;
-import org.apache.skywalking.oap.server.telemetry.api.MetricsCreator;
-import org.apache.skywalking.oap.server.telemetry.api.MetricsTag;
 
 public class SelfRemoteClient implements RemoteClient {
 
     private final Address address;
-    private CounterMetrics remoteOutCounter;
+
     private final IWorkerInstanceGetter workerInstanceGetter;
 
     public SelfRemoteClient(ModuleDefineHolder moduleDefineHolder, Address address) {
@@ -39,11 +35,6 @@ public class SelfRemoteClient implements RemoteClient {
         workerInstanceGetter = moduleDefineHolder.find(CoreModule.NAME)
                                                  .provider()
                                                  .getService(IWorkerInstanceGetter.class);
-        remoteOutCounter = moduleDefineHolder.find(TelemetryModule.NAME)
-                                             .provider()
-                                             .getService(MetricsCreator.class)
-                                             .createCounter("remote_out_count", "The number(client side) of inside remote inside aggregate rpc.", new MetricsTag.Keys("dest", "self"), new MetricsTag.Values(address
-                                                 .toString(), "Y"));
     }
 
     @Override
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/AbstractLog.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/AbstractLog.java
index 332e94a..281b0f3 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/AbstractLog.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/AbstractLog.java
@@ -47,4 +47,26 @@ public abstract class AbstractLog extends Source {
     public String getEntityId() {
         throw new UnexpectedException("getEntityId is not supported in AbstractLog source");
     }
+
+    @Override
+    public void recycle() {
+        timestamp = 0;
+        serviceId = null;
+        serviceInstanceId = null;
+        endpointId = null;
+        endpointName = null;
+        traceId = null;
+        traceSegmentId = null;
+        spanId = 0;
+        contentType = ContentType.NONE;
+        content = null;
+        tagsRawData = null;
+        tags.clear();
+        error = false;
+        setTimeBucket(0);
+        recycle0();
+        handle.recycle(this);
+    }
+
+    protected abstract void recycle0();
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
index 7c81c47..fcb58b2 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
@@ -60,4 +60,18 @@ public class All extends Source {
     @Getter
     @Setter
     private List<String> tags;
+
+    @Override
+    public void recycle() {
+        name = null;
+        serviceInstanceName = null;
+        endpointName = null;
+        latency = 0;
+        status = false;
+        responseCode = 0;
+        type = null;
+        tags = null;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DatabaseAccess.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DatabaseAccess.java
index 38b09c2..cb591fc 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DatabaseAccess.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DatabaseAccess.java
@@ -53,4 +53,14 @@ public class DatabaseAccess extends Source {
     @Getter
     @Setter
     private boolean status;
+
+    @Override
+    public void recycle() {
+        name = null;
+        databaseTypeId = 0;
+        latency = 0;
+        status = false;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DatabaseSlowStatement.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DatabaseSlowStatement.java
index 1fe48e2..7619457 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DatabaseSlowStatement.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DatabaseSlowStatement.java
@@ -52,4 +52,14 @@ public class DatabaseSlowStatement extends Source {
         return Const.EMPTY_STRING;
     }
 
+    @Override
+    public void recycle() {
+        id = null;
+        databaseServiceId = null;
+        statement = null;
+        latency = 0;
+        traceId = null;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
index c5c438d..b6719af 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
@@ -87,4 +87,22 @@ public class Endpoint extends Source {
     public void prepare() {
         serviceId = IDManager.ServiceID.buildId(serviceName, serviceNodeType);
     }
+
+    @Override
+    public void recycle() {
+        entityId = null;
+        name = null;
+        serviceId = null;
+        serviceName = null;
+        serviceNodeType = null;
+        serviceInstanceName = null;
+        latency = 0;
+        status = false;
+        responseCode = 0;
+        type = null;
+        tags = null;
+        sideCar.recycle();
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointMeta.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointMeta.java
index 78bdf82..edc68a3 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointMeta.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointMeta.java
@@ -52,4 +52,14 @@ public class EndpointMeta extends Source {
     public void prepare() {
         this.serviceId = IDManager.ServiceID.buildId(serviceName, serviceNodeType);
     }
+
+    @Override
+    public void recycle() {
+        serviceId = null;
+        serviceName = null;
+        serviceNodeType = null;
+        endpoint = null;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java
index 77b5cea..e8eae1c 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java
@@ -96,5 +96,27 @@ public class EndpointRelation extends Source {
         serviceId = IDManager.ServiceID.buildId(serviceName, serviceNodeType);
         childServiceId = IDManager.ServiceID.buildId(childServiceName, childServiceNodeType);
     }
+
+    @Override
+    public void recycle() {
+        endpoint = null;
+        serviceId = null;
+        serviceName = null;
+        serviceNodeType = null;
+        serviceInstanceName = null;
+        childEndpoint = null;
+        childServiceId = null;
+        childServiceName = null;
+        childServiceNodeType = null;
+        childServiceInstanceName = null;
+        componentId = 0;
+        rpcLatency = 0;
+        status = false;
+        responseCode = 0;
+        type = null;
+        detectPoint = null;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EnvoyInstanceMetric.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EnvoyInstanceMetric.java
index 97524f4..caaf27f 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EnvoyInstanceMetric.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EnvoyInstanceMetric.java
@@ -65,4 +65,16 @@ public class EnvoyInstanceMetric extends Source {
     @Getter
     @Setter
     private double value;
+
+    @Override
+    public void recycle() {
+        id = null;
+        serviceId = null;
+        name = null;
+        serviceName = null;
+        metricName = null;
+        value = 0;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
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..e161156 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
@@ -23,6 +23,7 @@ import java.util.Map;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Setter;
+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.MetricsExtension;
 import org.apache.skywalking.oap.server.core.analysis.Stream;
@@ -230,6 +231,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) {
@@ -250,7 +269,7 @@ public class Event extends Metrics implements ISource, WithMetadata, LongValueHo
 
         @Override
         public Event storage2Entity(Map<String, Object> dbMap) {
-            Event record = new Event();
+            Event record = MetricsObjectPool.get(Event.class);
             record.setUuid((String) dbMap.get(UUID));
             record.setService((String) dbMap.get(SERVICE));
             record.setServiceInstance((String) dbMap.get(SERVICE_INSTANCE));
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Log.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Log.java
index 6fb5b54..bdc35d1 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Log.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Log.java
@@ -33,6 +33,11 @@ public class Log extends AbstractLog {
     }
 
     @Override
+    protected void recycle0() {
+        uniqueId = null;
+    }
+
+    @Override
     public int scope() {
         return DefaultScopeDefine.LOG;
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/NetworkAddressAliasSetup.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/NetworkAddressAliasSetup.java
index cf5386c..eb7a1aa 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/NetworkAddressAliasSetup.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/NetworkAddressAliasSetup.java
@@ -56,4 +56,16 @@ public class NetworkAddressAliasSetup extends Source {
         representServiceId = IDManager.ServiceID.buildId(representService, representServiceNodeType);
         representServiceInstanceId = IDManager.ServiceInstanceID.buildId(representServiceId, representServiceInstance);
     }
+
+    @Override
+    public void recycle() {
+        address = null;
+        representService = null;
+        representServiceNodeType = null;
+        representServiceInstance = null;
+        representServiceId = null;
+        representServiceInstanceId = null;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Segment.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Segment.java
index 8715abf..c3f2852 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Segment.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Segment.java
@@ -26,6 +26,8 @@ import org.apache.skywalking.oap.server.core.analysis.manual.searchtag.Tag;
 
 import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SEGMENT;
 
+@Getter
+@Setter
 @ScopeDeclaration(id = SEGMENT, name = "Segment")
 public class Segment extends Source {
 
@@ -39,37 +41,32 @@ public class Segment extends Source {
         return segmentId;
     }
 
-    @Setter
-    @Getter
     private String segmentId;
-    @Setter
-    @Getter
     private String traceId;
-    @Setter
-    @Getter
     private String serviceId;
-    @Setter
-    @Getter
     private String serviceInstanceId;
-    @Setter
-    @Getter
     private String endpointName;
-    @Setter
-    @Getter
     private String endpointId;
-    @Setter
-    @Getter
     private long startTime;
-    @Setter
-    @Getter
     private int latency;
-    @Setter
-    @Getter
     private int isError;
-    @Setter
-    @Getter
     private byte[] dataBinary;
-    @Setter
-    @Getter
     private List<Tag> tags = new ArrayList<>();
+
+    @Override
+    public void recycle() {
+        segmentId = null;
+        traceId = null;
+        serviceId = null;
+        serviceInstanceId = null;
+        endpointName = null;
+        endpointId = null;
+        startTime = 0;
+        latency = 0;
+        isError = 0;
+        dataBinary = null;
+        tags.clear();
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
index 07a2c65..db0cb65 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
@@ -80,4 +80,22 @@ public class Service extends Source {
     @Getter
     @Setter
     private TCPInfo tcpInfo = new TCPInfo();
+
+    @Override
+    public void recycle() {
+        entityId = null;
+        name = null;
+        nodeType = null;
+        serviceInstanceName = null;
+        endpointName = null;
+        latency = 0;
+        status = false;
+        responseCode = 0;
+        type = null;
+        tags = null;
+        sideCar.recycle();
+        tcpInfo.recycle();
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java
index b93742c..72b84d5 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java
@@ -89,4 +89,23 @@ public class ServiceInstance extends Source {
     public void prepare() {
         serviceId = IDManager.ServiceID.buildId(serviceName, nodeType);
     }
+
+    @Override
+    public void recycle() {
+        entityId = null;
+        serviceId = null;
+        name = null;
+        serviceName = null;
+        nodeType = null;
+        endpointName = null;
+        latency = 0;
+        status = false;
+        responseCode = 0;
+        type = null;
+        tags = null;
+        sideCar.recycle();
+        tcpInfo.recycle();
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceCLRCPU.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceCLRCPU.java
index 64cbc46..b386a26 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceCLRCPU.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceCLRCPU.java
@@ -58,4 +58,15 @@ public class ServiceInstanceCLRCPU extends Source {
     @Getter
     @Setter
     private double usePercent;
-}
\ No newline at end of file
+
+    @Override
+    public void recycle() {
+        this.id = null;
+        this.name = null;
+        this.serviceName = null;
+        this.serviceId = null;
+        this.usePercent = 0;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceCLRGC.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceCLRGC.java
index d90829b..e77083c 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceCLRGC.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceCLRGC.java
@@ -67,4 +67,18 @@ public class ServiceInstanceCLRGC extends Source {
     @Getter
     @Setter
     private long heapMemory;
-}
\ No newline at end of file
+
+    @Override
+    public void recycle() {
+        id = null;
+        name = null;
+        serviceName = null;
+        serviceId = null;
+        gen0CollectCount = 0;
+        gen1CollectCount = 0;
+        gen2CollectCount = 0;
+        heapMemory = 0;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceCLRThread.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceCLRThread.java
index c9e02af..816b553 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceCLRThread.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceCLRThread.java
@@ -67,4 +67,18 @@ public class ServiceInstanceCLRThread extends Source {
     @Getter
     @Setter
     private long maxWorkerThreads;
-}
\ No newline at end of file
+
+    @Override
+    public void recycle() {
+        id = null;
+        name = null;
+        serviceName = null;
+        serviceId = null;
+        availableCompletionPortThreads = 0;
+        availableWorkerThreads = 0;
+        maxCompletionPortThreads = 0;
+        maxWorkerThreads = 0;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMCPU.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMCPU.java
index 58c9925..7ab26b9 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMCPU.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMCPU.java
@@ -55,4 +55,15 @@ public class ServiceInstanceJVMCPU extends Source {
     @Getter
     @Setter
     private double usePercent;
+
+    @Override
+    public void recycle() {
+        id = null;
+        name = null;
+        serviceName = null;
+        serviceId = null;
+        usePercent = 0;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMClass.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMClass.java
index 4516198..433de79 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMClass.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMClass.java
@@ -61,4 +61,17 @@ public class ServiceInstanceJVMClass extends Source {
     @Getter
     @Setter
     private long totalLoadedClassCount;
+
+    @Override
+    public void recycle() {
+        id = null;
+        name = null;
+        serviceName = null;
+        serviceId = null;
+        loadedClassCount = 0;
+        totalUnloadedClassCount = 0;
+        totalLoadedClassCount = 0;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMGC.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMGC.java
index 64a4dd8..026aaab 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMGC.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMGC.java
@@ -61,4 +61,17 @@ public class ServiceInstanceJVMGC extends Source {
     @Getter
     @Setter
     private long count;
+
+    @Override
+    public void recycle() {
+        id = null;
+        name = null;
+        serviceName = null;
+        serviceId = null;
+        phrase = null;
+        time = 0;
+        count = 0;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemory.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemory.java
index ea71501..a1ef91d 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemory.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemory.java
@@ -67,4 +67,19 @@ public class ServiceInstanceJVMMemory extends Source {
     @Getter
     @Setter
     private long committed;
+
+    @Override
+    public void recycle() {
+        id = null;
+        name = null;
+        serviceName = null;
+        serviceId = null;
+        heapStatus = false;
+        init = 0;
+        max = 0;
+        used = 0;
+        committed = 0;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemoryPool.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemoryPool.java
index 193fbc1..7ee2ee3 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemoryPool.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemoryPool.java
@@ -67,4 +67,19 @@ public class ServiceInstanceJVMMemoryPool extends Source {
     @Getter
     @Setter
     private long committed;
+
+    @Override
+    public void recycle() {
+        id = null;
+        name = null;
+        serviceName = null;
+        serviceId = null;
+        poolType = null;
+        init = 0;
+        max = 0;
+        used = 0;
+        committed = 0;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMThread.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMThread.java
index 741d2ac..bf29783 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMThread.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMThread.java
@@ -73,4 +73,21 @@ public class ServiceInstanceJVMThread extends Source {
     @Getter
     @Setter
     private long timedWaitingStateThreadCount;
+
+    @Override
+    public void recycle() {
+        id = null;
+        name = null;
+        serviceName = null;
+        serviceId = null;
+        liveCount = 0;
+        daemonCount = 0;
+        peakCount = 0;
+        runnableStateThreadCount = 0;
+        blockedStateThreadCount = 0;
+        waitingStateThreadCount = 0;
+        timedWaitingStateThreadCount = 0;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceRelation.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceRelation.java
index 775561a..684cb27 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceRelation.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceRelation.java
@@ -116,4 +116,31 @@ public class ServiceInstanceRelation extends Source {
         sourceServiceInstanceId = IDManager.ServiceInstanceID.buildId(sourceServiceId, sourceServiceInstanceName);
         destServiceInstanceId = IDManager.ServiceInstanceID.buildId(destServiceId, destServiceInstanceName);
     }
+
+    @Override
+    public void recycle() {
+        entityId = null;
+        sourceServiceInstanceId = null;
+        sourceServiceId = null;
+        sourceServiceName = null;
+        sourceServiceNodeType = null;
+        sourceServiceInstanceName = null;
+        destServiceInstanceId = null;
+        destServiceId = null;
+        destServiceNodeType = null;
+        destServiceName = null;
+        destServiceInstanceName = null;
+        endpoint = null;
+        componentId = 0;
+        latency = 0;
+        status = false;
+        responseCode = 0;
+        type = null;
+        detectPoint = null;
+        tlsMode = null;
+        sideCar.recycle();
+        tcpInfo.recycle();
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceUpdate.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceUpdate.java
index 22aa5d6..c421924 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceUpdate.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceUpdate.java
@@ -49,4 +49,13 @@ public class ServiceInstanceUpdate extends Source {
     @Getter
     @Setter
     private JsonObject properties;
+
+    @Override
+    public void recycle() {
+        serviceId = null;
+        name = null;
+        properties = null;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceMeta.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceMeta.java
index 978e8bf..fa54f8f 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceMeta.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceMeta.java
@@ -42,4 +42,12 @@ public class ServiceMeta extends Source {
 
     private String name;
     private NodeType nodeType;
+
+    @Override
+    public void recycle() {
+        name = null;
+        nodeType = null;
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceRelation.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceRelation.java
index 9b13d71..ad2a1f8 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceRelation.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceRelation.java
@@ -108,4 +108,29 @@ public class ServiceRelation extends Source {
         sourceServiceId = IDManager.ServiceID.buildId(sourceServiceName, sourceServiceNodeType);
         destServiceId = IDManager.ServiceID.buildId(destServiceName, destServiceNodeType);
     }
+
+    @Override
+    public void recycle() {
+        entityId = null;
+        sourceServiceId = null;
+        sourceServiceName = null;
+        sourceServiceNodeType = null;
+        sourceServiceInstanceName = null;
+        destServiceId = null;
+        destServiceName = null;
+        destServiceNodeType = null;
+        destServiceInstanceName = null;
+        endpoint = null;
+        componentId = 0;
+        latency = 0;
+        status = false;
+        responseCode = 0;
+        type = null;
+        detectPoint = null;
+        tlsMode = null;
+        sideCar.recycle();
+        tcpInfo.recycle();
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/SideCar.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/SideCar.java
index 3d1710d..2300447 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/SideCar.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/SideCar.java
@@ -18,18 +18,30 @@
 
 package org.apache.skywalking.oap.server.core.source;
 
+import io.netty.util.Recycler;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.skywalking.oap.server.core.Recyclable;
 
 /**
  * As service mesh is becoming the next generation standard infrastructure for k8s and out-of-k8s env, the sidecar
  * source would be an attachment for sources of Service, Instance, Endpoint, and their relationship.
  */
-public class SideCar {
+public class SideCar implements Recyclable<SideCar> {
     /**
      * the sidecar/gateway proxy internal error code, the value bases on the implementation.
      */
     @Setter
     @Getter
     private String internalErrorCode = "";
+
+    @Override
+    public void handle(final Recycler.Handle<SideCar> handle) {
+        // not pooled directly
+    }
+
+    @Override
+    public void recycle() {
+        this.internalErrorCode = "";
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java
index 5c99722..0e2308d 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java
@@ -18,12 +18,21 @@
 
 package org.apache.skywalking.oap.server.core.source;
 
+import io.netty.util.Recycler;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.skywalking.oap.server.core.Recyclable;
 
-public abstract class Source implements ISource {
+public abstract class Source implements ISource, Recyclable<Source> {
 
     @Getter
     @Setter
     private long timeBucket;
+
+    protected Recycler.Handle<Source> handle;
+
+    @Override
+    public void handle(final Recycler.Handle<Source> handle) {
+        this.handle = handle;
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/TCPInfo.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/TCPInfo.java
index 26539e5..8511d55 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/TCPInfo.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/TCPInfo.java
@@ -18,14 +18,16 @@
 
 package org.apache.skywalking.oap.server.core.source;
 
+import io.netty.util.Recycler;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
+import org.apache.skywalking.oap.server.core.Recyclable;
 
 @NoArgsConstructor
 @AllArgsConstructor
-public class TCPInfo {
+public class TCPInfo implements Recyclable<TCPInfo> {
     @Getter
     @Setter
     private long receivedBytes;
@@ -33,4 +35,15 @@ public class TCPInfo {
     @Getter
     @Setter
     private long sentBytes;
+
+    @Override
+    public void handle(final Recycler.Handle<TCPInfo> handle) {
+        // not directly pooled
+    }
+
+    @Override
+    public void recycle() {
+        receivedBytes = 0;
+        sentBytes = 0;
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/worker/RemoteHandleWorker.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/worker/RemoteHandleWorker.java
index e24799e..fcc6a7a 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/worker/RemoteHandleWorker.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/worker/RemoteHandleWorker.java
@@ -25,6 +25,6 @@ import org.apache.skywalking.oap.server.core.remote.data.StreamData;
 @AllArgsConstructor
 @Getter
 public class RemoteHandleWorker {
-    private AbstractWorker worker;
+    private AbstractWorker<StreamData> worker;
     private Class<? extends StreamData> streamDataClass;
 }
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/manual/service/ServiceTrafficTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTrafficTest.java
index 079cae6..8b3be2d 100644
--- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTrafficTest.java
+++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTrafficTest.java
@@ -19,6 +19,7 @@
 package org.apache.skywalking.oap.server.core.analysis.manual.service;
 
 import java.util.Map;
+import org.apache.skywalking.oap.server.core.MetricsObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
 import org.junit.Assert;
 import org.junit.Test;
@@ -26,7 +27,7 @@ import org.junit.Test;
 public class ServiceTrafficTest {
     @Test
     public void testGrouping() {
-        ServiceTraffic traffic = new ServiceTraffic();
+        ServiceTraffic traffic = MetricsObjectPool.get(ServiceTraffic.class);
         traffic.setName("group-name::service-name");
         traffic.setNodeType(NodeType.Normal);
         final Map<String, Object> stringObjectMap = new ServiceTraffic.Builder().entity2Storage(traffic);
@@ -35,7 +36,7 @@ public class ServiceTrafficTest {
 
     @Test
     public void testNoGrouping() {
-        ServiceTraffic traffic = new ServiceTraffic();
+        ServiceTraffic traffic = MetricsObjectPool.get(ServiceTraffic.class);
         traffic.setName("group-name:service-name:no");
         traffic.setNodeType(NodeType.Normal);
         final Map<String, Object> stringObjectMap = new ServiceTraffic.Builder().entity2Storage(traffic);
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);
+        }
     }
 }
diff --git a/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/ServiceManagementHandler.java b/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/ServiceManagementHandler.java
index 03d8695..c2c8884 100644
--- a/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/ServiceManagementHandler.java
+++ b/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/ServiceManagementHandler.java
@@ -29,6 +29,7 @@ import org.apache.skywalking.apm.network.management.v3.InstancePingPkg;
 import org.apache.skywalking.apm.network.management.v3.InstanceProperties;
 import org.apache.skywalking.oap.server.analyzer.agent.kafka.module.KafkaFetcherConfig;
 import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.SourceObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.DownSampling;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
@@ -71,7 +72,7 @@ public class ServiceManagementHandler extends AbstractKafkaHandler {
     }
 
     private final void serviceReportProperties(InstanceProperties request) {
-        ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate();
+        ServiceInstanceUpdate serviceInstanceUpdate = SourceObjectPool.get(ServiceInstanceUpdate.class);
         final String serviceName = namingLengthControl.formatServiceName(request.getService());
         final String instanceName = namingLengthControl.formatInstanceName(request.getServiceInstance());
         serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, NodeType.Normal));
@@ -106,7 +107,7 @@ public class ServiceManagementHandler extends AbstractKafkaHandler {
             log.debug("A ping of Service[{}] instance[{}].", serviceName, instanceName);
         }
 
-        ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate();
+        ServiceInstanceUpdate serviceInstanceUpdate = SourceObjectPool.get(ServiceInstanceUpdate.class);
         serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, NodeType.Normal));
         serviceInstanceUpdate.setName(instanceName);
         serviceInstanceUpdate.setTimeBucket(timeBucket);
diff --git a/oap-server/server-receiver-plugin/skywalking-browser-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/browser/provider/parser/errorlog/listener/ErrorLogRecordListener.java b/oap-server/server-receiver-plugin/skywalking-browser-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/browser/provider/parser/errorlog/listener/ErrorLogRecordListener.java
index 793a076..3dd5401 100644
--- a/oap-server/server-receiver-plugin/skywalking-browser-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/browser/provider/parser/errorlog/listener/ErrorLogRecordListener.java
+++ b/oap-server/server-receiver-plugin/skywalking-browser-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/browser/provider/parser/errorlog/listener/ErrorLogRecordListener.java
@@ -21,6 +21,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.apm.util.StringUtil;
 import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.SourceObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
 import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
@@ -40,7 +41,7 @@ import org.apache.skywalking.oap.server.receiver.browser.provider.parser.errorlo
 public class ErrorLogRecordListener implements ErrorLogAnalysisListener {
     private final NamingControl namingControl;
     private final SourceReceiver sourceReceiver;
-    private final BrowserErrorLog errorLog = new BrowserErrorLog();
+    private final BrowserErrorLog errorLog = SourceObjectPool.get(BrowserErrorLog.class);
     private final ErrorLogRecordSampler sampler;
     private SampleStatus sampleStatus = SampleStatus.UNKNOWN;
 
diff --git a/oap-server/server-receiver-plugin/skywalking-browser-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/browser/provider/parser/errorlog/listener/SourceBuilder.java b/oap-server/server-receiver-plugin/skywalking-browser-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/browser/provider/parser/errorlog/listener/SourceBuilder.java
index 4541a5f..7ebf518 100644
--- a/oap-server/server-receiver-plugin/skywalking-browser-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/browser/provider/parser/errorlog/listener/SourceBuilder.java
+++ b/oap-server/server-receiver-plugin/skywalking-browser-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/browser/provider/parser/errorlog/listener/SourceBuilder.java
@@ -21,6 +21,7 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import org.apache.skywalking.apm.network.language.agent.v3.ErrorCategory;
+import org.apache.skywalking.oap.server.core.SourceObjectPool;
 import org.apache.skywalking.oap.server.core.browser.source.BrowserAppPageTraffic;
 import org.apache.skywalking.oap.server.core.browser.source.BrowserAppSingleVersionTraffic;
 import org.apache.skywalking.oap.server.core.browser.source.BrowserAppTraffic;
@@ -80,7 +81,7 @@ class SourceBuilder {
      * Browser service traffic error related source.
      */
     BrowserAppTraffic toBrowserAppTraffic() {
-        BrowserAppTraffic traffic = new BrowserAppTraffic();
+        BrowserAppTraffic traffic = SourceObjectPool.get(BrowserAppTraffic.class);
         toBrowserAppTrafficSource(traffic);
         traffic.setName(service);
         traffic.setTrafficCategory(trafficCategory);
@@ -92,7 +93,7 @@ class SourceBuilder {
      * Browser single version error metrics related source.
      */
     BrowserAppSingleVersionTraffic toBrowserAppSingleVersionTraffic() {
-        BrowserAppSingleVersionTraffic traffic = new BrowserAppSingleVersionTraffic();
+        BrowserAppSingleVersionTraffic traffic = SourceObjectPool.get(BrowserAppSingleVersionTraffic.class);
         toBrowserAppTrafficSource(traffic);
         traffic.setName(serviceVersion);
         traffic.setServiceName(service);
@@ -103,7 +104,7 @@ class SourceBuilder {
      * Browser page error metrics related source.
      */
     BrowserAppPageTraffic toBrowserAppPageTraffic() {
-        BrowserAppPageTraffic traffic = new BrowserAppPageTraffic();
+        BrowserAppPageTraffic traffic = SourceObjectPool.get(BrowserAppPageTraffic.class);
         toBrowserAppTrafficSource(traffic);
         traffic.setName(patePath);
         traffic.setServiceName(service);
diff --git a/oap-server/server-receiver-plugin/skywalking-browser-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/browser/provider/parser/performance/listener/SourceBuilder.java b/oap-server/server-receiver-plugin/skywalking-browser-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/browser/provider/parser/performance/listener/SourceBuilder.java
index 7d50ea4..9848651 100644
--- a/oap-server/server-receiver-plugin/skywalking-browser-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/browser/provider/parser/performance/listener/SourceBuilder.java
+++ b/oap-server/server-receiver-plugin/skywalking-browser-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/browser/provider/parser/performance/listener/SourceBuilder.java
@@ -20,6 +20,7 @@ package org.apache.skywalking.oap.server.receiver.browser.provider.parser.perfor
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
+import org.apache.skywalking.oap.server.core.SourceObjectPool;
 import org.apache.skywalking.oap.server.core.browser.source.BrowserAppPagePerf;
 import org.apache.skywalking.oap.server.core.browser.source.BrowserAppPageTraffic;
 import org.apache.skywalking.oap.server.core.browser.source.BrowserAppPerf;
@@ -121,7 +122,7 @@ class SourceBuilder {
      * Browser service meta and traffic metrics related source.
      */
     BrowserAppTraffic toBrowserAppTraffic() {
-        BrowserAppTraffic traffic = new BrowserAppTraffic();
+        BrowserAppTraffic traffic = SourceObjectPool.get(BrowserAppTraffic.class);
         traffic.setName(service);
         toBrowserAppTrafficSource(traffic);
         return traffic;
@@ -131,7 +132,7 @@ class SourceBuilder {
      * Browser single version meta and traffic metrics related source.
      */
     BrowserAppSingleVersionTraffic toBrowserAppSingleVersionTraffic() {
-        BrowserAppSingleVersionTraffic traffic = new BrowserAppSingleVersionTraffic();
+        BrowserAppSingleVersionTraffic traffic = SourceObjectPool.get(BrowserAppSingleVersionTraffic.class);
         traffic.setName(serviceVersion);
         traffic.setServiceName(service);
         toBrowserAppTrafficSource(traffic);
@@ -142,7 +143,7 @@ class SourceBuilder {
      * Browser page meta and traffic metrics related source.
      */
     BrowserAppPageTraffic toBrowserAppPageTraffic() {
-        BrowserAppPageTraffic traffic = new BrowserAppPageTraffic();
+        BrowserAppPageTraffic traffic = SourceObjectPool.get(BrowserAppPageTraffic.class);
         traffic.setName(patePath);
         traffic.setServiceName(service);
         toBrowserAppTrafficSource(traffic);
@@ -171,7 +172,7 @@ class SourceBuilder {
      * Browser service performance related source.
      */
     BrowserAppPerf toBrowserAppPerf() {
-        BrowserAppPerf perf = new BrowserAppPerf();
+        BrowserAppPerf perf = SourceObjectPool.get(BrowserAppPerf.class);
         perf.setName(service);
         toBrowserAppPerfSource(perf);
         return perf;
@@ -181,7 +182,7 @@ class SourceBuilder {
      * Browser single version performance related source.
      */
     BrowserAppSingleVersionPerf toBrowserAppSingleVersionPerf() {
-        BrowserAppSingleVersionPerf perf = new BrowserAppSingleVersionPerf();
+        BrowserAppSingleVersionPerf perf = SourceObjectPool.get(BrowserAppSingleVersionPerf.class);
         perf.setName(serviceVersion);
         perf.setServiceName(service);
         toBrowserAppPerfSource(perf);
@@ -192,7 +193,7 @@ class SourceBuilder {
      * Browser page performance related source.
      */
     BrowserAppPagePerf toBrowserAppPagePerf() {
-        BrowserAppPagePerf perf = new BrowserAppPagePerf();
+        BrowserAppPagePerf perf = SourceObjectPool.get(BrowserAppPagePerf.class);
         perf.setName(patePath);
         perf.setServiceName(service);
         toBrowserAppPerfSource(perf);
diff --git a/oap-server/server-receiver-plugin/skywalking-clr-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/clr/provider/handler/CLRSourceDispatcher.java b/oap-server/server-receiver-plugin/skywalking-clr-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/clr/provider/handler/CLRSourceDispatcher.java
index ed9d7b8..685c104 100644
--- a/oap-server/server-receiver-plugin/skywalking-clr-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/clr/provider/handler/CLRSourceDispatcher.java
+++ b/oap-server/server-receiver-plugin/skywalking-clr-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/clr/provider/handler/CLRSourceDispatcher.java
@@ -24,6 +24,7 @@ import org.apache.skywalking.apm.network.language.agent.v3.ClrGC;
 import org.apache.skywalking.apm.network.language.agent.v3.ClrThread;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.SourceObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
 import org.apache.skywalking.oap.server.core.source.ServiceInstanceCLRCPU;
@@ -51,7 +52,7 @@ public class CLRSourceDispatcher {
         final String serviceInstanceId = IDManager.ServiceInstanceID.buildId(serviceId, serviceInstance);
 
         CPU cpu = metrics.getCpu();
-        ServiceInstanceCLRCPU serviceInstanceCLRCPU = new ServiceInstanceCLRCPU();
+        ServiceInstanceCLRCPU serviceInstanceCLRCPU = SourceObjectPool.get(ServiceInstanceCLRCPU.class);
         serviceInstanceCLRCPU.setUsePercent(cpu.getUsagePercent());
         serviceInstanceCLRCPU.setTimeBucket(minuteTimeBucket);
         serviceInstanceCLRCPU.setId(serviceInstanceId);
@@ -61,7 +62,7 @@ public class CLRSourceDispatcher {
         sourceReceiver.receive(serviceInstanceCLRCPU);
 
         ClrGC gc = metrics.getGc();
-        ServiceInstanceCLRGC serviceInstanceCLRGC = new ServiceInstanceCLRGC();
+        ServiceInstanceCLRGC serviceInstanceCLRGC = SourceObjectPool.get(ServiceInstanceCLRGC.class);
         serviceInstanceCLRGC.setGen0CollectCount(gc.getGen0CollectCount());
         serviceInstanceCLRGC.setGen1CollectCount(gc.getGen1CollectCount());
         serviceInstanceCLRGC.setGen2CollectCount(gc.getGen2CollectCount());
@@ -74,7 +75,7 @@ public class CLRSourceDispatcher {
         sourceReceiver.receive(serviceInstanceCLRGC);
 
         ClrThread thread = metrics.getThread();
-        ServiceInstanceCLRThread serviceInstanceCLRThread = new ServiceInstanceCLRThread();
+        ServiceInstanceCLRThread serviceInstanceCLRThread = SourceObjectPool.get(ServiceInstanceCLRThread.class);
         serviceInstanceCLRThread.setAvailableCompletionPortThreads(thread.getAvailableCompletionPortThreads());
         serviceInstanceCLRThread.setAvailableWorkerThreads(thread.getAvailableWorkerThreads());
         serviceInstanceCLRThread.setMaxCompletionPortThreads(thread.getMaxCompletionPortThreads());
diff --git a/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/grpc/ManagementServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/grpc/ManagementServiceHandler.java
index 66f31ae..5ced749 100644
--- a/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/grpc/ManagementServiceHandler.java
+++ b/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/grpc/ManagementServiceHandler.java
@@ -28,6 +28,7 @@ import org.apache.skywalking.apm.network.management.v3.InstancePingPkg;
 import org.apache.skywalking.apm.network.management.v3.InstanceProperties;
 import org.apache.skywalking.apm.network.management.v3.ManagementServiceGrpc;
 import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.SourceObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.DownSampling;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
@@ -54,7 +55,7 @@ public class ManagementServiceHandler extends ManagementServiceGrpc.ManagementSe
     @Override
     public void reportInstanceProperties(final InstanceProperties request,
                                          final StreamObserver<Commands> responseObserver) {
-        ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate();
+        ServiceInstanceUpdate serviceInstanceUpdate = SourceObjectPool.get(ServiceInstanceUpdate.class);
         final String serviceName = namingControl.formatServiceName(request.getService());
         final String instanceName = namingControl.formatInstanceName(request.getServiceInstance());
         serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, NodeType.Normal));
@@ -85,13 +86,13 @@ public class ManagementServiceHandler extends ManagementServiceGrpc.ManagementSe
         final String serviceName = namingControl.formatServiceName(request.getService());
         final String instanceName = namingControl.formatInstanceName(request.getServiceInstance());
 
-        ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate();
+        ServiceInstanceUpdate serviceInstanceUpdate = SourceObjectPool.get(ServiceInstanceUpdate.class);
         serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, NodeType.Normal));
         serviceInstanceUpdate.setName(instanceName);
         serviceInstanceUpdate.setTimeBucket(timeBucket);
         sourceReceiver.receive(serviceInstanceUpdate);
 
-        ServiceMeta serviceMeta = new ServiceMeta();
+        ServiceMeta serviceMeta = SourceObjectPool.get(ServiceMeta.class);
         serviceMeta.setName(serviceName);
         serviceMeta.setNodeType(NodeType.Normal);
         serviceMeta.setTimeBucket(timeBucket);
diff --git a/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/rest/ManagementServiceKeepAliveHandler.java b/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/rest/ManagementServiceKeepAliveHandler.java
index e6cb68c..b395739 100644
--- a/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/rest/ManagementServiceKeepAliveHandler.java
+++ b/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/rest/ManagementServiceKeepAliveHandler.java
@@ -25,6 +25,7 @@ import javax.servlet.http.HttpServletRequest;
 import org.apache.skywalking.apm.network.common.v3.Commands;
 import org.apache.skywalking.apm.network.management.v3.InstanceProperties;
 import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.SourceObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.DownSampling;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
@@ -59,13 +60,13 @@ public class ManagementServiceKeepAliveHandler extends JettyJsonHandler {
         final String instanceName = namingControl.formatInstanceName(request.getServiceInstance());
 
         final long timeBucket = TimeBucket.getTimeBucket(System.currentTimeMillis(), DownSampling.Minute);
-        ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate();
+        ServiceInstanceUpdate serviceInstanceUpdate = SourceObjectPool.get(ServiceInstanceUpdate.class);
         serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, NodeType.Normal));
         serviceInstanceUpdate.setName(instanceName);
         serviceInstanceUpdate.setTimeBucket(timeBucket);
         sourceReceiver.receive(serviceInstanceUpdate);
 
-        ServiceMeta serviceMeta = new ServiceMeta();
+        ServiceMeta serviceMeta = SourceObjectPool.get(ServiceMeta.class);
         serviceMeta.setName(serviceName);
         serviceMeta.setNodeType(NodeType.Normal);
         serviceMeta.setTimeBucket(timeBucket);
diff --git a/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/rest/ManagementServiceReportPropertiesHandler.java b/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/rest/ManagementServiceReportPropertiesHandler.java
index 94563ea..921f68c 100644
--- a/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/rest/ManagementServiceReportPropertiesHandler.java
+++ b/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/rest/ManagementServiceReportPropertiesHandler.java
@@ -29,6 +29,7 @@ import javax.servlet.http.HttpServletRequest;
 import org.apache.skywalking.apm.network.common.v3.Commands;
 import org.apache.skywalking.apm.network.management.v3.InstanceProperties;
 import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.SourceObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.DownSampling;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
@@ -62,7 +63,7 @@ public class ManagementServiceReportPropertiesHandler extends JettyJsonHandler {
         final String serviceName = namingControl.formatServiceName(request.getService());
         final String instanceName = namingControl.formatInstanceName(request.getServiceInstance());
 
-        ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate();
+        ServiceInstanceUpdate serviceInstanceUpdate = SourceObjectPool.get(ServiceInstanceUpdate.class);
         serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, NodeType.Normal));
         serviceInstanceUpdate.setName(instanceName);
 
diff --git a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java
index 9af5fac..5a1aaed 100644
--- a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java
+++ b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java
@@ -24,6 +24,7 @@ import org.apache.skywalking.apm.network.servicemesh.v3.ServiceMeshMetric;
 import org.apache.skywalking.apm.util.StringUtil;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.SourceObjectPool;
 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.config.NamingControl;
@@ -123,7 +124,7 @@ public class TelemetryDataDispatcher {
     }
 
     private static void toAll(ServiceMeshMetric.Builder metrics, long minuteTimeBucket) {
-        All all = new All();
+        All all = SourceObjectPool.get(All.class);
         all.setTimeBucket(minuteTimeBucket);
         all.setName(metrics.getDestServiceName());
         all.setServiceInstanceName(metrics.getDestServiceInstance());
@@ -137,7 +138,7 @@ public class TelemetryDataDispatcher {
     }
 
     private static void toService(ServiceMeshMetric.Builder metrics, long minuteTimeBucket) {
-        Service service = new Service();
+        Service service = SourceObjectPool.get(Service.class);
         service.setTimeBucket(minuteTimeBucket);
         service.setName(metrics.getDestServiceName());
         service.setNodeType(NodeType.Normal);
@@ -155,7 +156,7 @@ public class TelemetryDataDispatcher {
     }
 
     private static void toServiceRelation(ServiceMeshMetric.Builder metrics, long minuteTimeBucket) {
-        ServiceRelation serviceRelation = new ServiceRelation();
+        ServiceRelation serviceRelation = SourceObjectPool.get(ServiceRelation.class);
         serviceRelation.setTimeBucket(minuteTimeBucket);
         serviceRelation.setSourceServiceName(metrics.getSourceServiceName());
         serviceRelation.setSourceServiceNodeType(NodeType.Normal);
@@ -179,7 +180,7 @@ public class TelemetryDataDispatcher {
     }
 
     private static void toServiceInstance(ServiceMeshMetric.Builder metrics, long minuteTimeBucket) {
-        ServiceInstance serviceInstance = new ServiceInstance();
+        ServiceInstance serviceInstance = SourceObjectPool.get(ServiceInstance.class);
         serviceInstance.setTimeBucket(minuteTimeBucket);
         serviceInstance.setName(metrics.getDestServiceInstance());
         serviceInstance.setServiceName(metrics.getDestServiceName());
@@ -197,7 +198,7 @@ public class TelemetryDataDispatcher {
     }
 
     private static void toServiceInstanceRelation(ServiceMeshMetric.Builder metrics, long minuteTimeBucket) {
-        ServiceInstanceRelation serviceRelation = new ServiceInstanceRelation();
+        ServiceInstanceRelation serviceRelation = SourceObjectPool.get(ServiceInstanceRelation.class);
         serviceRelation.setTimeBucket(minuteTimeBucket);
         serviceRelation.setSourceServiceInstanceName(metrics.getSourceServiceInstance());
         serviceRelation.setSourceServiceName(metrics.getSourceServiceName());
@@ -221,7 +222,7 @@ public class TelemetryDataDispatcher {
     }
 
     private static void toEndpoint(ServiceMeshMetric.Builder metrics, long minuteTimeBucket) {
-        Endpoint endpoint = new Endpoint();
+        Endpoint endpoint = SourceObjectPool.get(Endpoint.class);
         endpoint.setTimeBucket(minuteTimeBucket);
         endpoint.setName(metrics.getEndpoint());
         endpoint.setServiceName(metrics.getDestServiceName());
diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListenerTest.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListenerTest.java
index 5d37e70..f50644e 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListenerTest.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListenerTest.java
@@ -33,6 +33,7 @@ import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.SpanTags;
 import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener.AnalysisListener;
 import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener.MultiScopesAnalysisListener;
 import org.apache.skywalking.oap.server.core.Const;
+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.NodeType;
 import org.apache.skywalking.oap.server.core.analysis.manual.networkalias.NetworkAddressAlias;
@@ -85,7 +86,7 @@ public class MultiScopesAnalysisListenerTest {
         MockitoAnnotations.initMocks(this);
 
         when(CACHE.get(any())).thenReturn(null);
-        final NetworkAddressAlias networkAddressAlias = new NetworkAddressAlias();
+        final NetworkAddressAlias networkAddressAlias = MetricsObjectPool.get(NetworkAddressAlias.class);
         final String serviceId = IDManager.ServiceID.buildId("target-service", true);
         final String instanceId = IDManager.ServiceInstanceID.buildId(serviceId, "target-instance");
         networkAddressAlias.setRepresentServiceId(serviceId);
diff --git a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/trace/SpanForward.java b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/trace/SpanForward.java
index 9482e27..54b8940 100644
--- a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/trace/SpanForward.java
+++ b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/trace/SpanForward.java
@@ -22,6 +22,7 @@ import java.util.List;
 
 import lombok.RequiredArgsConstructor;
 import org.apache.skywalking.apm.util.StringUtil;
+import org.apache.skywalking.oap.server.core.SourceObjectPool;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
 import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
@@ -45,7 +46,7 @@ public class SpanForward {
 
     public void send(List<Span> spanList) {
         spanList.forEach(span -> {
-            ZipkinSpan zipkinSpan = new ZipkinSpan();
+            ZipkinSpan zipkinSpan = SourceObjectPool.get(ZipkinSpan.class);
             zipkinSpan.setTraceId(span.traceId());
             zipkinSpan.setSpanId(span.id());
             String serviceName = span.localServiceName();
@@ -71,7 +72,7 @@ public class SpanForward {
                 zipkinSpan.setEndpointId(IDManager.EndpointID.buildId(zipkinSpan.getServiceId(), endpointName));
 
                 //Create endpoint meta for the server side span
-                EndpointMeta endpointMeta = new EndpointMeta();
+                EndpointMeta endpointMeta = SourceObjectPool.get(EndpointMeta.class);
                 endpointMeta.setServiceName(serviceName);
                 endpointMeta.setServiceNodeType(NodeType.Normal);
                 endpointMeta.setEndpoint(endpointName);
@@ -94,7 +95,7 @@ public class SpanForward {
 
             // Create the metadata source
             // No instance name is required in the Zipkin model.
-            ServiceMeta serviceMeta = new ServiceMeta();
+            ServiceMeta serviceMeta = SourceObjectPool.get(ServiceMeta.class);
             serviceMeta.setName(serviceName);
             serviceMeta.setNodeType(NodeType.Normal);
             serviceMeta.setTimeBucket(timeBucket);
diff --git a/oap-server/server-storage-plugin/storage-zipkin-elasticsearch7-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/zipkin/ZipkinSpan.java b/oap-server/server-storage-plugin/storage-zipkin-elasticsearch7-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/zipkin/ZipkinSpan.java
index e277b65..f9a8c59 100644
--- a/oap-server/server-storage-plugin/storage-zipkin-elasticsearch7-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/zipkin/ZipkinSpan.java
+++ b/oap-server/server-storage-plugin/storage-zipkin-elasticsearch7-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/zipkin/ZipkinSpan.java
@@ -80,4 +80,23 @@ public class ZipkinSpan extends Source {
     @Setter
     @Getter
     private List<String> tags = new ArrayList<>();
+
+    @Override
+    public void recycle() {
+        traceId = null;
+        spanId = null;
+        serviceId = null;
+        serviceInstanceId = null;
+        endpointName = null;
+        endpointId = null;
+        startTime = 0;
+        endTime = 0;
+        latency = 0;
+        isError = 0;
+        dataBinary = null;
+        encode = 0;
+        tags.clear();
+        setTimeBucket(0);
+        handle.recycle(this);
+    }
 }