diff --git a/src/java.base/share/classes/java/nio/Direct-X-Buffer.java.template b/src/java.base/share/classes/java/nio/Direct-X-Buffer.java.template index 4c540d324a0..91ad40b7b7e 100644 --- a/src/java.base/share/classes/java/nio/Direct-X-Buffer.java.template +++ b/src/java.base/share/classes/java/nio/Direct-X-Buffer.java.template @@ -134,7 +134,14 @@ class Direct$Type$Buffer$RW$$BO$ } else { address = base; } - cleaner = Cleaner.create(this, new Deallocator(base, size, cap)); + try { + cleaner = Cleaner.create(this, new Deallocator(base, size, cap)); + } catch (Throwable t) { + // Prevent leak if the Deallocator or Cleaner fail for any reason + UNSAFE.freeMemory(base); + Bits.unreserveMemory(size, cap); + throw t; + } att = null; #else[rw] super(cap);