Force GC before GC-sensitive benchmark runs (#23289)

diff --git a/dev/benchmarks/complex_layout/test_driver/scroll_perf_test.dart b/dev/benchmarks/complex_layout/test_driver/scroll_perf_test.dart
index 39f3438..c85fbd3 100644
--- a/dev/benchmarks/complex_layout/test_driver/scroll_perf_test.dart
+++ b/dev/benchmarks/complex_layout/test_driver/scroll_perf_test.dart
@@ -26,6 +26,9 @@
       // benchmark has greater noise.
       // See: https://github.com/flutter/flutter/issues/19434
       await Future<void>.delayed(const Duration(milliseconds: 250));
+
+      await driver.forceGC();
+
       final Timeline timeline = await driver.traceAction(() async {
         // Find the scrollable stock list
         final SerializableFinder list = find.byValueKey(listKey);
diff --git a/dev/benchmarks/complex_layout/test_driver/semantics_perf_test.dart b/dev/benchmarks/complex_layout/test_driver/semantics_perf_test.dart
index dd2023b..372a23d 100644
--- a/dev/benchmarks/complex_layout/test_driver/semantics_perf_test.dart
+++ b/dev/benchmarks/complex_layout/test_driver/semantics_perf_test.dart
@@ -27,6 +27,8 @@
       // Let app become fully idle.
       await Future<void>.delayed(const Duration(seconds: 2));
 
+      await driver.forceGC();
+
       final Timeline timeline = await driver.traceAction(() async {
         expect(await driver.setSemantics(true), isTrue);
       });
diff --git a/packages/flutter_driver/lib/src/driver/driver.dart b/packages/flutter_driver/lib/src/driver/driver.dart
index 4037a1a..3dbbc47 100644
--- a/packages/flutter_driver/lib/src/driver/driver.dart
+++ b/packages/flutter_driver/lib/src/driver/driver.dart
@@ -137,6 +137,7 @@
   static const String _setVMTimelineFlagsMethodName = '_setVMTimelineFlags';
   static const String _getVMTimelineMethodName = '_getVMTimeline';
   static const String _clearVMTimelineMethodName = '_clearVMTimeline';
+  static const String _collectAllGarbageMethodName = '_collectAllGarbage';
 
   static int _nextDriverId = 0;
 
@@ -791,6 +792,22 @@
     return result;
   }
 
+  /// Force a garbage collection run in the VM.
+  Future<void> forceGC() async {
+    try {
+      await _peer
+          .sendRequest(_collectAllGarbageMethodName, <String, String>{
+            'isolateId': 'isolates/${_appIsolate.numberAsString}',
+          });
+    } catch (error, stackTrace) {
+      throw DriverError(
+        'Failed to force a GC due to remote error',
+        error,
+        stackTrace,
+      );
+    }
+  }
+
   /// Closes the underlying connection to the VM service.
   ///
   /// Returns a [Future] that fires once the connection has been closed.