diff --git a/src/hotspot/share/gc/serial/vmStructs_serial.hpp b/src/hotspot/share/gc/serial/vmStructs_serial.hpp
index f4941401314..9f646424100 100644
--- a/src/hotspot/share/gc/serial/vmStructs_serial.hpp
+++ b/src/hotspot/share/gc/serial/vmStructs_serial.hpp
@@ -32,6 +32,13 @@
 #define VM_STRUCTS_SERIALGC(nonstatic_field,                                                                \
                             volatile_nonstatic_field,                                                       \
                             static_field)                                                                   \
+  nonstatic_field(Generation,                        _reserved,              MemRegion)                     \
+  nonstatic_field(Generation,                        _virtual_space,         VirtualSpace)                  \
+  nonstatic_field(Generation,                        _stat_record,           Generation::StatRecord)        \
+                                                                                                            \
+  nonstatic_field(Generation::StatRecord,            invocations,            int)                           \
+  nonstatic_field(Generation::StatRecord,            accumulated_time,       elapsedTimer)                  \
+                                                                                                            \
   nonstatic_field(TenuredGeneration,                 _rs,                    CardTableRS*)                  \
   nonstatic_field(TenuredGeneration,                 _bts,                   SerialBlockOffsetSharedArray*) \
   nonstatic_field(TenuredGeneration,                 _shrink_factor,         size_t)                        \
@@ -61,6 +68,8 @@
 #define VM_TYPES_SERIALGC(declare_type,                                       \
                           declare_toplevel_type,                              \
                           declare_integer_type)                               \
+  declare_toplevel_type(Generation)                                           \
+  declare_toplevel_type(Generation::StatRecord)                               \
   declare_type(SerialHeap,                   CollectedHeap)                   \
   declare_type(TenuredGeneration,            Generation)                      \
   declare_type(TenuredSpace,                 ContiguousSpace)                 \
@@ -73,6 +82,8 @@
   declare_toplevel_type(SerialBlockOffsetTable)
 
 #define VM_INT_CONSTANTS_SERIALGC(declare_constant,                           \
-                                  declare_constant_with_value)
+                                  declare_constant_with_value)                \
+  declare_constant(Generation::LogOfGenGrain)                                 \
+  declare_constant(Generation::GenGrain)
 
 #endif // SHARE_GC_SERIAL_VMSTRUCTS_SERIAL_HPP
diff --git a/src/hotspot/share/gc/shared/vmStructs_gc.hpp b/src/hotspot/share/gc/shared/vmStructs_gc.hpp
index 69bb8c848e8..05dbaec5ff5 100644
--- a/src/hotspot/share/gc/shared/vmStructs_gc.hpp
+++ b/src/hotspot/share/gc/shared/vmStructs_gc.hpp
@@ -101,13 +101,6 @@
   nonstatic_field(ContiguousSpace,             _top,                                          HeapWord*)                             \
   nonstatic_field(ContiguousSpace,             _saved_mark_word,                              HeapWord*)                             \
                                                                                                                                      \
-  nonstatic_field(Generation,                  _reserved,                                     MemRegion)                             \
-  nonstatic_field(Generation,                  _virtual_space,                                VirtualSpace)                          \
-  nonstatic_field(Generation,                  _stat_record,                                  Generation::StatRecord)                \
-                                                                                                                                     \
-  nonstatic_field(Generation::StatRecord,      invocations,                                   int)                                   \
-  nonstatic_field(Generation::StatRecord,      accumulated_time,                              elapsedTimer)                          \
-                                                                                                                                     \
   nonstatic_field(MemRegion,                   _start,                                        HeapWord*)                             \
   nonstatic_field(MemRegion,                   _word_size,                                    size_t)                                \
                                                                                                                                      \
@@ -142,7 +135,6 @@
   /******************************************/                            \
                                                                           \
   declare_toplevel_type(CollectedHeap)                                    \
-  declare_toplevel_type(Generation)                                       \
   declare_toplevel_type(Space)                                            \
            declare_type(ContiguousSpace,             Space)               \
   declare_toplevel_type(BarrierSet)                                       \
@@ -155,7 +147,6 @@
                                                                           \
   declare_toplevel_type(AgeTable)                                         \
   declare_toplevel_type(CardTable::CardValue)                             \
