diff --git a/lib/gitlab/metrics/exporter/base_exporter.rb b/lib/gitlab/metrics/exporter/base_exporter.rb
index 66041badf01189455c2eb6dce04db8d7a3c6e360..190d3d3fd2fc595c8cbd7b83fa44608e220c035f 100644
--- a/lib/gitlab/metrics/exporter/base_exporter.rb
+++ b/lib/gitlab/metrics/exporter/base_exporter.rb
@@ -11,10 +11,11 @@ class BaseExporter < Daemon
 
         attr_accessor :readiness_checks
 
-        def initialize(settings, log_enabled:, log_file:, **options)
+        def initialize(settings, log_enabled:, log_file:, gc_requests: false, **options)
           super(**options)
 
           @settings = settings
+          @gc_requests = gc_requests
 
           # log_enabled does not exist for all exporters
           log_sink = log_enabled ? File.join(Rails.root, 'log', log_file) : File::NULL
@@ -71,11 +72,13 @@ def rack_app
           readiness = readiness_probe
           liveness = liveness_probe
           pid = thread_name
+          gc_requests = @gc_requests
 
           Rack::Builder.app do
             use Rack::Deflater
             use Gitlab::Metrics::Exporter::MetricsMiddleware, pid
             use Gitlab::Metrics::Exporter::HealthChecksMiddleware, readiness, liveness
+            use Gitlab::Metrics::Exporter::GcRequestMiddleware if gc_requests
             use ::Prometheus::Client::Rack::Exporter if ::Gitlab::Metrics.metrics_folder_present?
             run -> (env) { [404, {}, ['']] }
           end
diff --git a/lib/gitlab/metrics/exporter/gc_request_middleware.rb b/lib/gitlab/metrics/exporter/gc_request_middleware.rb
new file mode 100644
index 0000000000000000000000000000000000000000..3806b0e2bd1b2224c5df33416116dcceab4360e8
--- /dev/null
+++ b/lib/gitlab/metrics/exporter/gc_request_middleware.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Gitlab
+  module Metrics
+    module Exporter
+      class GcRequestMiddleware
+        def initialize(app)
+          @app = app
+        end
+
+        def call(env)
+          @app.call(env).tap do
+            GC.start
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/metrics_server/dependencies.rb b/metrics_server/dependencies.rb
index 36d61a633598198d88c061238ab573041ea9b870..5615cef42cebfd65cf3e1e363a771294f932d9ab 100644
--- a/metrics_server/dependencies.rb
+++ b/metrics_server/dependencies.rb
@@ -26,6 +26,7 @@
 require_relative '../lib/gitlab/metrics/exporter/sidekiq_exporter'
 require_relative '../lib/gitlab/metrics/exporter/metrics_middleware'
 require_relative '../lib/gitlab/metrics/exporter/health_checks_middleware'
+require_relative '../lib/gitlab/metrics/exporter/gc_request_middleware'
 require_relative '../lib/gitlab/health_checks/probes/collection'
 require_relative '../lib/gitlab/health_checks/probes/status'
 require_relative '../lib/gitlab/process_management'
diff --git a/metrics_server/metrics_server.rb b/metrics_server/metrics_server.rb
index 33b31326d2ad421bedd5d04238be2390353f85f6..122a4e4fc1e78c179b32c337029d0403686891d8 100644
--- a/metrics_server/metrics_server.rb
+++ b/metrics_server/metrics_server.rb
@@ -54,7 +54,7 @@ def start
 
     exporter_class = "Gitlab::Metrics::Exporter::#{@target.camelize}Exporter".constantize
     settings = Settings.new(Settings.monitoring[name])
-    server = exporter_class.instance(settings, synchronous: true)
+    server = exporter_class.instance(settings, gc_requests: true, synchronous: true)
 
     server.start
   end
diff --git a/spec/lib/gitlab/metrics/exporter/gc_request_middleware_spec.rb b/spec/lib/gitlab/metrics/exporter/gc_request_middleware_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..0c70a5de70120450eb5e295528be699a91684ade
--- /dev/null
+++ b/spec/lib/gitlab/metrics/exporter/gc_request_middleware_spec.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Gitlab::Metrics::Exporter::GcRequestMiddleware do
+  let(:app) { double(:app) }
+  let(:env) { {} }
+
+  subject(:middleware) { described_class.new(app) }
+
+  describe '#call' do
+    it 'runs a major GC after the next middleware is called' do
+      expect(app).to receive(:call).with(env).ordered.and_return([200, {}, []])
+      expect(GC).to receive(:start).ordered
+
+      response = middleware.call(env)
+
+      expect(response).to eq([200, {}, []])
+    end
+  end
+end
diff --git a/spec/metrics_server/metrics_server_spec.rb b/spec/metrics_server/metrics_server_spec.rb
index 1120fab2de3075050ca2938563f20baa1f59eee3..fc18df9b5cda65dcbfc51066b09d305549357d30 100644
--- a/spec/metrics_server/metrics_server_spec.rb
+++ b/spec/metrics_server/metrics_server_spec.rb
@@ -70,7 +70,9 @@
 
     before do
       stub_const('Gitlab::Metrics::Exporter::FakeExporter', exporter_class)
-      expect(exporter_class).to receive(:instance).with(settings['fake_exporter'], synchronous: true).and_return(exporter_double)
+      expect(exporter_class).to receive(:instance).with(
+        settings['fake_exporter'], gc_requests: true, synchronous: true
+      ).and_return(exporter_double)
       expect(Settings).to receive(:monitoring).and_return(settings)
 
       allow(Gitlab::Metrics::Samplers::RubySampler).to receive(:initialize_instance).and_return(ruby_sampler_double)