Index: lucene/core/src/java/org/apache/lucene/util/Constants.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/util/Constants.java	(revision 1367529)
+++ lucene/core/src/java/org/apache/lucene/util/Constants.java	(working copy)
@@ -17,7 +17,9 @@
  * limitations under the License.
  */
 
+import java.lang.management.ManagementFactory;
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.util.Collections;
 import org.apache.lucene.LucenePackage;
 
@@ -108,6 +110,28 @@
     } else {
       JRE_IS_MINIMUM_JAVA8 = false;
     }
+    
+    if ("21.0-b17".equals(JVM_VERSION) && "Oracle Corporation".equals(JVM_VENDOR)) {
+      boolean useLoopPredicate = true;
+      try {
+        final Class<?> beanClazz = Class.forName("com.sun.management.HotSpotDiagnosticMXBean");
+        final Object hotSpotBean = ManagementFactory.newPlatformMXBeanProxy(
+          ManagementFactory.getPlatformMBeanServer(),
+          "com.sun.management:type=HotSpotDiagnostic",
+          beanClazz
+        );
+        final Method getVMOptionMethod = beanClazz.getMethod("getVMOption", String.class);
+        final Object vmOption = getVMOptionMethod.invoke(hotSpotBean, "UseLoopPredicate");
+        useLoopPredicate = Boolean.parseBoolean(
+            vmOption.getClass().getMethod("getValue").invoke(vmOption).toString()
+        );
+      } catch (Exception e) {
+        // Ignore.
+      }
+      if (useLoopPredicate) {
+        throw new RuntimeException("This JVM is incompatible with Lucene, please run with -XX:-UseLoopPredicate");
+      }
+    }
   }
 
   // this method prevents inlining the final version constant in compiled classes,