-  declare_toplevel_type(Generation::StatRecord)                           \
   declare_toplevel_type(HeapWord)                                         \
   declare_toplevel_type(MemRegion)                                        \
   declare_toplevel_type(ThreadLocalAllocBuffer)                           \
@@ -212,9 +203,6 @@
   declare_constant(CollectedHeap::Serial)                                   \
   declare_constant(CollectedHeap::Parallel)                                 \
   declare_constant(CollectedHeap::G1)                                       \
-                                                                            \
-  declare_constant(Generation::LogOfGenGrain)                               \
-  declare_constant(Generation::GenGrain)                                    \
 
 #define VM_LONG_CONSTANTS_GC(declare_constant)                              \
   ZGC_ONLY(VM_LONG_CONSTANTS_Z_SHARED(declare_constant))
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HSDB.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HSDB.java
index 162de7c65bb..6ef7d3d077b 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HSDB.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HSDB.java
@@ -1079,20 +1079,13 @@ public class HSDB implements ObjectHistogramPanel.Listener, SAListener {
                         anno = "BAD OOP";
                         if (collHeap instanceof SerialHeap) {
                           SerialHeap heap = (SerialHeap) collHeap;
-                          for (int i = 0; i < heap.nGens(); i++) {
-                            if (heap.getGen(i).isIn(handle)) {
-                              if (i == 0) {
-                                anno = "NewGen ";
-                              } else if (i == 1) {
-                                anno = "OldGen ";
-                              } else {
-                                anno = "Gen " + i + " ";
-                              }
-                              bad = false;
-                              break;
-                            }
+                          if (heap.youngGen().isIn(handle)) {
+                            anno = "NewGen ";
+                            bad = false;
+                          } else if (heap.oldGen().isIn(handle)) {
+                            anno = "OldGen ";
+                            bad = false;
                           }
-
                         } else if (collHeap instanceof G1CollectedHeap) {
                           G1CollectedHeap heap = (G1CollectedHeap)collHeap;
                           HeapRegion region = heap.hrm().getByAddress(handle);
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/DefNewGeneration.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/DefNewGeneration.java
index 91a11345572..fc825365e04 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/DefNewGeneration.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/DefNewGeneration.java
@@ -84,12 +84,12 @@ public class DefNewGeneration extends Generation {
     return "default new generation";
   }
 
-  public void spaceIterate(SpaceClosure blk, boolean usedOnly) {
-    blk.doSpace(eden());
-    blk.doSpace(from());
-    if (!usedOnly) {
-      blk.doSpace(to());
-    }
+  /* Returns "TRUE" iff "p" points into an allocated object in young
+     generation. */
+  public boolean isIn(Address p) {
+    return eden().contains(p)
+        || from().contains(p)
+        || to().contains(p);
   }
 
   public void liveRegionsIterate(LiveRegionsClosure closure) {
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/Generation.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/Generation.java
similarity index 89%
rename from src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/Generation.java
rename to src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/Generation.java
index 77488063952..0b152a1f95f 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/Generation.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/Generation.java
@@ -22,11 +22,12 @@
  *
  */
 
-package sun.jvm.hotspot.gc.shared;
+package sun.jvm.hotspot.gc.serial;
 
 import java.io.*;
 import java.util.*;
 import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.gc.shared.*;
 import sun.jvm.hotspot.memory.*;
 import sun.jvm.hotspot.runtime.*;
 import sun.jvm.hotspot.types.*;
@@ -105,14 +106,6 @@ public abstract class Generation extends VMObject {
     return reserved();
   }
 
-  /* Returns "TRUE" iff "p" points into an allocated object in the
-     generation. */
-  public boolean isIn(Address p) {
-    GenerationIsInClosure blk = new GenerationIsInClosure(p);
-    spaceIterate(blk);
-    return (blk.space() != null);
-  }
-
   /** Returns "TRUE" iff "p" points into the reserved area of the
      generation. */
   public boolean isInReserved(Address p) {
@@ -125,13 +118,7 @@ public abstract class Generation extends VMObject {
 
   public abstract String name();
 
-  /** Equivalent to spaceIterate(blk, false) */
-  public void spaceIterate(SpaceClosure blk) {
-    spaceIterate(blk, false);
-  }
-
   /** Iteration - do not use for time critical operations */
-  public abstract void spaceIterate(SpaceClosure blk, boolean usedOnly);
   public abstract void liveRegionsIterate(LiveRegionsClosure closure);
 
   public void print() { printOn(System.out); }
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/SerialHeap.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/SerialHeap.java
index 5611a58c7b2..2640da35ac1 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/SerialHeap.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/SerialHeap.java
@@ -28,6 +28,7 @@ import java.io.*;
 
 import sun.jvm.hotspot.debugger.*;
 import sun.jvm.hotspot.gc.shared.*;
+import sun.jvm.hotspot.memory.MemRegion;
 import sun.jvm.hotspot.runtime.*;
 import sun.jvm.hotspot.types.*;
 import sun.jvm.hotspot.utilities.*;
@@ -64,68 +65,46 @@ public class SerialHeap extends CollectedHeap {
     genFactory = new GenerationFactory();
   }
 
-  public int nGens() {
-    return 2; // Young + Old
+  public DefNewGeneration youngGen() {
+    return VMObjectFactory.newObject(DefNewGeneration.class, youngGenField.getValue(addr));
   }
 
-  public Generation getGen(int i) {
-    if (Assert.ASSERTS_ENABLED) {
-      Assert.that((i == 0) || (i == 1), "Index " + i +
-                  " out of range (should be 0 or 1)");
-    }
-
-    switch (i) {
-    case 0:
-      return genFactory.newObject(youngGenField.getValue(addr));
-    case 1:
-      return genFactory.newObject(oldGenField.getValue(addr));
-    default:
-      // no generation for i, and assertions disabled.
-      return null;
-    }
+  public TenuredGeneration oldGen() {
+    return VMObjectFactory.newObject(TenuredGeneration.class, oldGenField.getValue(addr));
   }
 
   public boolean isIn(Address a) {
-    for (int i = 0; i < nGens(); i++) {
-      Generation gen = getGen(i);
-      if (gen.isIn(a)) {
-        return true;
-      }
-    }
-
-    return false;
+    return youngGen().isIn(a) || oldGen().isIn(a);
   }
 
   public long capacity() {
     long capacity = 0;
-    for (int i = 0; i < nGens(); i++) {
-      capacity += getGen(i).capacity();
-    }
+    capacity += youngGen().capacity();
+    capacity += oldGen().capacity();
     return capacity;
   }
 
   public long used() {
     long used = 0;
-    for (int i = 0; i < nGens(); i++) {
-      used += getGen(i).used();
-    }
+    used += youngGen().used();
+    used += oldGen().used();
     return used;
   }
 
   public void liveRegionsIterate(LiveRegionsClosure closure) {
-    // Run through all generations, obtaining bottom-top pairs.
-    for (int i = 0; i < nGens(); i++) {
-      Generation gen = getGen(i);
-      gen.liveRegionsIterate(closure);
-    }
+    youngGen().liveRegionsIterate(closure);
+    oldGen().liveRegionsIterate(closure);
   }
 
   public void printOn(PrintStream tty) {
-    for (int i = 0; i < nGens(); i++) {
-      tty.print("Gen " + i + ": ");
-      getGen(i).printOn(tty);
-      tty.println("Invocations: " + getGen(i).invocations());
-      tty.println();
-    }
+    tty.println("SerialHeap:");
+
+    tty.println("Young Generation - Invocations: " + youngGen().invocations());
+    youngGen().printOn(tty);
+    tty.println();
+
+    tty.println("Old Generation - Invocations: " + oldGen().invocations());
+    oldGen().printOn(tty);
+    tty.println();
   }
 }
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/TenuredGeneration.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/TenuredGeneration.java
index 6b73f0ec28d..f8e10387631 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/TenuredGeneration.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/TenuredGeneration.java
@@ -74,10 +74,6 @@ public class TenuredGeneration extends Generation {
   public long free()                { return theSpace().free();                                    }
   public long contiguousAvailable() { return theSpace().free() + virtualSpace().uncommittedSize(); }
 
-  public void spaceIterate(SpaceClosure blk, boolean usedOnly) {
-    blk.doSpace(theSpace());
-  }
-
   public void liveRegionsIterate(LiveRegionsClosure closure) {
     closure.doLiveRegions(theSpace());
   }
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GenerationIsInClosure.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GenerationIsInClosure.java
deleted file mode 100644
index a0b759918d1..00000000000
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GenerationIsInClosure.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-package sun.jvm.hotspot.gc.shared;
-
-import sun.jvm.hotspot.debugger.*;
-
-/** Should only be used once */
-
-class GenerationIsInClosure implements SpaceClosure {
-  private Address p;
-  private Space sp;
-
-  GenerationIsInClosure(Address p) {
-    this.p = p;
-  }
-
-  public void doSpace(Space s) {
-    if (s.contains(p)) {
-      sp = s;
-    }
-  }
-
-  Space space() {
-    return sp;
-  }
-}
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java
index 3cb38596520..e3eee4b7237 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java
@@ -95,27 +95,30 @@ public class HeapSummary extends Tool {
 
       if (heap instanceof SerialHeap) {
          SerialHeap sh = (SerialHeap) heap;
-         for (int n = 0; n < sh.nGens(); n++) {
-            Generation gen = sh.getGen(n);
-            if (gen instanceof DefNewGeneration) {
-               System.out.println("New Generation (Eden + 1 Survivor Space):");
-               printGen(gen);
+         {
+           // youngGen
+           DefNewGeneration youngGen = sh.youngGen();
 
-               ContiguousSpace eden = ((DefNewGeneration)gen).eden();
-               System.out.println("Eden Space:");
-               printSpace(eden);
+           System.out.println("New Generation (Eden + 1 Survivor Space):");
+           printGen(youngGen);
 
-               ContiguousSpace from = ((DefNewGeneration)gen).from();
-               System.out.println("From Space:");
-               printSpace(from);
+           ContiguousSpace eden = youngGen.eden();
+           System.out.println("Eden Space:");
+           printSpace(eden);
 
-               ContiguousSpace to = ((DefNewGeneration)gen).to();
-               System.out.println("To Space:");
-               printSpace(to);
-            } else {
-               System.out.println(gen.name() + ":");
-               printGen(gen);
-            }
+           ContiguousSpace from = youngGen.from();
+           System.out.println("From Space:");
+           printSpace(from);
+
+           ContiguousSpace to = youngGen.to();
+           System.out.println("To Space:");
+           printSpace(to);
+         }
+         {
+           // oldGen
+           TenuredGeneration oldGen = sh.oldGen();
+           System.out.println(oldGen.name() + ":");
+           printGen(oldGen);
          }
       } else if (heap instanceof G1CollectedHeap) {
           printG1HeapSummary((G1CollectedHeap)heap);
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PointerFinder.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PointerFinder.java
index 0ae61b06fe7..d4368ee8b96 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PointerFinder.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PointerFinder.java
@@ -106,12 +106,10 @@ public class PointerFinder {
       // If we are using the SerialHeap, find out which generation the address is in
       if (heap instanceof SerialHeap) {
         SerialHeap sh = (SerialHeap)heap;
-        for (int i = 0; i < sh.nGens(); i++) {
-          Generation g = sh.getGen(i);
-          if (g.isIn(a)) {
-            loc.gen = g;
-            break;
-          }
+        if (sh.youngGen().isIn(a)) {
+          loc.gen = sh.youngGen();
+        } else if (sh.oldGen().isIn(a)) {
+          loc.gen = sh.oldGen();
         }
 
         if (Assert.ASSERTS_ENABLED) {
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PointerLocation.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PointerLocation.java
index c4ff1697575..39937d834c6 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PointerLocation.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PointerLocation.java
@@ -113,11 +113,11 @@ public class PointerLocation {
   }
 
   public boolean isInNewGen() {
-    return ((gen != null) && (gen.equals(((SerialHeap)heap).getGen(0))));
+    return ((gen != null) && (gen.equals(((SerialHeap)heap).youngGen())));
   }
 
   public boolean isInOldGen() {
-    return ((gen != null) && (gen.equals(((SerialHeap)heap).getGen(1))));
+    return ((gen != null) && (gen.equals(((SerialHeap)heap).oldGen())));
   }
 
   public boolean inOtherGen() {
diff --git a/test/hotspot/jtreg/serviceability/sa/TestUniverse.java b/test/hotspot/jtreg/serviceability/sa/TestUniverse.java
index a6ad63243af..edcb31ee528 100644
--- a/test/hotspot/jtreg/serviceability/sa/TestUniverse.java
+++ b/test/hotspot/jtreg/serviceability/sa/TestUniverse.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -53,7 +53,8 @@ public class TestUniverse {
 
         switch (gc) {
         case Serial:
-            expStrings.add("Gen 1:   old");
+            expStrings.add("SerialHeap");
+            expStrings.add("eden");
             break;
 
         case Parallel: