diff -r 3b3133d93fb6 src/os/windows/vm/os_windows.cpp
--- a/src/os/windows/vm/os_windows.cpp
+++ b/src/os/windows/vm/os_windows.cpp
@@ -3737,6 +3737,8 @@
   if (!os::win32::is_nt()) {
     StarvationMonitorInterval = 6000;
   }
+
+  os::win32::hParkeventHeap = ::HeapCreate(HEAP_CREATE_ENABLE_EXECUTE, 0, 256*M);
 }
 
 
@@ -4733,6 +4735,12 @@
   return success;
 }
 
+HANDLE os::win32::hParkeventHeap = NULL;
+
+void* os::win32::malloc_parkevent(size_t size) {
+  return ::HeapAlloc(hParkeventHeap, 0, size);
+}
+
 // An Event wraps a win32 "CreateEvent" kernel handle.
 //
 // We have a number of choices regarding "CreateEvent" win32 handle leakage:
diff -r 3b3133d93fb6 src/os/windows/vm/os_windows.hpp
--- a/src/os/windows/vm/os_windows.hpp
+++ b/src/os/windows/vm/os_windows.hpp
@@ -98,6 +98,9 @@
   static void call_test_func_with_wrapper(void (*funcPtr)(void));
 #endif
 
+  static void* malloc_parkevent(size_t size);
+  static HANDLE hParkeventHeap;
+
   // filter function to ignore faults on serializations page
   static LONG WINAPI serialize_fault_filter(struct _EXCEPTION_POINTERS* e);
 };
diff -r 3b3133d93fb6 src/share/vm/runtime/os.cpp
--- a/src/share/vm/runtime/os.cpp
+++ b/src/share/vm/runtime/os.cpp
@@ -658,6 +658,13 @@
   return ptr;
 }
 
+void* os::malloc_parkevent(size_t size, MEMFLAGS memflags, address caller) {
+#ifdef TARGET_OS_FAMILY_windows
+  return os::win32::malloc_parkevent(size);
+#else
+  return os::malloc(size, memflags, caller);
+#endif
+}
 void* os::malloc(size_t size, MEMFLAGS memflags, address caller) {
   NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1));
   NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size));
diff -r 3b3133d93fb6 src/share/vm/runtime/os.hpp
--- a/src/share/vm/runtime/os.hpp
+++ b/src/share/vm/runtime/os.hpp
@@ -649,6 +649,7 @@
 
   // General allocation (must be MT-safe)
   static void* malloc  (size_t size, MEMFLAGS flags, address caller_pc = 0);
+  static void* malloc_parkevent  (size_t size, MEMFLAGS flags, address caller_pc = 0);
   static void* realloc (void *memblock, size_t size, MEMFLAGS flags, address caller_pc = 0);
   static void  free    (void *memblock, MEMFLAGS flags = mtNone);
   static bool  check_heap(bool force = false);      // verify C heap integrity
diff -r 3b3133d93fb6 src/share/vm/runtime/park.cpp
--- a/src/share/vm/runtime/park.cpp
+++ b/src/share/vm/runtime/park.cpp
@@ -141,7 +141,7 @@
 // although Niagara's hash function should help.
 
 void * ParkEvent::operator new (size_t sz) throw() {
-  return (void *) ((intptr_t (AllocateHeap(sz + 256, mtInternal, CALLER_PC)) + 256) & -256) ;
+  return (void *) ((intptr_t (os::malloc_parkevent(sz + 256, mtInternal, CALLER_PC)) + 256) & -256) ;
 }
 
 void ParkEvent::operator delete (void * a) {
