We need to find out how to disable escape analysis when both JVMTI and Preview are enabled.
There are several spots where EA is used.
src/hotspot/share/prims/jvmtiTagMap.cpp (Heap Walking API implementation):
// Deprecated function to iterate over all objects in the heap
void JvmtiTagMap::iterate_over_heap(jvmtiHeapObjectFilter object_filter,
                                    Klass* klass,
                                    jvmtiHeapObjectCallback heap_object_callback,
                                    const void* user_data)
{
  // EA based optimizations on tagged objects are already reverted.
  EscapeBarrier eb(object_filter == JVMTI_HEAP_OBJECT_UNTAGGED ||
                   object_filter == JVMTI_HEAP_OBJECT_EITHER,
                   JavaThread::current());
  eb.deoptimize_objects_all_threads();
  . . .
// Iterates over all objects in the heap
void JvmtiTagMap::iterate_through_heap(jint heap_filter,
                    Klass* klass,
                    const jvmtiHeapCallbacks* callbacks,
                    const void* user_data)
{
 // EA based optimizations on tagged objects are already reverted.
 EscapeBarrier eb(false, JavaThread::current()); // disable due to virtual threads
 eb.deoptimize_objects_all_threads();
 . . .
// iterate over all objects that are reachable from a set of roots
void JvmtiTagMap::iterate_over_reachable_objects(jvmtiHeapRootCallback heap_root_callback,
                         jvmtiStackReferenceCallback stack_ref_callback,
                         jvmtiObjectReferenceCallback object_ref_callback,
                         const void* user_data) {
 JavaThread* jt = JavaThread::current();
 EscapeBarrier eb(true, jt);
 . . .
void JvmtiTagMap::follow_references(jint heap_filter,
                                    Klass* klass,
                                    jobject object,
                                    const jvmtiHeapCallbacks* callbacks,
                                    const void* user_data)
{
  . . .
  // EA based optimizations that are tagged or reachable from initial_object are already reverted.
  EscapeBarrier eb(initial_object.is_null() &&
src/hotspot/share/prims/jvmtiImpl.hpp (implementation GetLocal/SetLocal):
class VM_GetOrSetLocal : public VM_BaseGetOrSetLocal {
 protected:
  JavaThread* _thread;
  EscapeBarrier _eb;
  . . .
src/hotspot/share/prims/jvmtiEnvBase.cpp (ForceEarlyReturn implementation):
jvmtiError
JvmtiEnvBase::force_early_return(jthread thread, jvalue value, TosState tos) {
  . . .
  // Eagerly reallocate scalar replaced objects.
  EscapeBarrier eb(true, current_thread, java_thread);
  . . .
src/hotspot/share/prims/jvmtiEnv.cpp (implementation of GetOwnedMonitorInfo, GetOwnedMonitorStackDepthInfo and PopFrame):
JvmtiEnv::GetOwnedMonitorInfo(jthread thread, jint* owned_monitor_count_ptr, jobject** owned_monitors_ptr) {
    . . .
    EscapeBarrier eb(true, calling_thread, java_thread);
  . . .
JvmtiEnv::GetOwnedMonitorStackDepthInfo(jthread thread, jint* monitor_info_count_ptr, jvmtiMonitorStackDepthInfo** monitor_info_ptr) {
  . . .
    EscapeBarrier eb(true, calling_thread, java_thread);
  . . .
JvmtiEnv::PopFrame(jthread thread) {
  . . .
  // Eagerly reallocate scalar replaced objects.
  EscapeBarrier eb(true, current_thread, java_thread);
  . . .