diff a/test/hotspot/jtreg/vmTestbase/nsk/share/gc/Memory.java b/test/hotspot/jtreg/vmTestbase/nsk/share/gc/Memory.java
--- a/test/hotspot/jtreg/vmTestbase/nsk/share/gc/Memory.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/share/gc/Memory.java
@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2026, 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.
@@ -25,21 +25,25 @@
 
 import nsk.share.test.LocalRandom;
 import java.io.PrintStream;
 import nsk.share.gc.gp.GarbageProducer;
 import nsk.share.gc.tree.*;
-import nsk.share.gc.gp.MemoryStrategy;
 import nsk.share.log.Log;
 
 /**
  *  Different utility methods to work with memory objects.
  */
 public final class Memory {
         private static int bits = 0;
         private static int referenceSize = 0;
         private static int objectExtraSize = 0;
 
+        private static final boolean previewEnabled =
+                System.getProperty("test.java.opts", "").contains("--enable-preview") ||
+                System.getProperty("test.vm.opts", "").contains("--enable-preview");
+
+
         private Memory() {
         }
 
         private static int getBits() {
                 if (bits == 0)
@@ -56,10 +60,18 @@
                 if (referenceSize == 0)
                         referenceSize = (getBits() == 64) ? 8 : 4;
                 return referenceSize;
         }
 
+        public static boolean isPreviewEnabled() {
+                return previewEnabled;
+        }
+
+        public static boolean isValhallaEnabled() {
+            return previewEnabled;
+        }
+
         /**
          * Get size of primitive type int.
          */
         public static int getIntSize() {
                 return 4;
@@ -113,10 +125,50 @@
         public static int getDoubleSize() {
                 return 8;
         }
 
         /**
+         * Get size of Integer element in Integer array.
+         * If array is not flattened, the only reference size is returned, the referred values
+         * should be added manually in references are not null.
+         */
+        public static int getIntegerArrayElementSize() {
+
+            if (!Memory.isValhallaEnabled()) {
+                return getReferenceSize();
+            }
+            return 8;
+        }
+
+        /**
+         * Get size of Byte element in Byte array.
+         * If array is not flattened, the only reference size is returned, the referred values
+         * should be added manually in references are not null.
+         */
+        public static int getByteArrayElementSize() {
+
+            if (!Memory.isValhallaEnabled()) {
+                return getReferenceSize();
+            }
+            return 2;
+        }
+
+        /**
+         * Get size of Boolean element in Boolean array.
+         * If array is not flattened, the only reference size is returned, the referred values
+         * should be added manually in references are not null.
+         */
+        public static int getBooleanArrayElementSize() {
+            if (!Memory.isValhallaEnabled()) {
+                return getReferenceSize();
+            }
+            return 2;
+        }
+
+
+
+    /**
          *  Get how many extra bytes an object occupies in the heap
          *  compared to sum of it's fields.
          *
          *  TODO: somehow determine the real value
          */
@@ -149,12 +201,13 @@
          *  @param objectSize size of each object in array
          *  @return length of array
          */
         public static int getArrayLength(long memory, long objectSize) {
                 int arrayExtraSize = getArrayExtraSize();
-                return (int) Math.min((memory - arrayExtraSize) / objectSize,
+                int length = (int) Math.min((memory - arrayExtraSize) / objectSize,
                         Integer.MAX_VALUE);
+                return Math.max(length, 0);
         }
 
         /**
          *  Get an approximate size of array of given length and object size.
          *
