You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datasketches.apache.org by le...@apache.org on 2022/12/14 05:26:55 UTC

[datasketches-memory] branch IntegrateJava17_v2 updated: Interim 4 refactoring 8 and 17 BaseStateImpl to sorta match.

This is an automated email from the ASF dual-hosted git repository.

leerho pushed a commit to branch IntegrateJava17_v2
in repository https://gitbox.apache.org/repos/asf/datasketches-memory.git


The following commit(s) were added to refs/heads/IntegrateJava17_v2 by this push:
     new c6e5a83  Interim 4 refactoring 8 and 17 BaseStateImpl to sorta match.
c6e5a83 is described below

commit c6e5a83e17dff9e734d38912fd9f8b73502261df
Author: Lee Rhodes <le...@users.noreply.github.com>
AuthorDate: Tue Dec 13 21:26:41 2022 -0800

    Interim 4 refactoring 8 and 17 BaseStateImpl to sorta match.
    
    Plus removing all non-unsafe stuff from UnsafeUtil and placing it in
    BaseStateImpl.
    
    Plus fixing "type" management
    
    All tests pass for both 8 and 17
---
 .../org/apache/datasketches/memory/BaseState.java  |   8 +-
 .../memory/internal/BaseStateImpl.java             | 154 +++---
 .../memory/internal/BaseWritableBufferImpl.java    |   2 -
 .../memory/internal/BaseWritableMemoryImpl.java    |   7 +-
 .../internal/NonNativeWritableBufferImpl.java      |   3 -
 .../internal/NonNativeWritableMemoryImpl.java      |   3 -
 .../apache/datasketches/memory/internal/Util.java  |  13 +-
 .../internal/AllocateDirectMapMemoryTest.java      |   2 +-
 .../memory/internal/AllocateDirectMemoryTest.java  |   2 +-
 .../AllocateDirectWritableMapMemoryTest.java       |   4 +-
 .../memory/internal/BaseStateTest.java             |  58 +--
 .../datasketches/memory/internal/BufferTest.java   |   2 +-
 .../datasketches/memory/internal/LeafImplTest.java |   4 +-
 .../datasketches/memory/internal/MemoryTest.java   |   6 +-
 .../internal/NativeWritableBufferImplTest.java     |   5 +-
 .../internal/NativeWritableMemoryImplTest.java     |   7 +-
 .../memory/internal/SpecificLeafTest.java          |  10 +-
 .../datasketches/memory/internal/UtilTest.java     |   2 +-
 .../org/apache/datasketches/memory/BaseState.java  |  43 +-
 .../org/apache/datasketches/memory/Memory.java     |   6 +-
 .../apache/datasketches/memory/WritableBuffer.java |   2 +-
 .../apache/datasketches/memory/WritableMemory.java |   6 +-
 .../memory/internal/AllocateDirect.java            |   7 +-
 .../memory/internal/AllocateDirectMap.java         |  13 +-
 .../memory/internal/BaseStateImpl.java             | 556 ++++++++++++---------
 .../memory/internal/BaseWritableBufferImpl.java    |   1 -
 .../memory/internal/BaseWritableMemoryImpl.java    |   1 -
 .../memory/internal/CompareAndCopy.java            |  14 +-
 .../memory/internal/NativeWritableBufferImpl.java  |   7 -
 .../memory/internal/NativeWritableMemoryImpl.java  |   7 -
 .../internal/NonNativeWritableBufferImpl.java      |   6 -
 .../internal/NonNativeWritableMemoryImpl.java      |   6 -
 .../apache/datasketches/memory/internal/Prim.java  |  23 +-
 .../datasketches/memory/internal/UnsafeUtil.java   |  83 ---
 .../apache/datasketches/memory/internal/Util.java  |  20 +-
 .../datasketches/memory/internal/XxHash64.java     |  12 +-
 .../internal/AllocateDirectMapMemoryTest.java      |   4 +-
 .../memory/internal/AllocateDirectMemoryTest.java  |  15 +-
 .../AllocateDirectWritableMapMemoryTest.java       |  29 +-
 .../memory/internal/BaseStateTest.java             |  69 ++-
 .../datasketches/memory/internal/Buffer2Test.java  |   2 +-
 .../datasketches/memory/internal/BufferTest.java   |   2 +-
 .../memory/internal/DruidIssue11544Test.java       |   2 +-
 .../internal/ExampleMemoryRequestServerTest.java   |   2 +-
 .../datasketches/memory/internal/LeafImplTest.java |  48 +-
 .../memory/internal/MemoryReadWriteSafetyTest.java |   2 +-
 .../datasketches/memory/internal/MemoryTest.java   |  54 +-
 .../internal/NativeWritableBufferImplTest.java     |   7 +-
 .../internal/NativeWritableMemoryImplTest.java     |  10 +-
 .../memory/internal/SpecificLeafTest.java          |  10 +-
 .../memory/internal/UnsafeUtilTest.java            |  59 ---
 .../datasketches/memory/internal/UtilTest.java     |   5 +-
 .../memory/internal/WritableMemoryTest.java        |   2 +-
 53 files changed, 627 insertions(+), 800 deletions(-)

diff --git a/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/BaseState.java b/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/BaseState.java
index ef5d4f8..c8fe15b 100644
--- a/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/BaseState.java
+++ b/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/BaseState.java
@@ -55,10 +55,9 @@ public interface BaseState {
    * same object for equals.
    * @param thisOffsetBytes the starting offset in bytes for this object.
    * @param that the given BaseState object
-   * @param thatOffsetBytes the starting offset in bytes for the given object
+   * @param thatOffsetBytes the starting offset in bytes for the given BaseState object
    * @param lengthBytes the size of the range in bytes
-   * @return true if the given object has equal contents to this object in the given range of
-   * bytes.
+   * @return true if the given BaseState object has equal contents to this object in the given range of bytes.
    */
   boolean equalTo(long thisOffsetBytes, BaseState that, long thatOffsetBytes, long lengthBytes);
 
@@ -75,7 +74,6 @@ public interface BaseState {
    */
   long getCapacity();
 
-
   /**
    * Returns true if this Memory is backed by a ByteBuffer.
    * @return true if this Memory is backed by a ByteBuffer.
@@ -93,7 +91,7 @@ public interface BaseState {
 
   /**
    * Returns true if the backing resource is direct (off-heap) memory.
-   * This can be true for allocated direct memory, memory mapped files,
+   * This is the case for allocated direct memory, memory mapped files,
    * or from a wrapped ByteBuffer that was allocated direct.
    * @return true if the backing resource is direct (off-heap) memory.
    */
diff --git a/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/BaseStateImpl.java b/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/BaseStateImpl.java
index 6dd942f..78ec304 100644
--- a/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/BaseStateImpl.java
+++ b/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/BaseStateImpl.java
@@ -20,8 +20,6 @@
 package org.apache.datasketches.memory.internal;
 
 import static jdk.incubator.foreign.MemoryAccess.getByteAtOffset;
-import static org.apache.datasketches.memory.internal.Util.LS;
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
 
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
@@ -43,7 +41,7 @@ import jdk.incubator.foreign.ResourceScope;
  */
 abstract class BaseStateImpl implements BaseState {
   static final String JDK; //must be at least "1.8"
-  static final int JDK_MAJOR; //8, 11, 12, etc
+  static final int JDK_MAJOR; //8, 11, 17, etc
 
   static final int BOOLEAN_SHIFT    = 0;
   static final int BYTE_SHIFT       = 0;
@@ -55,27 +53,37 @@ abstract class BaseStateImpl implements BaseState {
   static final long DOUBLE_SHIFT    = 3;
 
   //class type IDs.
-  // 0000 0XXX
+  // 0000 0XXX Group 1
   static final int READONLY  = 1;
   static final int REGION    = 1 << 1;
   static final int DUPLICATE = 1 << 2; //for Buffer only
 
-  // 000X X000
+  // 000X X000 Group 2
   static final int HEAP   = 0;
   static final int DIRECT = 1 << 3;
   static final int MAP    = 1 << 4; //Map is always Direct also
 
-  // 00X0 0000
+  // 00X0 0000 Group 3
   static final int NATIVE    = 0;
   static final int NONNATIVE = 1 << 5;
 
-  // 0X00 0000
+  // 0X00 0000 Group 4
   static final int MEMORY = 0;
-   static final int BUFFER = 1 << 6;
+  static final int BUFFER = 1 << 6;
 
-  // X000 0000
+  // X000 0000 Group 5
   static final int BYTEBUF = 1 << 7;
 
+  /**
+   * The java line separator character as a String.
+   */
+  static final String LS = System.getProperty("line.separator");
+
+  static final ByteOrder NATIVE_BYTE_ORDER = ByteOrder.nativeOrder();
+
+  static final ByteOrder NON_NATIVE_BYTE_ORDER =
+      (NATIVE_BYTE_ORDER == ByteOrder.LITTLE_ENDIAN) ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
+
   static {
     final String jdkVer = System.getProperty("java.version");
     final int[] p = parseJavaVersion(jdkVer);
@@ -94,6 +102,8 @@ abstract class BaseStateImpl implements BaseState {
     this.memReqSvr = memReqSvr;
   }
 
+  //**STATIC METHODS*****************************************
+
   /**
    * Check the requested offset and length against the allocated size.
    * The invariants equation is: {@code 0 <= reqOff <= reqLen <= reqOff + reqLen <= allocSize}.
@@ -112,9 +122,9 @@ abstract class BaseStateImpl implements BaseState {
   }
 
   static void checkJavaVersion(final String jdkVer, final int p0) {
-    if ( p0 != 17 ) {
-      throw new IllegalArgumentException(
-          "Unsupported JDK Major Version, must be 17; " + jdkVer);
+    boolean ok = p0 == 17;
+    if (!ok) { throw new IllegalArgumentException(
+        "Unsupported JDK Major Version, must be 17; " + jdkVer);
     }
   }
 
@@ -127,7 +137,7 @@ abstract class BaseStateImpl implements BaseState {
   static int[] parseJavaVersion(final String jdkVer) {
     final int p0, p1;
     try {
-      String[] parts = jdkVer.trim().split("\\.");//grab only number groups and "."
+      String[] parts = jdkVer.trim().split("^0-9\\.");//grab only number groups and "."
       parts = parts[0].split("\\."); //split out the number groups
       p0 = Integer.parseInt(parts[0]); //the first number group
       p1 = (parts.length > 1) ? Integer.parseInt(parts[1]) : 0; //2nd number group, or 0
@@ -138,50 +148,6 @@ abstract class BaseStateImpl implements BaseState {
     return new int[] {p0, p1};
   }
 
-  /**
-   * Decodes the resource type. This is primarily for debugging.
-   * @param typeId the given typeId
-   * @return a human readable string.
-   */
-  static final String typeDecode(final int typeId) {
-    final StringBuilder sb = new StringBuilder();
-    final int group1 = typeId & 0x7;
-    switch (group1) {
-      case 0 : sb.append("Writable:\t"); break;
-      case 1 : sb.append("ReadOnly:\t"); break;
-      case 2 : sb.append("Writable:\tRegion:\t"); break;
-      case 3 : sb.append("ReadOnly:\tRegion:\t"); break;
-      case 4 : sb.append("Writable:\tDuplicate:\t"); break;
-      case 5 : sb.append("ReadOnly:\tDuplicate:\t"); break;
-      case 6 : sb.append("Writable:\tRegion:\tDuplicate:\t"); break;
-      case 7 : sb.append("ReadOnly:\tRegion:\tDuplicate:\t"); break;
-      default: break;
-    }
-    final int group2 = (typeId >>> 3) & 0x3;
-    switch (group2) {
-      case 0 : sb.append("Heap:\t"); break;
-      case 1 : sb.append("Direct:\t"); break;
-      case 2 : sb.append("Map:\t"); break;
-      case 3 : sb.append("Direct:\tMap:\t"); break;
-      default: break;
-    }
-    if ((typeId & BYTEBUF) > 0) { sb.append("ByteBuffer:\t"); }
-
-    final int group3 = (typeId >>> 5) & 0x1;
-    switch (group3) {
-      case 0 : sb.append("NativeOrder:\t"); break;
-      case 1 : sb.append("NonNativeOrder:\t"); break;
-      default: break;
-    }
-    final int group4 = (typeId >>> 6) & 0x1;
-    switch (group4) {
-      case 0 : sb.append("Memory"); break;
-      case 1 : sb.append("Buffer"); break;
-      default: break;
-    }
-    return sb.toString();
-  }
-
   static final WritableBuffer selectBuffer(
       final MemorySegment segment,
       final int type,
@@ -267,13 +233,65 @@ abstract class BaseStateImpl implements BaseState {
     return sb.toString();
   }
 
+  /**
+   * Decodes the resource type. This is primarily for debugging.
+   * @param typeId the given typeId
+   * @return a human readable string.
+   */
+  static final String typeDecode(final int typeId) {
+    final StringBuilder sb = new StringBuilder();
+    final int group1 = typeId & 0x7;
+    switch (group1) { // 0000 0XXX
+      case 0 : sb.append("Writable:\t"); break;
+      case 1 : sb.append("ReadOnly:\t"); break;
+      case 2 : sb.append("Writable:\tRegion:\t"); break;
+      case 3 : sb.append("ReadOnly:\tRegion:\t"); break;
+      case 4 : sb.append("Writable:\tDuplicate:\t"); break;
+      case 5 : sb.append("ReadOnly:\tDuplicate:\t"); break;
+      case 6 : sb.append("Writable:\tRegion:\tDuplicate:\t"); break;
+      case 7 : sb.append("ReadOnly:\tRegion:\tDuplicate:\t"); break;
+      default: break;
+    }
+    final int group2 = (typeId >>> 3) & 0x3;
+    switch (group2) { // 000X X000
+      case 0 : sb.append("Heap:\t"); break;
+      case 1 : sb.append("Direct:\t"); break;
+      case 2 : sb.append("Map:\t"); break;
+      case 3 : sb.append("Direct:\tMap:\t"); break;
+      default: break;
+    }
+    if ((typeId & BYTEBUF) > 0) { sb.append("ByteBuffer:\t"); }
+
+    final int group3 = (typeId >>> 5) & 0x1;
+    switch (group3) { // 00X0 0000
+      case 0 : sb.append("NativeOrder:\t"); break;
+      case 1 : sb.append("NonNativeOrder:\t"); break;
+      default: break;
+    }
+    final int group4 = (typeId >>> 6) & 0x1;
+    switch (group4) { // 0X00 0000
+      case 0 : sb.append("Memory:\t"); break;
+      case 1 : sb.append("Buffer:\t"); break;
+      default: break;
+    }
+    final int group5 = (typeId >>> 7) & 0x1;
+    switch (group5) { // X000 0000
+      case 0 : sb.append(""); break;
+      case 1 : sb.append("ByteBuffer"); break;
+      default: break;
+    }
+    return sb.toString();
+  }
+
+  //**NON STATIC METHODS*****************************************
+
   @Override
   public final ByteBuffer asByteBufferView(final ByteOrder order) {
     final ByteBuffer byteBuf = seg.asByteBuffer().order(order);
     return byteBuf;
   }
 
-  @SuppressWarnings("resource")
+  //@SuppressWarnings("resource")
   @Override
   public void close() {
     if (seg != null && seg.scope().isAlive() && !seg.scope().isImplicit()) {
@@ -299,13 +317,13 @@ abstract class BaseStateImpl implements BaseState {
   }
 
   @Override
-  public MemoryRequestServer getMemoryRequestServer() {
-    return memReqSvr;
+  public final ByteOrder getByteOrder() {
+    return (typeId & NONNATIVE) > 0 ? NON_NATIVE_BYTE_ORDER : NATIVE_BYTE_ORDER;
   }
 
   @Override
-  public final ByteOrder getByteOrder() {
-    return (typeId & NONNATIVE) > 0 ? NON_NATIVE_BYTE_ORDER : ByteOrder.nativeOrder();
+  public MemoryRequestServer getMemoryRequestServer() {
+    return memReqSvr;
   }
 
   @Override
@@ -318,19 +336,19 @@ abstract class BaseStateImpl implements BaseState {
     return memReqSvr != null;
   }
 
-  @SuppressWarnings("resource")
+  //@SuppressWarnings("resource")
   @Override
   public boolean isAlive() { return seg.scope().isAlive(); }
 
   @Override
-  public final boolean isByteOrderCompatible(final ByteOrder byteOrder) {
-    final ByteOrder typeBO = getByteOrder();
-    return typeBO == ByteOrder.nativeOrder() && typeBO == byteOrder;
+  public final boolean isBuffer() {
+    return (typeId & BUFFER) > 0;
   }
 
   @Override
-  public final boolean isBuffer() {
-    return (typeId & BUFFER) > 0;
+  public final boolean isByteOrderCompatible(final ByteOrder byteOrder) {
+    final ByteOrder typeBO = getByteOrder();
+    return typeBO == ByteOrder.nativeOrder() && typeBO == byteOrder;
   }
 
   @Override
diff --git a/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/BaseWritableBufferImpl.java b/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/BaseWritableBufferImpl.java
index 7b7ffa9..a92e75c 100644
--- a/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/BaseWritableBufferImpl.java
+++ b/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/BaseWritableBufferImpl.java
@@ -19,8 +19,6 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
-
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.util.Objects;
diff --git a/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/BaseWritableMemoryImpl.java b/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/BaseWritableMemoryImpl.java
index 586e3ac..8b07ab9 100644
--- a/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/BaseWritableMemoryImpl.java
+++ b/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/BaseWritableMemoryImpl.java
@@ -21,7 +21,6 @@ package org.apache.datasketches.memory.internal;
 
 import static java.nio.channels.FileChannel.MapMode.READ_ONLY;
 import static java.nio.channels.FileChannel.MapMode.READ_WRITE;
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -123,7 +122,7 @@ public abstract class BaseWritableMemoryImpl extends BaseStateImpl implements Wr
 
   //MAP FILE RESOURCE
 
-  @SuppressWarnings("resource")
+  //@SuppressWarnings("resource")
   public static WritableMemory wrapMap(
       final File file,
       final long fileOffsetBytes,
@@ -162,7 +161,7 @@ public abstract class BaseWritableMemoryImpl extends BaseStateImpl implements Wr
    * This is a callback mechanism for a user client of direct memory to request more memory.
    * @return WritableMemory
    */
-  @SuppressWarnings("resource")
+  //@SuppressWarnings("resource")
   public static WritableMemory wrapDirect(
       final long capacityBytes,
       final long alignmentBytes,
@@ -279,7 +278,7 @@ public abstract class BaseWritableMemoryImpl extends BaseStateImpl implements Wr
     return MemoryAccess.getByteAtOffset(seg, offsetBytes);
   }
 
-  @Override //fundamental limitation of MemorySegment in Java17
+  @Override //Efficient handling of arrays is fundamental limitation of MemorySegment in Java17
   public final void getByteArray(final long offsetBytes, final byte[] dstArray,
       final int dstOffsetBytes, final int lengthBytes) {
     checkBounds(dstOffsetBytes, lengthBytes, dstArray.length);
diff --git a/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/NonNativeWritableBufferImpl.java b/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/NonNativeWritableBufferImpl.java
index 092ef89..a27878e 100644
--- a/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/NonNativeWritableBufferImpl.java
+++ b/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/NonNativeWritableBufferImpl.java
@@ -19,9 +19,6 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
-
 import org.apache.datasketches.memory.MemoryRequestServer;
 import org.apache.datasketches.memory.WritableBuffer;
 
diff --git a/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImpl.java b/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImpl.java
index d8254be..c699e8e 100644
--- a/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImpl.java
+++ b/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImpl.java
@@ -19,9 +19,6 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
-
 import org.apache.datasketches.memory.MemoryRequestServer;
 import org.apache.datasketches.memory.WritableMemory;
 
diff --git a/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/Util.java b/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/Util.java
index f0d2b87..27e2fac 100644
--- a/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/Util.java
+++ b/datasketches-memory-java17/src/main/java17/org/apache/datasketches/memory/internal/Util.java
@@ -19,12 +19,13 @@
 
 package org.apache.datasketches.memory.internal;
 
+import static org.apache.datasketches.memory.internal.BaseStateImpl.LS;
+
 import java.io.File;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
-import java.nio.ByteOrder;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.Objects;
@@ -35,16 +36,6 @@ import java.util.Objects;
 //@SuppressWarnings("javadoc")
 final class Util {
 
-  /**
-   * The java line separator character as a String.
-   */
-  static final String LS = System.getProperty("line.separator");
-
-  static final ByteOrder NATIVE_BYTE_ORDER = ByteOrder.nativeOrder();
-  static final ByteOrder NON_NATIVE_BYTE_ORDER =
-      (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
-
-
   private Util() { }
 
   /**
diff --git a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/AllocateDirectMapMemoryTest.java b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/AllocateDirectMapMemoryTest.java
index c29a551..1cf8378 100644
--- a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/AllocateDirectMapMemoryTest.java
+++ b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/AllocateDirectMapMemoryTest.java
@@ -23,7 +23,7 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.LS;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.LS;
 import static org.apache.datasketches.memory.internal.Util.getResourceFile;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
diff --git a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/AllocateDirectMemoryTest.java b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/AllocateDirectMemoryTest.java
index 2c234e7..0032059 100644
--- a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/AllocateDirectMemoryTest.java
+++ b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/AllocateDirectMemoryTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NON_NATIVE_BYTE_ORDER;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
diff --git a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/AllocateDirectWritableMapMemoryTest.java b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/AllocateDirectWritableMapMemoryTest.java
index 89cf2fb..1a8d6fa 100644
--- a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/AllocateDirectWritableMapMemoryTest.java
+++ b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/AllocateDirectWritableMapMemoryTest.java
@@ -24,8 +24,8 @@
 package org.apache.datasketches.memory.internal;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.apache.datasketches.memory.internal.Util.LS;
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.LS;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NON_NATIVE_BYTE_ORDER;
 import static org.apache.datasketches.memory.internal.Util.getResourceFile;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
diff --git a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/BaseStateTest.java b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/BaseStateTest.java
index d4c0bbf..181afc2 100644
--- a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/BaseStateTest.java
+++ b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/BaseStateTest.java
@@ -19,6 +19,8 @@
 
 package org.apache.datasketches.memory.internal;
 
+import static org.apache.datasketches.memory.internal.BaseStateImpl.nativeOverlap;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.typeDecode;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
@@ -39,36 +41,36 @@ public class BaseStateTest {
   public void checkNativeOverlap() {
     MemorySegment par = MemorySegment.allocateNative(100, ResourceScope.newImplicitScope());
     //Equal sizes
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par,  0, 20), getSeg(par, 40, 60)),   0);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par,  0, 20), getSeg(par, 20, 40)),   0);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par,  0, 20), getSeg(par,  0, 20)),  20);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par,  0, 20), getSeg(par, 10, 30)),  10);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par, 10, 30), getSeg(par,  0, 20)), -10);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par, 20, 40), getSeg(par,  0, 20)),   0);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par,  0,  0), getSeg(par,  0,  0)),   0);
+    assertEquals(nativeOverlap(getSeg(par,  0, 20), getSeg(par, 40, 60)),   0);
+    assertEquals(nativeOverlap(getSeg(par,  0, 20), getSeg(par, 20, 40)),   0);
+    assertEquals(nativeOverlap(getSeg(par,  0, 20), getSeg(par,  0, 20)),  20);
+    assertEquals(nativeOverlap(getSeg(par,  0, 20), getSeg(par, 10, 30)),  10);
+    assertEquals(nativeOverlap(getSeg(par, 10, 30), getSeg(par,  0, 20)), -10);
+    assertEquals(nativeOverlap(getSeg(par, 20, 40), getSeg(par,  0, 20)),   0);
+    assertEquals(nativeOverlap(getSeg(par,  0,  0), getSeg(par,  0,  0)),   0);
     //Unequal Sizes A > B
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par,  0, 40), getSeg(par, 60, 80)),   0);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par,  0, 40), getSeg(par, 40, 60)),   0);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par,  0, 40), getSeg(par, 30, 50)),  10);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par,  0, 40), getSeg(par, 20, 40)),  20);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par,  0, 40), getSeg(par, 10, 30)),  20);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par,  0, 40), getSeg(par,  0, 20)),  20);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par, 10, 50), getSeg(par,  0, 20)), -10);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par, 20, 60), getSeg(par,  0, 20)),   0);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par, 40, 80), getSeg(par,  0, 20)),   0);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par, 40, 80), getSeg(par,  0,  0)),   0);
+    assertEquals(nativeOverlap(getSeg(par,  0, 40), getSeg(par, 60, 80)),   0);
+    assertEquals(nativeOverlap(getSeg(par,  0, 40), getSeg(par, 40, 60)),   0);
+    assertEquals(nativeOverlap(getSeg(par,  0, 40), getSeg(par, 30, 50)),  10);
+    assertEquals(nativeOverlap(getSeg(par,  0, 40), getSeg(par, 20, 40)),  20);
+    assertEquals(nativeOverlap(getSeg(par,  0, 40), getSeg(par, 10, 30)),  20);
+    assertEquals(nativeOverlap(getSeg(par,  0, 40), getSeg(par,  0, 20)),  20);
+    assertEquals(nativeOverlap(getSeg(par, 10, 50), getSeg(par,  0, 20)), -10);
+    assertEquals(nativeOverlap(getSeg(par, 20, 60), getSeg(par,  0, 20)),   0);
+    assertEquals(nativeOverlap(getSeg(par, 40, 80), getSeg(par,  0, 20)),   0);
+    assertEquals(nativeOverlap(getSeg(par, 40, 80), getSeg(par,  0,  0)),   0);
 
     //Unequal Sizes B > A
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par, 60, 80), getSeg(par,  0, 40)),   0);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par, 40, 60), getSeg(par,  0, 40)),   0);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par, 30, 50), getSeg(par,  0, 40)), -10);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par, 20, 40), getSeg(par,  0, 40)), -20);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par, 10, 30), getSeg(par,  0, 40)), -20);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par,  0, 20), getSeg(par,  0, 40)),  20);
-    assertEquals(BaseStateImpl.nativeOverlap( getSeg(par, 0, 20), getSeg(par, 10, 50)),  10);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par,  0, 20), getSeg(par, 20, 60)),   0);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par,  0, 20), getSeg(par, 40, 80)),   0);
-    assertEquals(BaseStateImpl.nativeOverlap(getSeg(par,  0,  0), getSeg(par, 40, 80)),   0);
+    assertEquals(nativeOverlap(getSeg(par, 60, 80), getSeg(par,  0, 40)),   0);
+    assertEquals(nativeOverlap(getSeg(par, 40, 60), getSeg(par,  0, 40)),   0);
+    assertEquals(nativeOverlap(getSeg(par, 30, 50), getSeg(par,  0, 40)), -10);
+    assertEquals(nativeOverlap(getSeg(par, 20, 40), getSeg(par,  0, 40)), -20);
+    assertEquals(nativeOverlap(getSeg(par, 10, 30), getSeg(par,  0, 40)), -20);
+    assertEquals(nativeOverlap(getSeg(par,  0, 20), getSeg(par,  0, 40)),  20);
+    assertEquals(nativeOverlap( getSeg(par, 0, 20), getSeg(par, 10, 50)),  10);
+    assertEquals(nativeOverlap(getSeg(par,  0, 20), getSeg(par, 20, 60)),   0);
+    assertEquals(nativeOverlap(getSeg(par,  0, 20), getSeg(par, 40, 80)),   0);
+    assertEquals(nativeOverlap(getSeg(par,  0,  0), getSeg(par, 40, 80)),   0);
   }
 
   private static MemorySegment getSeg(MemorySegment parent, long left, long right) {
@@ -101,7 +103,7 @@ public class BaseStateTest {
   @Test
   public void checkTypeDecode() {
     for (int i = 0; i < 256; i++) {
-      String str = BaseStateImpl.typeDecode(i);
+      String str = typeDecode(i);
       println(i + "\t" + str);
     }
   }
diff --git a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/BufferTest.java b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/BufferTest.java
index 5727ef3..1f4a940 100644
--- a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/BufferTest.java
+++ b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/BufferTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NON_NATIVE_BYTE_ORDER;
 import static org.testng.Assert.assertEquals;
 
 import java.nio.ByteBuffer;
diff --git a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/LeafImplTest.java b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/LeafImplTest.java
index 73d5540..59f3f66 100644
--- a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/LeafImplTest.java
+++ b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/LeafImplTest.java
@@ -19,8 +19,8 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NON_NATIVE_BYTE_ORDER;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
diff --git a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/MemoryTest.java b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/MemoryTest.java
index 9a52298..94da3ec 100644
--- a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/MemoryTest.java
+++ b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/MemoryTest.java
@@ -23,9 +23,9 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.LS;
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.LS;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NON_NATIVE_BYTE_ORDER;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
diff --git a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/NativeWritableBufferImplTest.java b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/NativeWritableBufferImplTest.java
index 2a4c751..dd4d398 100644
--- a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/NativeWritableBufferImplTest.java
+++ b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/NativeWritableBufferImplTest.java
@@ -19,7 +19,8 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.checkBounds;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
@@ -354,7 +355,7 @@ public class NativeWritableBufferImplTest {
 
   @Test
   public void checkGoodBounds() {
-   BaseStateImpl.checkBounds(50, 50, 100);
+   checkBounds(50, 50, 100);
   }
 
   @Test
diff --git a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/NativeWritableMemoryImplTest.java b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/NativeWritableMemoryImplTest.java
index 139dfd5..9c56ab6 100644
--- a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/NativeWritableMemoryImplTest.java
+++ b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/NativeWritableMemoryImplTest.java
@@ -19,7 +19,8 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.checkBounds;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
@@ -541,7 +542,7 @@ public class NativeWritableMemoryImplTest {
 
   @Test
   public void checkGoodBounds() {
-    BaseStateImpl.checkBounds(50, 50, 100);
+    checkBounds(50, 50, 100);
   }
 
   @Test
@@ -570,7 +571,7 @@ public class NativeWritableMemoryImplTest {
     assertEquals(comp, 0);
     comp = mem3.compareTo(0, 4, mem4, 1, 4);
     assertEquals(comp, -1);
-    BaseStateImpl.checkBounds(0, 5, mem3.getCapacity());
+    checkBounds(0, 5, mem3.getCapacity());
   }
 
   @Test
diff --git a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/SpecificLeafTest.java b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/SpecificLeafTest.java
index 993cb4b..6c6bcf7 100644
--- a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/SpecificLeafTest.java
+++ b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/SpecificLeafTest.java
@@ -19,8 +19,8 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NON_NATIVE_BYTE_ORDER;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
@@ -49,16 +49,16 @@ public class SpecificLeafTest {
   public void checkByteBufferLeafs() {
     int bytes = 128;
     ByteBuffer bb = ByteBuffer.allocate(bytes);
-    bb.order(ByteOrder.nativeOrder());
+    bb.order(NATIVE_BYTE_ORDER);
 
-    Memory mem = Memory.wrap(bb).region(0, bytes, ByteOrder.nativeOrder());
+    Memory mem = Memory.wrap(bb).region(0, bytes, NATIVE_BYTE_ORDER);
     assertTrue(mem.hasByteBuffer());
     assertTrue(mem.isReadOnly());
     assertTrue(mem.isMemory());
     assertFalse(mem.isDirect());
     assertFalse(mem.isMapped());
     checkCrossLeafTypeIds(mem);
-    Buffer buf = mem.asBuffer().region(0, bytes, ByteOrder.nativeOrder());
+    Buffer buf = mem.asBuffer().region(0, bytes, NATIVE_BYTE_ORDER);
     assertEquals(buf.getByteOrder(), NATIVE_BYTE_ORDER);
 
     bb.order(NON_NATIVE_BYTE_ORDER);
diff --git a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/UtilTest.java b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/UtilTest.java
index 7a34b9c..bfe30ad 100644
--- a/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/UtilTest.java
+++ b/datasketches-memory-java17/src/test/java17/org/apache/datasketches/memory/internal/UtilTest.java
@@ -23,7 +23,7 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.LS;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.LS;
 import static org.apache.datasketches.memory.internal.Util.getResourceBytes;
 import static org.apache.datasketches.memory.internal.Util.getResourceFile;
 import static org.testng.Assert.assertTrue;
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/BaseState.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/BaseState.java
index 4f6a376..bf0127f 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/BaseState.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/BaseState.java
@@ -22,8 +22,6 @@ package org.apache.datasketches.memory;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 
-import org.apache.datasketches.memory.internal.BaseStateImpl;
-
 /**
  * Keeps key configuration state for Memory and Buffer plus some common static variables
  * and check methods.
@@ -91,6 +89,7 @@ public interface BaseState {
   /**
    * Returns true if the backing resource is direct (off-heap) memory.
    * This is the case for allocated direct memory, memory mapped files,
+   * or from a wrapped ByteBuffer that was allocated direct.
    * @return true if the backing resource is direct (off-heap) memory.
    */
   boolean isDirect();
@@ -179,46 +178,6 @@ public interface BaseState {
   @Deprecated
   long getCumulativeOffset(long offsetBytes);
 
-  /**
-   * Gets the current size of active direct memory allocated.
-   * @return the current size of active direct memory allocated.
-   * @deprecated no longer supported for Java 17 versions.
-   */
-  @Deprecated
-  static long getCurrentDirectMemoryAllocated() {
-    return BaseStateImpl.getCurrentDirectMemoryAllocated();
-  }
-
-  /**
-   * Gets the current number of active direct memory allocations.
-   * @return the current number of active direct memory allocations.
-   * @deprecated no longer supported for Java 17 versions.
-   */
-  @Deprecated
-  static long getCurrentDirectMemoryAllocations() {
-    return BaseStateImpl.getCurrentDirectMemoryAllocations();
-  }
-
-  /**
-   * Gets the current size of active direct memory map allocated.
-   * @return the current size of active direct memory map allocated.
-   * @deprecated no longer supported for Java 17 versions.
-   */
-  @Deprecated
-  static long getCurrentDirectMemoryMapAllocated() {
-    return BaseStateImpl.getCurrentDirectMemoryMapAllocated();
-  }
-
-  /**
-   * Gets the current number of active direct memory map allocations.
-   * @return the current number of active direct memory map allocations.
-   * @deprecated no longer supported for Java 17 versions.
-   */
-  @Deprecated
-  static long getCurrentDirectMemoryMapAllocations() {
-    return BaseStateImpl.getCurrentDirectMemoryMapAllocations();
-  }
-
   /**
    * Returns the offset of address zero of this object relative to the address zero of the
    * backing resource but not including the size of any Java object header.
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/Memory.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/Memory.java
index 414cdc9..9f674eb 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/Memory.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/Memory.java
@@ -19,7 +19,8 @@
 
 package org.apache.datasketches.memory;
 
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.checkBounds;
 import static org.apache.datasketches.memory.internal.Util.negativeCheck;
 
 import java.io.File;
@@ -31,7 +32,6 @@ import java.util.Objects;
 
 import org.apache.datasketches.memory.internal.BaseWritableMemoryImpl;
 import org.apache.datasketches.memory.internal.Prim;
-import org.apache.datasketches.memory.internal.UnsafeUtil;
 
 /**
  * Defines the read-only API for offset access to a resource.
@@ -195,7 +195,7 @@ public interface Memory extends BaseState {
     Objects.requireNonNull(byteOrder, "byteOrder must be non-null");
     negativeCheck(offsetBytes, "offsetBytes");
     negativeCheck(lengthBytes, "lengthBytes");
-    UnsafeUtil.checkBounds(offsetBytes, lengthBytes, array.length);
+    checkBounds(offsetBytes, lengthBytes, array.length);
     return BaseWritableMemoryImpl.wrapHeapArray(array, 0, lengthBytes, true, NATIVE_BYTE_ORDER, null);
   }
 
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/WritableBuffer.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/WritableBuffer.java
index 965ae16..bc5671e 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/WritableBuffer.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/WritableBuffer.java
@@ -19,7 +19,7 @@
 
 package org.apache.datasketches.memory;
 
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
 
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/WritableMemory.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/WritableMemory.java
index 47b4684..db987c4 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/WritableMemory.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/WritableMemory.java
@@ -19,7 +19,8 @@
 
 package org.apache.datasketches.memory;
 
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.checkBounds;
 import static org.apache.datasketches.memory.internal.Util.negativeCheck;
 
 import java.io.File;
@@ -29,7 +30,6 @@ import java.util.Objects;
 
 import org.apache.datasketches.memory.internal.BaseWritableMemoryImpl;
 import org.apache.datasketches.memory.internal.Prim;
-import org.apache.datasketches.memory.internal.UnsafeUtil;
 
 /**
  * Defines the writable API for offset access to a resource.
@@ -318,7 +318,7 @@ public interface WritableMemory extends Memory {
     Objects.requireNonNull(byteOrder, "byteOrder must be non-null");
     negativeCheck(offsetBytes, "offsetBytes");
     negativeCheck(lengthBytes, "lengthBytes");
-    UnsafeUtil.checkBounds(offsetBytes, lengthBytes, array.length);
+    checkBounds(offsetBytes, lengthBytes, array.length);
     return BaseWritableMemoryImpl.wrapHeapArray(array, offsetBytes, lengthBytes, false, byteOrder, memReqSvr);
   }
 
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/AllocateDirect.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/AllocateDirect.java
index ae649ef..64fe4fa 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/AllocateDirect.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/AllocateDirect.java
@@ -19,6 +19,7 @@
 
 package org.apache.datasketches.memory.internal;
 
+import static org.apache.datasketches.memory.internal.BaseStateImpl.reachabilityFence;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.unsafe;
 
 import java.util.logging.Logger;
@@ -79,7 +80,7 @@ final class AllocateDirect {
       }
       return false;
     } finally {
-      BaseStateImpl.reachabilityFence(this);
+      reachabilityFence(this);
     }
   }
 
@@ -99,8 +100,6 @@ final class AllocateDirect {
     private final StepBoolean valid = new StepBoolean(true); //only place for this
 
     Deallocator(final long nativeAddress, final long allocationSize, final long capacity) {
-      BaseStateImpl.currentDirectMemoryAllocations_.incrementAndGet();
-      BaseStateImpl.currentDirectMemoryAllocated_.addAndGet(capacity);
       this.nativeAddress = nativeAddress;
       this.allocationSize = allocationSize;
       this.capacity = capacity;
@@ -124,8 +123,6 @@ final class AllocateDirect {
         }
         unsafe.freeMemory(nativeAddress);
         NioBits.unreserveMemory(allocationSize, capacity);
-        BaseStateImpl.currentDirectMemoryAllocations_.decrementAndGet();
-        BaseStateImpl.currentDirectMemoryAllocated_.addAndGet(-capacity);
         return true;
       }
       return false;
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/AllocateDirectMap.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/AllocateDirectMap.java
index 6126fac..a69f958 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/AllocateDirectMap.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/AllocateDirectMap.java
@@ -19,6 +19,7 @@
 
 package org.apache.datasketches.memory.internal;
 
+import static org.apache.datasketches.memory.internal.BaseStateImpl.reachabilityFence;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.unsafe;
 
 import java.io.File;
@@ -170,7 +171,7 @@ class AllocateDirectMap implements Map {
     } catch (final Exception e) {
         throw new MemoryCloseException(resource);
     } finally {
-      BaseStateImpl.reachabilityFence(this);
+      reachabilityFence(this);
     }
   }
 
@@ -260,8 +261,6 @@ class AllocateDirectMap implements Map {
 
     Deallocator(final long nativeBaseOffset, final long capacityBytes,
         final RandomAccessFile raf) {
-      BaseStateImpl.currentDirectMemoryMapAllocations_.incrementAndGet();
-      BaseStateImpl.currentDirectMemoryMapAllocated_.addAndGet(capacityBytes);
       myRaf = raf;
       assert myRaf != null;
       myFc = myRaf.getChannel();
@@ -286,13 +285,7 @@ class AllocateDirectMap implements Map {
           // Warn about non-deterministic resource cleanup.
           LOG.warning("A WritableMapHandleImpl was not closed manually");
         }
-        try {
-          unmap();
-        }
-        finally {
-          BaseStateImpl.currentDirectMemoryMapAllocations_.decrementAndGet();
-          BaseStateImpl.currentDirectMemoryMapAllocated_.addAndGet(-myCapacity);
-        }
+        unmap();
         return true;
       }
       return false;
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseStateImpl.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseStateImpl.java
index 83b8f64..54bcc25 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseStateImpl.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseStateImpl.java
@@ -19,16 +19,10 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.UnsafeUtil.assertBounds;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.checkBounds;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.unsafe;
-import static org.apache.datasketches.memory.internal.Util.LS;
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
 
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
-import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.datasketches.memory.BaseState;
 import org.apache.datasketches.memory.MemoryRequestServer;
@@ -42,12 +36,18 @@ import org.apache.datasketches.memory.ReadOnlyException;
  */
 @SuppressWarnings("restriction")
 public abstract class BaseStateImpl implements BaseState {
-
-  //Monitoring
-  static final AtomicLong currentDirectMemoryAllocations_ = new AtomicLong();
-  static final AtomicLong currentDirectMemoryAllocated_ = new AtomicLong();
-  static final AtomicLong currentDirectMemoryMapAllocations_ = new AtomicLong();
-  static final AtomicLong currentDirectMemoryMapAllocated_ = new AtomicLong();
+  static final String JDK; //must be at least "1.8"
+  static final int JDK_MAJOR; //8, 11, 17, etc
+
+  //Used to convert "type" to bytes:  bytes = longs << LONG_SHIFT
+  static final int BOOLEAN_SHIFT    = 0;
+  static final int BYTE_SHIFT       = 0;
+  static final long SHORT_SHIFT     = 1;
+  static final long CHAR_SHIFT      = 1;
+  static final long INT_SHIFT       = 2;
+  static final long LONG_SHIFT      = 3;
+  static final long FLOAT_SHIFT     = 2;
+  static final long DOUBLE_SHIFT    = 3;
 
   //class type IDs. Do not change the bit orders
   //The first 3 bits are set dynamically
@@ -56,12 +56,12 @@ public abstract class BaseStateImpl implements BaseState {
   static final int REGION = 2;
   static final int DUPLICATE = 4;
 
-  //The following 4 bits are set by the 16 leaf nodes
+  //The following 5 bits are set by the 16 leaf nodes
   // 000X X000
   static final int HEAP = 0;
   static final int DIRECT = 1 << 3;
   static final int MAP = 2 << 3;
-  static final int BYTEBUF = 3 << 3;
+
 
   // 00X0 0000
   static final int NATIVE = 0;
@@ -71,6 +71,26 @@ public abstract class BaseStateImpl implements BaseState {
   static final int MEMORY = 0;
   static final int BUFFER = 1 << 6;
 
+  // X000 0000
+  static final int BYTEBUF = 1 << 7;
+
+  /**
+   * The java line separator character as a String.
+   */
+  static final String LS = System.getProperty("line.separator");
+
+  public static final ByteOrder NATIVE_BYTE_ORDER = ByteOrder.nativeOrder();
+
+  static final ByteOrder NON_NATIVE_BYTE_ORDER =
+      (NATIVE_BYTE_ORDER == ByteOrder.LITTLE_ENDIAN) ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
+
+  static {
+    final String jdkVer = System.getProperty("java.version");
+    final int[] p = parseJavaVersion(jdkVer);
+    JDK = p[0] + "." + p[1];
+    JDK_MAJOR = (p[0] == 1) ? p[1] : p[0];
+  }
+
   private final long capacityBytes_;
 
   /**
@@ -81,7 +101,7 @@ public abstract class BaseStateImpl implements BaseState {
   private final long cumBaseOffset_;
 
   /**
-   *
+   * Constructor
    * @param unsafeObj The primitive backing array. It may be null. Used by Unsafe calls.
    * @param nativeBaseOffset The off-heap memory address including DirectByteBuffer split offsets.
    * @param regionOffset This offset defines address zero of this object (usually a region)
@@ -99,9 +119,44 @@ public abstract class BaseStateImpl implements BaseState {
         : UnsafeUtil.getArrayBaseOffset(unsafeObj.getClass()));
   }
 
-  @Override
-  public final ByteOrder getByteOrder() {
-    return isNonNativeType() ? NON_NATIVE_BYTE_ORDER : NATIVE_BYTE_ORDER;
+  //**STATIC METHODS*****************************************
+
+  /**
+   * Assert the requested offset and length against the allocated size.
+   * The invariants equation is: {@code 0 <= reqOff <= reqLen <= reqOff + reqLen <= allocSize}.
+   * If this equation is violated and assertions are enabled, an {@link AssertionError} will
+   * be thrown.
+   * @param reqOff the requested offset
+   * @param reqLen the requested length
+   * @param allocSize the allocated size.
+   */
+  public static void assertBounds(final long reqOff, final long reqLen, final long allocSize) {
+    assert ((reqOff | reqLen | (reqOff + reqLen) | (allocSize - (reqOff + reqLen))) >= 0) :
+      "reqOffset: " + reqOff + ", reqLength: " + reqLen
+      + ", (reqOff + reqLen): " + (reqOff + reqLen) + ", allocSize: " + allocSize;
+  }
+
+  /**
+   * Check the requested offset and length against the allocated size.
+   * The invariants equation is: {@code 0 <= reqOff <= reqLen <= reqOff + reqLen <= allocSize}.
+   * If this equation is violated an {@link IllegalArgumentException} will be thrown.
+   * @param reqOff the requested offset
+   * @param reqLen the requested length
+   * @param allocSize the allocated size.
+   */
+  public static void checkBounds(final long reqOff, final long reqLen, final long allocSize) {
+    if ((reqOff | reqLen | (reqOff + reqLen) | (allocSize - (reqOff + reqLen))) < 0) {
+      throw new IllegalArgumentException(
+          "reqOffset: " + reqOff + ", reqLength: " + reqLen
+              + ", (reqOff + reqLen): " + (reqOff + reqLen) + ", allocSize: " + allocSize);
+    }
+  }
+
+  static void checkJavaVersion(final String jdkVer, final int p0, final int p1 ) {
+    boolean ok = ((p0 == 1) && (p1 == 8)) || (p0 == 8) || (p0 == 11);
+    if (!ok) { throw new IllegalArgumentException(
+        "Unsupported JDK Major Version. It must be one of 1.8, 8, 11: " + jdkVer);
+    }
   }
 
   /**
@@ -109,17 +164,191 @@ public abstract class BaseStateImpl implements BaseState {
    * @param byteOrder the given byte order
    * @return true if the given byteOrder is the same as the native byte order.
    */
-  public static boolean isNativeByteOrder(final ByteOrder byteOrder) {
+  static boolean isNativeByteOrder(final ByteOrder byteOrder) {
     if (byteOrder == null) {
       throw new IllegalArgumentException("ByteOrder parameter cannot be null.");
     }
     return NATIVE_BYTE_ORDER == byteOrder;
   }
 
+  /**
+   * Returns first two number groups of the java version string.
+   * @param jdkVer the java version string from System.getProperty("java.version").
+   * @return first two number groups of the java version string.
+   * @throws IllegalArgumentException for an improper Java version string.
+   */
+  static int[] parseJavaVersion(final String jdkVer) {
+    final int p0, p1;
+    try {
+      String[] parts = jdkVer.trim().split("^0-9\\.");//grab only number groups and "."
+      parts = parts[0].split("\\."); //split out the number groups
+      p0 = Integer.parseInt(parts[0]); //the first number group
+      p1 = (parts.length > 1) ? Integer.parseInt(parts[1]) : 0; //2nd number group, or 0
+    } catch (final NumberFormatException | ArrayIndexOutOfBoundsException  e) {
+      throw new IllegalArgumentException("Improper Java -version string: " + jdkVer + "\n" + e);
+    }
+    checkJavaVersion(jdkVer, p0, p1);
+    return new int[] {p0, p1};
+  }
+
+  //REACHABILITY FENCE
+  static void reachabilityFence(final Object obj) { }
+
+  final static byte setReadOnlyType(final byte type, final boolean readOnly) {
+    return (byte)((type & ~1) | (readOnly ? READONLY : 0));
+  }
+
+  /**
+   * Returns a formatted hex string of an area of this object.
+   * Used primarily for testing.
+   * @param state the BaseStateImpl
+   * @param preamble a descriptive header
+   * @param offsetBytes offset bytes relative to the MemoryImpl start
+   * @param lengthBytes number of bytes to convert to a hex string
+   * @return a formatted hex string in a human readable array
+   */
+  static final String toHex(final BaseStateImpl state, final String preamble, final long offsetBytes,
+      final int lengthBytes) {
+    final long capacity = state.getCapacity();
+    checkBounds(offsetBytes, lengthBytes, capacity);
+    final StringBuilder sb = new StringBuilder();
+    final Object uObj = state.getUnsafeObject();
+    final String uObjStr;
+    final long uObjHeader;
+    if (uObj == null) {
+      uObjStr = "null";
+      uObjHeader = 0;
+    } else {
+      uObjStr =  uObj.getClass().getSimpleName() + ", " + (uObj.hashCode() & 0XFFFFFFFFL);
+      uObjHeader = UnsafeUtil.getArrayBaseOffset(uObj.getClass());
+    }
+    final ByteBuffer bb = state.getByteBuffer();
+    final String bbStr = bb == null ? "null"
+            : bb.getClass().getSimpleName() + ", " + (bb.hashCode() & 0XFFFFFFFFL);
+    final MemoryRequestServer memReqSvr = state.getMemoryRequestServer();
+    final String memReqStr = memReqSvr != null
+        ? memReqSvr.getClass().getSimpleName() + ", " + (memReqSvr.hashCode() & 0XFFFFFFFFL)
+        : "null";
+    final long cumBaseOffset = state.getCumulativeOffset();
+    sb.append(preamble).append(LS);
+    sb.append("UnsafeObj, hashCode : ").append(uObjStr).append(LS);
+    sb.append("UnsafeObjHeader     : ").append(uObjHeader).append(LS);
+    sb.append("ByteBuf, hashCode   : ").append(bbStr).append(LS);
+    sb.append("RegionOffset        : ").append(state.getRegionOffset()).append(LS);
+    sb.append("Capacity            : ").append(capacity).append(LS);
+    sb.append("CumBaseOffset       : ").append(cumBaseOffset).append(LS);
+    sb.append("MemReq, hashCode    : ").append(memReqStr).append(LS);
+    sb.append("Valid               : ").append(state.isValid()).append(LS);
+    sb.append("Read Only           : ").append(state.isReadOnly()).append(LS);
+    sb.append("Type Byte Order     : ").append(state.getByteOrder().toString()).append(LS);
+    sb.append("Native Byte Order   : ").append(NATIVE_BYTE_ORDER.toString()).append(LS);
+    sb.append("JDK Runtime Version : ").append(JDK).append(LS);
+    //Data detail
+    sb.append("Data, littleEndian  :  0  1  2  3  4  5  6  7");
+
+    for (long i = 0; i < lengthBytes; i++) {
+      final int b = unsafe.getByte(uObj, cumBaseOffset + offsetBytes + i) & 0XFF;
+      if (i % 8 == 0) { //row header
+        sb.append(String.format("%n%20s: ", offsetBytes + i));
+      }
+      sb.append(String.format("%02x ", b));
+    }
+    sb.append(LS);
+
+    return sb.toString();
+  }
+
+  /**
+   * Decodes the resource type. This is primarily for debugging.
+   * @param typeId the given typeId
+   * @return a human readable string.
+   */
+  public static final String typeDecode(final int typeId) {
+    final StringBuilder sb = new StringBuilder();
+    final int group1 = typeId & 0x7;
+    switch (group1) { // 0000 0XXX
+      case 0 : sb.append("Writable:\t"); break;
+      case 1 : sb.append("ReadOnly:\t"); break;
+      case 2 : sb.append("Writable:\tRegion:\t"); break;
+      case 3 : sb.append("ReadOnly:\tRegion:\t"); break;
+      case 4 : sb.append("Writable:\tDuplicate:\t"); break;
+      case 5 : sb.append("ReadOnly:\tDuplicate:\t"); break;
+      case 6 : sb.append("Writable:\tRegion:\tDuplicate:\t"); break;
+      case 7 : sb.append("ReadOnly:\tRegion:\tDuplicate:\t"); break;
+      default: break;
+    }
+    final int group2 = (typeId >>> 3) & 0x3;
+    switch (group2) { // 000X X000
+      case 0 : sb.append("Heap:\t"); break;
+      case 1 : sb.append("Direct:\t"); break;
+      case 2 : sb.append("Map:\t"); break;
+      case 3 : sb.append("Direct:\tMap:\t"); break;
+      default: break;
+    }
+    final int group3 = (typeId >>> 5) & 0x1;
+    switch (group3) { // 00X0 0000
+      case 0 : sb.append("NativeOrder:\t"); break;
+      case 1 : sb.append("NonNativeOrder:\t"); break;
+      default: break;
+    }
+    final int group4 = (typeId >>> 6) & 0x1;
+    switch (group4) { // 0X00 0000
+      case 0 : sb.append("Memory:\t"); break;
+      case 1 : sb.append("Buffer:\t"); break;
+      default: break;
+    }
+    final int group5 = (typeId >>> 7) & 0x1;
+    switch (group5) { // X000 0000
+      case 0 : sb.append(""); break;
+      case 1 : sb.append("ByteBuffer"); break;
+      default: break;
+    }
+    return sb.toString();
+  }
+
+  //**NON STATIC METHODS*****************************************
+
+  final void assertValid() {
+    assert isValid() : "MemoryImpl not valid.";
+  }
+
+  final void assertValidAndBoundsForRead(final long offsetBytes, final long lengthBytes) {
+    assertValid();
+    // capacityBytes_ is intentionally read directly instead of calling getCapacity()
+    // because the later can make JVM to not inline the assert code path (and entirely remove it)
+    // even though it does nothing in production code path.
+    assertBounds(offsetBytes, lengthBytes, capacityBytes_);
+  }
+
+  final void assertValidAndBoundsForWrite(final long offsetBytes, final long lengthBytes) {
+    assertValid();
+    // capacityBytes_ is intentionally read directly instead of calling getCapacity()
+    // because the later can make JVM to not inline the assert code path (and entirely remove it)
+    // even though it does nothing in production code path.
+    assertBounds(offsetBytes, lengthBytes, capacityBytes_);
+    assert !isReadOnly() : "MemoryImpl is read-only.";
+  }
+
+  void checkValid() {
+    if (!isValid()) {
+      throw new IllegalStateException("MemoryImpl not valid.");
+    }
+  }
+
   @Override
-  public final boolean isByteOrderCompatible(final ByteOrder byteOrder) {
-    final ByteOrder typeBO = getByteOrder();
-    return typeBO == NATIVE_BYTE_ORDER && typeBO == byteOrder;
+  public final void checkValidAndBounds(final long offsetBytes, final long lengthBytes) {
+    checkValid();
+    //read capacityBytes_ directly to eliminate extra checkValid() call
+    checkBounds(offsetBytes, lengthBytes, capacityBytes_);
+  }
+
+  final void checkValidAndBoundsForWrite(final long offsetBytes, final long lengthBytes) {
+    checkValid();
+    //read capacityBytes_ directly to eliminate extra checkValid() call
+    checkBounds(offsetBytes, lengthBytes, capacityBytes_);
+    if (isReadOnly()) {
+      throw new ReadOnlyException("MemoryImpl is read-only.");
+    }
   }
 
   @Override
@@ -129,6 +358,11 @@ public abstract class BaseStateImpl implements BaseState {
     return CompareAndCopy.equals(this, thisOffsetBytes, (BaseStateImpl) that, thatOffsetBytes, lengthBytes);
   }
 
+  @Override
+  public final ByteOrder getByteOrder() {
+    return isNonNativeType() ? NON_NATIVE_BYTE_ORDER : NATIVE_BYTE_ORDER;
+  }
+
   //Overridden by ByteBuffer Leafs
   @Override
   public ByteBuffer getByteBuffer() {
@@ -190,26 +424,29 @@ public abstract class BaseStateImpl implements BaseState {
     return getUnsafeObject() != null;
   }
 
+  @Override
+  public final boolean hasByteBuffer() {
+    assertValid();
+    return (getTypeId() & BYTEBUF) > 0;
+  }
+
   @Override
   public final int hashCode() {
     return (int) xxHash64(0, capacityBytes_, 0); //xxHash64() calls checkValid()
   }
 
-  @Override
-  public final long xxHash64(final long offsetBytes, final long lengthBytes, final long seed) {
-    checkValid();
-    return XxHash64.hash(getUnsafeObject(), cumBaseOffset_ + offsetBytes, lengthBytes, seed);
+  final boolean isBBType() {
+    return (getTypeId() & BYTEBUF) > 0;
   }
 
-  @Override
-  public final long xxHash64(final long in, final long seed) {
-    return XxHash64.hash(in, seed);
+  final boolean isBufferType() {
+    return (getTypeId() & BUFFER) > 0;
   }
 
   @Override
-  public final boolean hasByteBuffer() {
-    assertValid();
-    return getByteBuffer() != null;
+  public final boolean isByteOrderCompatible(final ByteOrder byteOrder) {
+    final ByteOrder typeBO = getByteOrder();
+    return typeBO == NATIVE_BYTE_ORDER && typeBO == byteOrder;
   }
 
   @Override
@@ -217,157 +454,62 @@ public abstract class BaseStateImpl implements BaseState {
     return getUnsafeObject() == null;
   }
 
-  @Override
-  public final boolean isReadOnly() {
-    assertValid();
-    return isReadOnlyType();
-  }
-
-  @Override
-  public final boolean isSameResource(final Object that) {
-    checkValid();
-    if (that == null) { return false; }
-    final BaseStateImpl that1 = (BaseStateImpl) that;
-    that1.checkValid();
-    if (this == that1) { return true; }
-
-    return cumBaseOffset_ == that1.cumBaseOffset_
-            && capacityBytes_ == that1.capacityBytes_
-            && getUnsafeObject() == that1.getUnsafeObject()
-            && getByteBuffer() == that1.getByteBuffer();
+  final boolean isDirectType() {
+    return (getTypeId() >>> 3 & 3) == 1;
   }
 
-  //Overridden by Direct and Map leafs
-  @Override
-  public boolean isValid() {
-    return true;
+  final boolean isDuplicateType() {
+    return (getTypeId() & DUPLICATE) > 0;
   }
 
-  //ASSERTS AND CHECKS
-  final void assertValid() {
-    assert isValid() : "MemoryImpl not valid.";
+  final boolean isHeapType() {
+    return (getTypeId() >>> 3 & 3) == 0;
   }
 
-  void checkValid() {
-    if (!isValid()) {
-      throw new IllegalStateException("MemoryImpl not valid.");
-    }
+  final boolean isMapType() {
+    return (getTypeId() >>> 3 & 3) == 2;
   }
 
-  final void assertValidAndBoundsForRead(final long offsetBytes, final long lengthBytes) {
-    assertValid();
-    // capacityBytes_ is intentionally read directly instead of calling getCapacity()
-    // because the later can make JVM to not inline the assert code path (and entirely remove it)
-    // even though it does nothing in production code path.
-    assertBounds(offsetBytes, lengthBytes, capacityBytes_);
+  final boolean isMemoryType() {
+    return (getTypeId() & BUFFER) == 0;
   }
 
-  final void assertValidAndBoundsForWrite(final long offsetBytes, final long lengthBytes) {
-    assertValid();
-    // capacityBytes_ is intentionally read directly instead of calling getCapacity()
-    // because the later can make JVM to not inline the assert code path (and entirely remove it)
-    // even though it does nothing in production code path.
-    assertBounds(offsetBytes, lengthBytes, capacityBytes_);
-    assert !isReadOnly() : "MemoryImpl is read-only.";
+  final boolean isNonNativeType() {
+    return (getTypeId() & NONNATIVE) > 0;
   }
 
   @Override
-  public final void checkValidAndBounds(final long offsetBytes, final long lengthBytes) {
-    checkValid();
-    //read capacityBytes_ directly to eliminate extra checkValid() call
-    checkBounds(offsetBytes, lengthBytes, capacityBytes_);
-  }
-
-  final void checkValidAndBoundsForWrite(final long offsetBytes, final long lengthBytes) {
-    checkValid();
-    //read capacityBytes_ directly to eliminate extra checkValid() call
-    checkBounds(offsetBytes, lengthBytes, capacityBytes_);
-    if (isReadOnly()) {
-      throw new ReadOnlyException("MemoryImpl is read-only.");
-    }
+  public final boolean isReadOnly() {
+    assertValid();
+    return isReadOnlyType();
   }
 
-  //TYPE ID Management
   final boolean isReadOnlyType() {
     return (getTypeId() & READONLY) > 0;
   }
 
-  final static byte setReadOnlyType(final byte type, final boolean readOnly) {
-    return (byte)((type & ~1) | (readOnly ? READONLY : 0));
-  }
-
   final boolean isRegionType() {
     return (getTypeId() & REGION) > 0;
   }
 
-  final boolean isDuplicateType() {
-    return (getTypeId() & DUPLICATE) > 0;
-  }
-
-  //The following are set by the leaf nodes
-  final boolean isBufferType() {
-    return (getTypeId() & BUFFER) > 0;
-  }
-
-  final boolean isNonNativeType() {
-    return (getTypeId() & NONNATIVE) > 0;
-  }
-
-  final boolean isHeapType() {
-    return (getTypeId() >>> 3 & 3) == 0;
-  }
-
-  final boolean isDirectType() {
-    return (getTypeId() >>> 3 & 3) == 1;
-  }
-
-  final boolean isMapType() {
-    return (getTypeId() >>> 3 & 3) == 2;
-  }
+  @Override
+  public final boolean isSameResource(final Object that) {
+    checkValid();
+    if (that == null) { return false; }
+    final BaseStateImpl that1 = (BaseStateImpl) that;
+    that1.checkValid();
+    if (this == that1) { return true; }
 
-  final boolean isBBType() {
-    return (getTypeId() >>> 3 & 3) == 3;
+    return cumBaseOffset_ == that1.cumBaseOffset_
+            && capacityBytes_ == that1.capacityBytes_
+            && getUnsafeObject() == that1.getUnsafeObject()
+            && getByteBuffer() == that1.getByteBuffer();
   }
 
-  /**
-   * Decodes the resource type. This is primarily for debugging.
-   * @param typeId the given typeId
-   * @return a human readable string.
-   */
-  public static final String typeDecode(final int typeId) {
-    final StringBuilder sb = new StringBuilder();
-    final int group1 = typeId & 0x7;
-    switch (group1) {
-      case 1 : sb.append("ReadOnly, "); break;
-      case 2 : sb.append("Region, "); break;
-      case 3 : sb.append("ReadOnly Region, "); break;
-      case 4 : sb.append("Duplicate, "); break;
-      case 5 : sb.append("ReadOnly Duplicate, "); break;
-      case 6 : sb.append("Region Duplicate, "); break;
-      case 7 : sb.append("ReadOnly Region Duplicate, "); break;
-      default: break;
-    }
-    final int group2 = (typeId >>> 3) & 0x3;
-    switch (group2) {
-      case 0 : sb.append("Heap, "); break;
-      case 1 : sb.append("Direct, "); break;
-      case 2 : sb.append("Map, "); break;
-      case 3 : sb.append("ByteBuffer, "); break;
-      default: break;
-    }
-    final int group3 = (typeId >>> 5) & 0x1;
-    switch (group3) {
-      case 0 : sb.append("Native, "); break;
-      case 1 : sb.append("NonNative, "); break;
-      default: break;
-    }
-    final int group4 = (typeId >>> 6) & 0x1;
-    switch (group4) {
-      case 0 : sb.append("Memory"); break;
-      case 1 : sb.append("Buffer"); break;
-      default: break;
-    }
-    return sb.toString();
+  //Overridden by Direct and Map leafs
+  @Override
+  public boolean isValid() {
+    return true;
   }
 
   @Override
@@ -385,101 +527,15 @@ public abstract class BaseStateImpl implements BaseState {
     return toHex(this, sb.toString(), offsetBytes, lengthBytes);
   }
 
-  /**
-   * Returns a formatted hex string of an area of this object.
-   * Used primarily for testing.
-   * @param state the BaseStateImpl
-   * @param preamble a descriptive header
-   * @param offsetBytes offset bytes relative to the MemoryImpl start
-   * @param lengthBytes number of bytes to convert to a hex string
-   * @return a formatted hex string in a human readable array
-   */
-  static final String toHex(final BaseStateImpl state, final String preamble, final long offsetBytes,
-      final int lengthBytes) {
-    final long capacity = state.getCapacity();
-    UnsafeUtil.checkBounds(offsetBytes, lengthBytes, capacity);
-    final StringBuilder sb = new StringBuilder();
-    final Object uObj = state.getUnsafeObject();
-    final String uObjStr;
-    final long uObjHeader;
-    if (uObj == null) {
-      uObjStr = "null";
-      uObjHeader = 0;
-    } else {
-      uObjStr =  uObj.getClass().getSimpleName() + ", " + (uObj.hashCode() & 0XFFFFFFFFL);
-      uObjHeader = UnsafeUtil.getArrayBaseOffset(uObj.getClass());
-    }
-    final ByteBuffer bb = state.getByteBuffer();
-    final String bbStr = bb == null ? "null"
-            : bb.getClass().getSimpleName() + ", " + (bb.hashCode() & 0XFFFFFFFFL);
-    final MemoryRequestServer memReqSvr = state.getMemoryRequestServer();
-    final String memReqStr = memReqSvr != null
-        ? memReqSvr.getClass().getSimpleName() + ", " + (memReqSvr.hashCode() & 0XFFFFFFFFL)
-        : "null";
-    final long cumBaseOffset = state.getCumulativeOffset();
-    sb.append(preamble).append(LS);
-    sb.append("UnsafeObj, hashCode : ").append(uObjStr).append(LS);
-    sb.append("UnsafeObjHeader     : ").append(uObjHeader).append(LS);
-    sb.append("ByteBuf, hashCode   : ").append(bbStr).append(LS);
-    sb.append("RegionOffset        : ").append(state.getRegionOffset()).append(LS);
-    sb.append("Capacity            : ").append(capacity).append(LS);
-    sb.append("CumBaseOffset       : ").append(cumBaseOffset).append(LS);
-    sb.append("MemReq, hashCode    : ").append(memReqStr).append(LS);
-    sb.append("Valid               : ").append(state.isValid()).append(LS);
-    sb.append("Read Only           : ").append(state.isReadOnly()).append(LS);
-    sb.append("Type Byte Order     : ").append(state.getByteOrder().toString()).append(LS);
-    sb.append("Native Byte Order   : ").append(NATIVE_BYTE_ORDER.toString()).append(LS);
-    sb.append("JDK Runtime Version : ").append(UnsafeUtil.JDK).append(LS);
-    //Data detail
-    sb.append("Data, littleEndian  :  0  1  2  3  4  5  6  7");
-
-    for (long i = 0; i < lengthBytes; i++) {
-      final int b = unsafe.getByte(uObj, cumBaseOffset + offsetBytes + i) & 0XFF;
-      if (i % 8 == 0) { //row header
-        sb.append(String.format("%n%20s: ", offsetBytes + i));
-      }
-      sb.append(String.format("%02x ", b));
-    }
-    sb.append(LS);
-
-    return sb.toString();
-  }
-
-  //MONITORING
-
-  /**
-   * Gets the current number of active direct memory allocations.
-   * @return the current number of active direct memory allocations.
-   */
-  public static final long getCurrentDirectMemoryAllocations() {
-    return BaseStateImpl.currentDirectMemoryAllocations_.get();
-  }
-
-  /**
-   * Gets the current size of active direct memory allocated.
-   * @return the current size of active direct memory allocated.
-   */
-  public static final long getCurrentDirectMemoryAllocated() {
-    return BaseStateImpl.currentDirectMemoryAllocated_.get();
-  }
-
-  /**
-   * Gets the current number of active direct memory map allocations.
-   * @return the current number of active direct memory map allocations.
-   */
-  public static final long getCurrentDirectMemoryMapAllocations() {
-    return BaseStateImpl.currentDirectMemoryMapAllocations_.get();
+  @Override
+  public final long xxHash64(final long offsetBytes, final long lengthBytes, final long seed) {
+    checkValid();
+    return XxHash64.hash(getUnsafeObject(), cumBaseOffset_ + offsetBytes, lengthBytes, seed);
   }
 
-  /**
-   * Gets the current size of active direct memory map allocated.
-   * @return the current size of active direct memory map allocated.
-   */
-  public static final long getCurrentDirectMemoryMapAllocated() {
-    return BaseStateImpl.currentDirectMemoryMapAllocated_.get();
+  @Override
+  public final long xxHash64(final long in, final long seed) {
+    return XxHash64.hash(in, seed);
   }
 
-  //REACHABILITY FENCE
-  static void reachabilityFence(final Object obj) { }
-
 }
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseWritableBufferImpl.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseWritableBufferImpl.java
index 37d8fbf..ea8daef 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseWritableBufferImpl.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseWritableBufferImpl.java
@@ -27,7 +27,6 @@ import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_CHAR_INDE
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_INT_INDEX_SCALE;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_LONG_INDEX_SCALE;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_SHORT_INDEX_SCALE;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.checkBounds;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.unsafe;
 
 import java.nio.ByteBuffer;
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseWritableMemoryImpl.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseWritableMemoryImpl.java
index 1e75d7d..818ab53 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseWritableMemoryImpl.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseWritableMemoryImpl.java
@@ -27,7 +27,6 @@ import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_CHAR_INDE
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_INT_INDEX_SCALE;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_LONG_INDEX_SCALE;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_SHORT_INDEX_SCALE;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.checkBounds;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.unsafe;
 import static org.apache.datasketches.memory.internal.Util.negativeCheck;
 
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/CompareAndCopy.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/CompareAndCopy.java
index 225a18b..5be228d 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/CompareAndCopy.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/CompareAndCopy.java
@@ -19,13 +19,13 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.UnsafeUtil.CHAR_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.DOUBLE_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.FLOAT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.INT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.LONG_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.SHORT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.checkBounds;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.CHAR_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.DOUBLE_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.FLOAT_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.INT_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.LONG_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.SHORT_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.checkBounds;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.unsafe;
 import static org.apache.datasketches.memory.internal.Util.UNSAFE_COPY_THRESHOLD_BYTES;
 
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NativeWritableBufferImpl.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NativeWritableBufferImpl.java
index 2dd1ce2..64b5841 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NativeWritableBufferImpl.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NativeWritableBufferImpl.java
@@ -27,13 +27,6 @@ import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_FLOAT_IND
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_INT_BASE_OFFSET;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_LONG_BASE_OFFSET;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_SHORT_BASE_OFFSET;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.CHAR_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.DOUBLE_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.FLOAT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.INT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.LONG_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.SHORT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.checkBounds;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.unsafe;
 
 import org.apache.datasketches.memory.WritableBuffer;
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImpl.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImpl.java
index c16423e..4603158 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImpl.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImpl.java
@@ -28,13 +28,6 @@ import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_INT_BASE_
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_LONG_BASE_OFFSET;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_LONG_INDEX_SCALE;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_SHORT_BASE_OFFSET;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.CHAR_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.DOUBLE_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.FLOAT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.INT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.LONG_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.SHORT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.checkBounds;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.unsafe;
 
 import org.apache.datasketches.memory.WritableMemory;
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableBufferImpl.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableBufferImpl.java
index a8203ba..5fd033d 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableBufferImpl.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableBufferImpl.java
@@ -21,12 +21,6 @@ package org.apache.datasketches.memory.internal;
 
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_DOUBLE_INDEX_SCALE;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_FLOAT_INDEX_SCALE;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.CHAR_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.DOUBLE_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.FLOAT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.INT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.LONG_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.SHORT_SHIFT;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.unsafe;
 
 import org.apache.datasketches.memory.WritableBuffer;
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImpl.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImpl.java
index de74333..bbf2dc3 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImpl.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImpl.java
@@ -22,12 +22,6 @@ package org.apache.datasketches.memory.internal;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_DOUBLE_INDEX_SCALE;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_FLOAT_INDEX_SCALE;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_LONG_INDEX_SCALE;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.CHAR_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.DOUBLE_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.FLOAT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.INT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.LONG_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.SHORT_SHIFT;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.unsafe;
 
 import org.apache.datasketches.memory.WritableMemory;
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/Prim.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/Prim.java
index 411be5b..ca8c2ff 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/Prim.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/Prim.java
@@ -19,6 +19,14 @@
 
 package org.apache.datasketches.memory.internal;
 
+import static org.apache.datasketches.memory.internal.BaseStateImpl.BOOLEAN_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.BYTE_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.CHAR_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.DOUBLE_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.FLOAT_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.INT_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.LONG_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.SHORT_SHIFT;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_BOOLEAN_BASE_OFFSET;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_BOOLEAN_INDEX_SCALE;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_BYTE_BASE_OFFSET;
@@ -33,19 +41,9 @@ import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_INT_BASE_
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_INT_INDEX_SCALE;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_LONG_BASE_OFFSET;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_LONG_INDEX_SCALE;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_OBJECT_BASE_OFFSET;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_OBJECT_INDEX_SCALE;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_SHORT_BASE_OFFSET;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_SHORT_INDEX_SCALE;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.BOOLEAN_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.BYTE_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.CHAR_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.DOUBLE_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.FLOAT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.INT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.LONG_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.OBJECT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.SHORT_SHIFT;
+
 
 /**
  * Creates easy to access association between the major Unsafe constants.
@@ -60,8 +58,7 @@ public enum Prim {
   INT(ARRAY_INT_BASE_OFFSET, ARRAY_INT_INDEX_SCALE, INT_SHIFT),
   LONG(ARRAY_LONG_BASE_OFFSET, ARRAY_LONG_INDEX_SCALE, LONG_SHIFT),
   FLOAT(ARRAY_FLOAT_BASE_OFFSET, ARRAY_FLOAT_INDEX_SCALE, FLOAT_SHIFT),
-  DOUBLE(ARRAY_DOUBLE_BASE_OFFSET, ARRAY_DOUBLE_INDEX_SCALE, DOUBLE_SHIFT),
-  OBJECT(ARRAY_OBJECT_BASE_OFFSET, ARRAY_OBJECT_INDEX_SCALE, OBJECT_SHIFT);
+  DOUBLE(ARRAY_DOUBLE_BASE_OFFSET, ARRAY_DOUBLE_INDEX_SCALE, DOUBLE_SHIFT);
 
   private final long arrBaseOff_;
   private final long arrIdxScale_;
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/UnsafeUtil.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/UnsafeUtil.java
index 8b391f2..0731c98 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/UnsafeUtil.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/UnsafeUtil.java
@@ -32,8 +32,6 @@ import sun.misc.Unsafe;
 @SuppressWarnings({"restriction"})
 public final class UnsafeUtil {
   public static final Unsafe unsafe;
-  public static final String JDK; //must be at least "1.8"
-  public static final int JDK_MAJOR; //8, 9, 10, 11, 12, etc
 
   //not an indicator of whether compressed references are used.
   public static final int ADDRESS_SIZE;
@@ -50,7 +48,6 @@ public final class UnsafeUtil {
   public static final long ARRAY_LONG_BASE_OFFSET;
   public static final long ARRAY_FLOAT_BASE_OFFSET;
   public static final long ARRAY_DOUBLE_BASE_OFFSET;
-  public static final long ARRAY_OBJECT_BASE_OFFSET;
 
   //@formatter:off
 
@@ -65,18 +62,6 @@ public final class UnsafeUtil {
   public static final long ARRAY_LONG_INDEX_SCALE   = 8;
   public static final long ARRAY_FLOAT_INDEX_SCALE  = 4;
   public static final long ARRAY_DOUBLE_INDEX_SCALE = 8;
-  public static final long ARRAY_OBJECT_INDEX_SCALE;  // varies, 4 or 8 depending on coop
-
-  //Used to convert "type" to bytes:  bytes = longs << LONG_SHIFT
-  public static final int BOOLEAN_SHIFT    = 0;
-  public static final int BYTE_SHIFT       = 0;
-  public static final long SHORT_SHIFT     = 1;
-  public static final long CHAR_SHIFT      = 1;
-  public static final long INT_SHIFT       = 2;
-  public static final long LONG_SHIFT      = 3;
-  public static final long FLOAT_SHIFT     = 2;
-  public static final long DOUBLE_SHIFT    = 3;
-  public static final long OBJECT_SHIFT;     // varies, 2 or 3 depending on coop
 
   //@formatter:on
 
@@ -109,45 +94,10 @@ public final class UnsafeUtil {
     ARRAY_LONG_BASE_OFFSET = unsafe.arrayBaseOffset(long[].class);
     ARRAY_FLOAT_BASE_OFFSET = unsafe.arrayBaseOffset(float[].class);
     ARRAY_DOUBLE_BASE_OFFSET = unsafe.arrayBaseOffset(double[].class);
-    ARRAY_OBJECT_BASE_OFFSET = unsafe.arrayBaseOffset(Object[].class);
-
-    ARRAY_OBJECT_INDEX_SCALE = unsafe.arrayIndexScale(Object[].class);
-    OBJECT_SHIFT = ARRAY_OBJECT_INDEX_SCALE == 4 ? 2 : 3;
-
-    final String jdkVer = System.getProperty("java.version");
-    final int[] p = parseJavaVersion(jdkVer);
-    JDK = p[0] + "." + p[1];
-    JDK_MAJOR = (p[0] == 1) ? p[1] : p[0];
   }
 
   private UnsafeUtil() {}
 
-  /**
-   * Returns first two number groups of the java version string.
-   * @param jdkVer the java version string from System.getProperty("java.version").
-   * @return first two number groups of the java version string.
-   */
-  public static int[] parseJavaVersion(final String jdkVer) {
-    final int p0, p1;
-    try {
-      String[] parts = jdkVer.trim().split("[^0-9\\.]");//grab only number groups and "."
-      parts = parts[0].split("\\."); //split out the number groups
-      p0 = Integer.parseInt(parts[0]); //the first number group
-      p1 = (parts.length > 1) ? Integer.parseInt(parts[1]) : 0; //2nd number group, or 0
-    } catch (final NumberFormatException | ArrayIndexOutOfBoundsException  e) {
-      throw new IllegalArgumentException("Improper Java -version string: " + jdkVer + "\n" + e);
-    }
-    //checkJavaVersion(jdkVer, p0, p1); //TODO Optional to omit this.
-    return new int[] {p0, p1};
-  }
-
-  public static void checkJavaVersion(final String jdkVer, final int p0, final int p1) {
-    if ( (p0 < 1) || ((p0 == 1) && (p1 < 8)) || (p0 > 13)  ) {
-      throw new IllegalArgumentException(
-          "Unsupported JDK Major Version, must be one of 1.8, 8, 9, 10, 11, 12, 13: " + jdkVer);
-    }
-  }
-
   public static long getFieldOffset(final Class<?> c, final String fieldName) {
     try {
       return unsafe.objectFieldOffset(c.getDeclaredField(fieldName));
@@ -180,41 +130,8 @@ public final class UnsafeUtil {
       return ARRAY_SHORT_BASE_OFFSET;
     } else if (c == char[].class) {
       return ARRAY_CHAR_BASE_OFFSET;
-    } else if (c == Object[].class) {
-      return ARRAY_OBJECT_BASE_OFFSET;
     } else {
       return unsafe.arrayBaseOffset(c);
     }
   }
-
-  /**
-   * Assert the requested offset and length against the allocated size.
-   * The invariants equation is: {@code 0 <= reqOff <= reqLen <= reqOff + reqLen <= allocSize}.
-   * If this equation is violated and assertions are enabled, an {@link AssertionError} will
-   * be thrown.
-   * @param reqOff the requested offset
-   * @param reqLen the requested length
-   * @param allocSize the allocated size.
-   */
-  public static void assertBounds(final long reqOff, final long reqLen, final long allocSize) {
-    assert ((reqOff | reqLen | (reqOff + reqLen) | (allocSize - (reqOff + reqLen))) >= 0) :
-      "reqOffset: " + reqOff + ", reqLength: " + reqLen
-      + ", (reqOff + reqLen): " + (reqOff + reqLen) + ", allocSize: " + allocSize;
-  }
-
-  /**
-   * Check the requested offset and length against the allocated size.
-   * The invariants equation is: {@code 0 <= reqOff <= reqLen <= reqOff + reqLen <= allocSize}.
-   * If this equation is violated an {@link IllegalArgumentException} will be thrown.
-   * @param reqOff the requested offset
-   * @param reqLen the requested length
-   * @param allocSize the allocated size.
-   */
-  public static void checkBounds(final long reqOff, final long reqLen, final long allocSize) {
-    if ((reqOff | reqLen | (reqOff + reqLen) | (allocSize - (reqOff + reqLen))) < 0) {
-      throw new IllegalArgumentException(
-          "reqOffset: " + reqOff + ", reqLength: " + reqLen
-              + ", (reqOff + reqLen): " + (reqOff + reqLen) + ", allocSize: " + allocSize);
-    }
-  }
 }
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/Util.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/Util.java
index df4f18f..143cb44 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/Util.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/Util.java
@@ -19,6 +19,10 @@
 
 package org.apache.datasketches.memory.internal;
 
+import static org.apache.datasketches.memory.internal.BaseStateImpl.LS;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.checkBounds;
+
 import java.io.File;
 import java.io.IOException;
 import java.net.URI;
@@ -37,16 +41,6 @@ import org.apache.datasketches.memory.Memory;
  */
 public final class Util {
 
-  /**
-   * The java line separator character as a String.
-   */
-  public static final String LS = System.getProperty("line.separator");
-
-  //Byte Order related
-  public static final ByteOrder NATIVE_BYTE_ORDER = ByteOrder.nativeOrder();
-  public static final ByteOrder NON_NATIVE_BYTE_ORDER = NATIVE_BYTE_ORDER == ByteOrder.LITTLE_ENDIAN
-      ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
-
   /**
    * Don't use sun.misc.Unsafe#copyMemory to copy blocks of memory larger than this
    * threshold, because internally it doesn't have safepoint polls, that may cause long
@@ -61,8 +55,6 @@ public final class Util {
 
   private Util() { }
 
-  //Byte Order Related
-
   /**
    * Returns true if the given byteOrder is the same as the native byte order.
    * @param byteOrder the given byte order
@@ -72,7 +64,7 @@ public final class Util {
     if (byteOrder == null) {
       throw new IllegalArgumentException("ByteOrder parameter cannot be null.");
     }
-    return ByteOrder.nativeOrder() == byteOrder;
+    return NATIVE_BYTE_ORDER == byteOrder;
   }
 
   /**
@@ -92,7 +84,7 @@ public final class Util {
    */
   public static long binarySearchLongs(final Memory mem, final long fromLongIndex,
       final long toLongIndex, final long key) {
-    UnsafeUtil.checkBounds(fromLongIndex << 3, (toLongIndex - fromLongIndex) << 3, mem.getCapacity());
+    checkBounds(fromLongIndex << 3, (toLongIndex - fromLongIndex) << 3, mem.getCapacity());
     long low = fromLongIndex;
     long high = toLongIndex - 1L;
 
diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/XxHash64.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/XxHash64.java
index f5eb8cf..46785f6 100644
--- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/XxHash64.java
+++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/XxHash64.java
@@ -19,6 +19,12 @@
 
 package org.apache.datasketches.memory.internal;
 
+import static org.apache.datasketches.memory.internal.BaseStateImpl.CHAR_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.DOUBLE_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.FLOAT_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.INT_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.LONG_SHIFT;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.SHORT_SHIFT;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_BOOLEAN_BASE_OFFSET;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_BYTE_BASE_OFFSET;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_CHAR_BASE_OFFSET;
@@ -27,12 +33,6 @@ import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_FLOAT_BAS
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_INT_BASE_OFFSET;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_LONG_BASE_OFFSET;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_SHORT_BASE_OFFSET;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.CHAR_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.DOUBLE_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.FLOAT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.INT_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.LONG_SHIFT;
-import static org.apache.datasketches.memory.internal.UnsafeUtil.SHORT_SHIFT;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.unsafe;
 
 /**
diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/AllocateDirectMapMemoryTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/AllocateDirectMapMemoryTest.java
index dcbd2d1..c3185cc 100644
--- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/AllocateDirectMapMemoryTest.java
+++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/AllocateDirectMapMemoryTest.java
@@ -23,8 +23,8 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.LS;
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.LS;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
 import static org.apache.datasketches.memory.internal.Util.getResourceFile;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/AllocateDirectMemoryTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/AllocateDirectMemoryTest.java
index 024c1b4..c5cb6d5 100644
--- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/AllocateDirectMemoryTest.java
+++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/AllocateDirectMemoryTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NON_NATIVE_BYTE_ORDER;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.fail;
@@ -29,10 +29,8 @@ import org.apache.datasketches.memory.DefaultMemoryRequestServer;
 import org.apache.datasketches.memory.MemoryRequestServer;
 import org.apache.datasketches.memory.WritableHandle;
 import org.apache.datasketches.memory.WritableMemory;
-import org.testng.annotations.AfterClass;
 import org.testng.annotations.Test;
 
-@SuppressWarnings("deprecation")
 public class AllocateDirectMemoryTest {
 
   @Test
@@ -107,17 +105,6 @@ public class AllocateDirectMemoryTest {
     } //end of scope call to Cleaner/Deallocator also will be redundant
   }
 
-
-  @AfterClass
-  public void checkDirectCounter() {
-    WritableMemory.writableWrap(new byte[8]);
-    long count = BaseState.getCurrentDirectMemoryAllocations();
-    if (count != 0) {
-      println(""+count);
-      fail();
-    }
-  }
-
   @Test
   public void printlnTest() {
     println("PRINTING: "+this.getClass().getName());
diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/AllocateDirectWritableMapMemoryTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/AllocateDirectWritableMapMemoryTest.java
index 5b62610..51cc4c7 100644
--- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/AllocateDirectWritableMapMemoryTest.java
+++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/AllocateDirectWritableMapMemoryTest.java
@@ -24,9 +24,9 @@
 package org.apache.datasketches.memory.internal;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.apache.datasketches.memory.internal.Util.LS;
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.LS;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NON_NATIVE_BYTE_ORDER;
 import static org.apache.datasketches.memory.internal.Util.getResourceFile;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
@@ -37,20 +37,16 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.UnsupportedEncodingException;
-import java.nio.ByteOrder;
 
-import org.apache.datasketches.memory.BaseState;
 import org.apache.datasketches.memory.MapHandle;
 import org.apache.datasketches.memory.Memory;
 import org.apache.datasketches.memory.ReadOnlyException;
 import org.apache.datasketches.memory.WritableHandle;
 import org.apache.datasketches.memory.WritableMapHandle;
 import org.apache.datasketches.memory.WritableMemory;
-import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-@SuppressWarnings("deprecation")
 public class AllocateDirectWritableMapMemoryTest {
 
   @BeforeClass
@@ -187,8 +183,7 @@ public class AllocateDirectWritableMapMemoryTest {
       assertEquals(bufStr, origStr);
     }
 
-    try (WritableMapHandle wrh = WritableMemory.writableMap(origFile, 0, corrBytes,
-        ByteOrder.nativeOrder())) {
+    try (WritableMapHandle wrh = WritableMemory.writableMap(origFile, 0, corrBytes, NATIVE_BYTE_ORDER)) {
       WritableMemory wMap = wrh.getWritable();
       wrh.load();
       assertTrue(wrh.isLoaded());
@@ -225,14 +220,14 @@ public class AllocateDirectWritableMapMemoryTest {
     } //end of scope call to Cleaner/Deallocator also will be redundant
   }
 
-  @AfterClass
-  public void checkDirectCounter() {
-    long count =  BaseState.getCurrentDirectMemoryMapAllocations();
-      if (count != 0) {
-        println(""+count);
-        fail();
-      }
-    }
+//  @AfterClass
+//  public void checkDirectCounter() {
+//    long count =  BaseState.getCurrentDirectMemoryMapAllocations();
+//      if (count != 0) {
+//        println(""+count);
+//        fail();
+//      }
+//    }
 
   @Test
   public void printlnTest() {
diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/BaseStateTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/BaseStateTest.java
index eef5799..0c09fc6 100644
--- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/BaseStateTest.java
+++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/BaseStateTest.java
@@ -19,8 +19,12 @@
 
 package org.apache.datasketches.memory.internal;
 
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.checkJavaVersion;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.isNativeByteOrder;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.parseJavaVersion;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.typeDecode;
 import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_DOUBLE_INDEX_SCALE;
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
@@ -35,6 +39,63 @@ import org.testng.annotations.Test;
 @SuppressWarnings("deprecation")
 public class BaseStateTest {
 
+  @Test
+  public void checkJdkString() {
+    String jdkVer;
+    int[] p = new int[2];
+    String[] good1_Strings = {"1.8.0_121", "8", "11"};
+    int len = good1_Strings.length;
+    for (int i = 0; i < len; i++) {
+      jdkVer = good1_Strings[i];
+      p = parseJavaVersion(jdkVer);
+      checkJavaVersion(jdkVer, p[0], p[1]);
+      int jdkMajor = (p[0] == 1) ? p[1] : p[0]; //model the actual JDK_MAJOR
+      if (p[0] == 1) { assertTrue(jdkMajor == p[1]); }
+      if (p[0] > 1 ) { assertTrue(jdkMajor == p[0]); }
+    }
+    try {
+      jdkVer = "14.0.4"; //ver 14 string
+      p = parseJavaVersion(jdkVer);
+      checkJavaVersion(jdkVer, p[0], p[1]);
+      fail();
+    } catch (IllegalArgumentException e) {
+      println("" + e);
+    }
+
+    try {
+      jdkVer = "1.7.0_80"; //1.7 string
+      p = parseJavaVersion(jdkVer);
+      checkJavaVersion(jdkVer, p[0], p[1]);
+      fail();
+    } catch (IllegalArgumentException e) {
+      println("" + e);
+    }
+    try {
+      jdkVer = "1.6.0_65"; //valid string but < 1.7
+      p = parseJavaVersion(jdkVer);
+      checkJavaVersion(jdkVer, p[0], p[1]); //throws
+      fail();
+    } catch (IllegalArgumentException e) {
+      println("" + e);
+    }
+    try {
+      jdkVer = "b"; //invalid string
+      p = parseJavaVersion(jdkVer);
+      checkJavaVersion(jdkVer, p[0], p[1]); //throws
+      fail();
+    } catch (IllegalArgumentException e) {
+      println("" + e);
+    }
+    try {
+      jdkVer = ""; //invalid string
+      p = parseJavaVersion(jdkVer);
+      checkJavaVersion(jdkVer, p[0], p[1]); //throws
+      fail();
+    } catch (IllegalArgumentException e) {
+      println("" + e);
+    }
+  }
+
   @Test
   public void checkPrimOffset() {
     int off = (int)Prim.BYTE.off();
@@ -98,9 +159,9 @@ public class BaseStateTest {
 
   @Test
   public void checkIsNativeByteOrder() {
-    assertTrue(BaseStateImpl.isNativeByteOrder(NATIVE_BYTE_ORDER));
+    assertTrue(isNativeByteOrder(NATIVE_BYTE_ORDER));
     try {
-      BaseStateImpl.isNativeByteOrder(null);
+      isNativeByteOrder(null);
       fail();
     } catch (final IllegalArgumentException e) {}
   }
@@ -115,7 +176,7 @@ public class BaseStateTest {
   @Test
   public void checkTypeDecode() {
     for (int i = 0; i < 128; i++) {
-      BaseStateImpl.typeDecode(i);
+      typeDecode(i);
     }
   }
 
diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/Buffer2Test.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/Buffer2Test.java
index f378d5e..7bf9269 100644
--- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/Buffer2Test.java
+++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/Buffer2Test.java
@@ -19,7 +19,7 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/BufferTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/BufferTest.java
index ca9700f..1c00746 100644
--- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/BufferTest.java
+++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/BufferTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
 import static org.testng.Assert.assertEquals;
 
 import java.nio.ByteBuffer;
diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/DruidIssue11544Test.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/DruidIssue11544Test.java
index 1e8d187..4db938f 100644
--- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/DruidIssue11544Test.java
+++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/DruidIssue11544Test.java
@@ -19,7 +19,7 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/ExampleMemoryRequestServerTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/ExampleMemoryRequestServerTest.java
index c1e9fe4..c75553d 100644
--- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/ExampleMemoryRequestServerTest.java
+++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/ExampleMemoryRequestServerTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
 import static org.testng.Assert.assertFalse;
 
 import java.nio.ByteOrder;
diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/LeafImplTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/LeafImplTest.java
index 1a7f738..fec0387 100644
--- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/LeafImplTest.java
+++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/LeafImplTest.java
@@ -19,8 +19,8 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NON_NATIVE_BYTE_ORDER;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
@@ -44,12 +44,10 @@ import org.testng.annotations.Test;
  */
 @SuppressWarnings("deprecation")
 public class LeafImplTest {
-  private static final ByteOrder NBO = NATIVE_BYTE_ORDER;
-  private static final ByteOrder NNBO = NON_NATIVE_BYTE_ORDER;
   private static final MemoryRequestServer dummyMemReqSvr = new DummyMemoryRequestServer();
 
   private static ByteOrder otherByteOrder(final ByteOrder order) {
-    return (order == ByteOrder.nativeOrder()) ? NNBO : ByteOrder.nativeOrder();
+    return (order == NATIVE_BYTE_ORDER) ? NON_NATIVE_BYTE_ORDER : NATIVE_BYTE_ORDER;
   }
 
   static class DummyMemoryRequestServer implements MemoryRequestServer {
@@ -64,20 +62,20 @@ public class LeafImplTest {
     long off = 0;
     long cap = 128;
     // Off Heap, Native order, No ByteBuffer, has MemReqSvr
-    try (WritableHandle wdh = WritableMemory.allocateDirect(cap, NBO, dummyMemReqSvr)) {
+    try (WritableHandle wdh = WritableMemory.allocateDirect(cap, NATIVE_BYTE_ORDER, dummyMemReqSvr)) {
       WritableMemory memNO = wdh.getWritable();
       memNO.putShort(0, (short) 1);
       assertNull(((BaseStateImpl)memNO).getUnsafeObject());
       assertTrue(memNO.isDirect());
-      checkCombinations(memNO, off, cap, memNO.isDirect(), NBO, false, true);
+      checkCombinations(memNO, off, cap, memNO.isDirect(), NATIVE_BYTE_ORDER, false, true);
     }
     // Off Heap, Non Native order, No ByteBuffer, has MemReqSvr
-    try (WritableHandle wdh = WritableMemory.allocateDirect(cap, NNBO, dummyMemReqSvr)) {
+    try (WritableHandle wdh = WritableMemory.allocateDirect(cap, NON_NATIVE_BYTE_ORDER, dummyMemReqSvr)) {
       WritableMemory memNNO = wdh.getWritable();
       memNNO.putShort(0, (short) 1);
       assertNull(((BaseStateImpl)memNNO).getUnsafeObject());
       assertTrue(memNNO.isDirect());
-      checkCombinations(memNNO, off, cap, memNNO.isDirect(), NNBO, false, true);
+      checkCombinations(memNNO, off, cap, memNNO.isDirect(), NON_NATIVE_BYTE_ORDER, false, true);
     }
   }
 
@@ -87,36 +85,36 @@ public class LeafImplTest {
     long cap = 128;
     //BB on heap, native order, has ByteBuffer, has MemReqSvr
     ByteBuffer bb = ByteBuffer.allocate((int)cap);
-    bb.order(NBO);
+    bb.order(NATIVE_BYTE_ORDER);
     bb.putShort(0, (short) 1);
-    WritableMemory mem = WritableMemory.writableWrap(bb, NBO, dummyMemReqSvr);
+    WritableMemory mem = WritableMemory.writableWrap(bb, NATIVE_BYTE_ORDER, dummyMemReqSvr);
     assertEquals(bb.isDirect(), mem.isDirect());
     assertNotNull(((BaseStateImpl)mem).getUnsafeObject());
     checkCombinations(mem, off, cap, mem.isDirect(), mem.getByteOrder(), true, true);
 
     //BB off heap, native order, has ByteBuffer, has MemReqSvr
     ByteBuffer dbb = ByteBuffer.allocateDirect((int)cap);
-    dbb.order(NBO);
+    dbb.order(NATIVE_BYTE_ORDER);
     dbb.putShort(0, (short) 1);
-    mem = WritableMemory.writableWrap(dbb, NBO, dummyMemReqSvr);
+    mem = WritableMemory.writableWrap(dbb, NATIVE_BYTE_ORDER, dummyMemReqSvr);
     assertEquals(dbb.isDirect(), mem.isDirect());
     assertNull(((BaseStateImpl)mem).getUnsafeObject());
     checkCombinations(mem, off, cap,  mem.isDirect(), mem.getByteOrder(), true, true);
 
     //BB on heap, non native order, has ByteBuffer, has MemReqSvr
     bb = ByteBuffer.allocate((int)cap);
-    bb.order(NNBO);
+    bb.order(NON_NATIVE_BYTE_ORDER);
     bb.putShort(0, (short) 1);
-    mem = WritableMemory.writableWrap(bb, NNBO, dummyMemReqSvr);
+    mem = WritableMemory.writableWrap(bb, NON_NATIVE_BYTE_ORDER, dummyMemReqSvr);
     assertEquals(bb.isDirect(), mem.isDirect());
     assertNotNull(((BaseStateImpl)mem).getUnsafeObject());
     checkCombinations(mem, off, cap, mem.isDirect(), mem.getByteOrder(), true, true);
 
     //BB off heap, non native order, has ByteBuffer, has MemReqSvr
     dbb = ByteBuffer.allocateDirect((int)cap);
-    dbb.order(NNBO);
+    dbb.order(NON_NATIVE_BYTE_ORDER);
     dbb.putShort(0, (short) 1);
-    mem = WritableMemory.writableWrap(dbb, NNBO, dummyMemReqSvr);
+    mem = WritableMemory.writableWrap(dbb, NON_NATIVE_BYTE_ORDER, dummyMemReqSvr);
     assertEquals(dbb.isDirect(), mem.isDirect());
     assertNull(((BaseStateImpl)mem).getUnsafeObject());
     checkCombinations(mem, off, cap,  mem.isDirect(), mem.getByteOrder(), true, true);
@@ -139,20 +137,20 @@ public class LeafImplTest {
     assertTrue(file.isFile());
     file.deleteOnExit();  //comment out if you want to examine the file.
     // Off Heap, Native order, No ByteBuffer, No MemReqSvr
-    try (WritableMapHandle wmh = WritableMemory.writableMap(file, off, cap, NBO)) {
+    try (WritableMapHandle wmh = WritableMemory.writableMap(file, off, cap, NATIVE_BYTE_ORDER)) {
       WritableMemory memNO = wmh.getWritable();
       memNO.putShort(0, (short) 1);
       assertNull(((BaseStateImpl)memNO).getUnsafeObject());
       assertTrue(memNO.isDirect());
-      checkCombinations(memNO, off, cap, memNO.isDirect(), NBO, false, false);
+      checkCombinations(memNO, off, cap, memNO.isDirect(), NATIVE_BYTE_ORDER, false, false);
     }
     // Off heap, Non Native order, No ByteBuffer, no MemReqSvr
-    try (WritableMapHandle wmh = WritableMemory.writableMap(file, off, cap, NNBO)) {
+    try (WritableMapHandle wmh = WritableMemory.writableMap(file, off, cap, NON_NATIVE_BYTE_ORDER)) {
       WritableMemory memNNO = wmh.getWritable();
       memNNO.putShort(0, (short) 1);
       assertNull(((BaseStateImpl)memNNO).getUnsafeObject());
       assertTrue(memNNO.isDirect());
-      checkCombinations(memNNO, off, cap, memNNO.isDirect(), NNBO, false, false);
+      checkCombinations(memNNO, off, cap, memNNO.isDirect(), NON_NATIVE_BYTE_ORDER, false, false);
     }
   }
 
@@ -161,17 +159,17 @@ public class LeafImplTest {
     long off = 0;
     long cap = 128;
     // On Heap, Native order, No ByteBuffer, No MemReqSvr
-    WritableMemory memNO = WritableMemory.allocate((int)cap); //assumes NBO
+    WritableMemory memNO = WritableMemory.allocate((int)cap); //assumes NATIVE_BYTE_ORDER
     memNO.putShort(0, (short) 1);
     assertNotNull(((BaseStateImpl)memNO).getUnsafeObject());
     assertFalse(memNO.isDirect());
-    checkCombinations(memNO, off, cap, memNO.isDirect(), NBO, false, false);
+    checkCombinations(memNO, off, cap, memNO.isDirect(), NATIVE_BYTE_ORDER, false, false);
     // On Heap, Non-native order, No ByteBuffer, No MemReqSvr
-    WritableMemory memNNO = WritableMemory.allocate((int)cap, NNBO);
+    WritableMemory memNNO = WritableMemory.allocate((int)cap, NON_NATIVE_BYTE_ORDER);
     memNNO.putShort(0, (short) 1);
     assertNotNull(((BaseStateImpl)memNNO).getUnsafeObject());
     assertFalse(memNNO.isDirect());
-    checkCombinations(memNNO, off, cap, memNNO.isDirect(), NNBO, false, false);
+    checkCombinations(memNNO, off, cap, memNNO.isDirect(), NON_NATIVE_BYTE_ORDER, false, false);
   }
 
   private static void checkCombinations(WritableMemory mem, long off, long cap,
diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/MemoryReadWriteSafetyTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/MemoryReadWriteSafetyTest.java
index e21eae7..d97fac5 100644
--- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/MemoryReadWriteSafetyTest.java
+++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/MemoryReadWriteSafetyTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
 
 import java.io.File;
 import java.io.RandomAccessFile;
diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/MemoryTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/MemoryTest.java
index 02d44a0..81e9fd6 100644
--- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/MemoryTest.java
+++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/MemoryTest.java
@@ -23,23 +23,20 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.LS;
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
-import static org.apache.datasketches.memory.internal.Util.getResourceFile;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.LS;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NON_NATIVE_BYTE_ORDER;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
-import java.io.File;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.util.List;
 
 import org.apache.datasketches.memory.BaseState;
-import org.apache.datasketches.memory.MapHandle;
 import org.apache.datasketches.memory.Memory;
 import org.apache.datasketches.memory.WritableBuffer;
 import org.apache.datasketches.memory.WritableHandle;
@@ -48,7 +45,6 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 import org.testng.collections.Lists;
 
-@SuppressWarnings("deprecation")
 public class MemoryTest {
 
   @BeforeClass
@@ -345,50 +341,6 @@ public class MemoryTest {
     region.getByte(0);
   }
 
-  @Test
-  public void checkMonitorDirectStats() throws Exception {
-    int bytes = 1024;
-    long curAllocations = BaseState.getCurrentDirectMemoryAllocations();
-    long curAllocated   = BaseState.getCurrentDirectMemoryAllocated();
-    if (curAllocations != 0) { System.err.println(curAllocations + " should be zero!"); }
-    WritableHandle wh1 = WritableMemory.allocateDirect(bytes);
-    WritableHandle wh2 = WritableMemory.allocateDirect(bytes);
-    assertEquals(BaseState.getCurrentDirectMemoryAllocations(), 2L + curAllocations);
-    assertEquals(BaseState.getCurrentDirectMemoryAllocated(), 2 * bytes + curAllocated);
-
-    wh1.close();
-    assertEquals(BaseState.getCurrentDirectMemoryAllocations(), 1L + curAllocations);
-    assertEquals(BaseState.getCurrentDirectMemoryAllocated(), bytes + curAllocated);
-
-    wh2.close();
-    wh2.close(); //check that it doesn't go negative.
-    //even though the handles are closed, these methods are static access
-    assertEquals(BaseState.getCurrentDirectMemoryAllocations(), 0L + curAllocations);
-    assertEquals(BaseState.getCurrentDirectMemoryAllocated(), 0L + curAllocated);
-  }
-
-  @Test
-  public void checkMonitorDirectMapStats() throws Exception {
-    File file = getResourceFile("GettysburgAddress.txt");
-    long bytes = file.length();
-
-    MapHandle mmh1 = Memory.map(file);
-    MapHandle mmh2 = Memory.map(file);
-
-    assertEquals(BaseState.getCurrentDirectMemoryMapAllocations(), 2L);
-    assertEquals(BaseState.getCurrentDirectMemoryMapAllocated(), 2 * bytes);
-
-    mmh1.close();
-    assertEquals(BaseState.getCurrentDirectMemoryMapAllocations(), 1L);
-    assertEquals(BaseState.getCurrentDirectMemoryMapAllocated(), bytes);
-
-    mmh2.close();
-    mmh2.close(); //check that it doesn't go negative.
-    //even though the handles are closed, these methods are static access
-    assertEquals(BaseState.getCurrentDirectMemoryMapAllocations(), 0L);
-    assertEquals(BaseState.getCurrentDirectMemoryMapAllocated(), 0L);
-  }
-
   @Test
   public void checkMemReqSvr() throws Exception {
     WritableMemory wmem;
diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NativeWritableBufferImplTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NativeWritableBufferImplTest.java
index 63bfc4d..ef9381d 100644
--- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NativeWritableBufferImplTest.java
+++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NativeWritableBufferImplTest.java
@@ -19,8 +19,9 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.checkBounds;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
@@ -372,7 +373,7 @@ public class NativeWritableBufferImplTest {
 
   @Test
   public void checkGoodBounds() {
-    UnsafeUtil.checkBounds(50, 50, 100);
+    checkBounds(50, 50, 100);
   }
 
   @Test
diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImplTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImplTest.java
index 08d79c0..0356249 100644
--- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImplTest.java
+++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImplTest.java
@@ -19,15 +19,15 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.checkBounds;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
 import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
 
 import org.apache.datasketches.memory.Buffer;
 import org.apache.datasketches.memory.Memory;
@@ -461,7 +461,7 @@ public class NativeWritableMemoryImplTest {
   public void checkWrapWithBBReadonly1() {
     int memCapacity = 64;
     ByteBuffer byteBuf = ByteBuffer.allocate(memCapacity);
-    byteBuf.order(ByteOrder.nativeOrder());
+    byteBuf.order(NATIVE_BYTE_ORDER);
 
     for (int i = 0; i < memCapacity; i++) {
       byteBuf.put(i, (byte) i);
@@ -565,7 +565,7 @@ public class NativeWritableMemoryImplTest {
 
   @Test
   public void checkGoodBounds() {
-    UnsafeUtil.checkBounds(50, 50, 100);
+    checkBounds(50, 50, 100);
   }
 
   @Test
diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/SpecificLeafTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/SpecificLeafTest.java
index dbccbc0..7a8cbff 100644
--- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/SpecificLeafTest.java
+++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/SpecificLeafTest.java
@@ -19,8 +19,9 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
-import static org.apache.datasketches.memory.internal.Util.NON_NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NON_NATIVE_BYTE_ORDER;
+import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
 
@@ -49,8 +50,12 @@ public class SpecificLeafTest {
     Memory mem = Memory.wrap(bb).region(0, bytes, NATIVE_BYTE_ORDER);
     assertTrue(((BaseStateImpl)mem).isBBType());
     assertTrue(mem.isReadOnly());
+    assertTrue(((BaseStateImpl)mem).isMemoryType());
+    assertFalse(((BaseStateImpl)mem).isDirectType());
+    assertFalse(((BaseStateImpl)mem).isMapType());
     checkCrossLeafTypeIds(mem);
     Buffer buf = mem.asBuffer().region(0, bytes, NATIVE_BYTE_ORDER);
+    assertEquals(buf.getByteOrder(), NATIVE_BYTE_ORDER);
 
     bb.order(NON_NATIVE_BYTE_ORDER);
     Memory mem2 = Memory.wrap(bb).region(0, bytes, NON_NATIVE_BYTE_ORDER);
@@ -87,6 +92,7 @@ public class SpecificLeafTest {
       assertTrue(((BaseStateImpl)buf).isRegionType());
       assertTrue(((BaseStateImpl)buf2).isRegionType());
       assertTrue(((BaseStateImpl)buf3).isDuplicateType());
+      assertTrue(((BaseStateImpl)mem).isMemoryType());
     }
   }
 
diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/UnsafeUtilTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/UnsafeUtilTest.java
index baaf90a..d81178e 100644
--- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/UnsafeUtilTest.java
+++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/UnsafeUtilTest.java
@@ -20,7 +20,6 @@
 package org.apache.datasketches.memory.internal;
 
 import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
 import java.util.ArrayList;
@@ -35,64 +34,6 @@ import org.testng.annotations.Test;
 public class UnsafeUtilTest {
   long testField = 1; //Do not remove & cannot be static. Used in reflection check.
 
-
-  @Test
-  public void checkJdkString() {
-    String jdkVer;
-    int[] p = new int[2];
-    String[] good1_Strings = {"1.8.0_121", "8", "9", "10", "11", "12", "13"};
-    int len = good1_Strings.length;
-    for (int i = 0; i < len; i++) {
-      jdkVer = good1_Strings[i];
-      p = UnsafeUtil.parseJavaVersion(jdkVer);
-      UnsafeUtil.checkJavaVersion(jdkVer, p[0], p[1]);
-      int jdkMajor = (p[0] == 1) ? p[1] : p[0]; //model the actual JDK_MAJOR
-      if (p[0] == 1) { assertTrue(jdkMajor == p[1]); }
-      if (p[0] > 1 ) { assertTrue(jdkMajor == p[0]); }
-    }
-    try {
-      jdkVer = "14.0.4"; //ver 14 string
-      p = UnsafeUtil.parseJavaVersion(jdkVer);
-      UnsafeUtil.checkJavaVersion(jdkVer, p[0], p[1]);
-      fail();
-    } catch (IllegalArgumentException e) {
-      println("" + e);
-    }
-
-    try {
-      jdkVer = "1.7.0_80"; //1.7 string
-      p = UnsafeUtil.parseJavaVersion(jdkVer);
-      UnsafeUtil.checkJavaVersion(jdkVer, p[0], p[1]);
-      fail();
-    } catch (IllegalArgumentException e) {
-      println("" + e);
-    }
-    try {
-      jdkVer = "1.6.0_65"; //valid string but < 1.7
-      p = UnsafeUtil.parseJavaVersion(jdkVer);
-      UnsafeUtil.checkJavaVersion(jdkVer, p[0], p[1]); //throws
-      fail();
-    } catch (IllegalArgumentException e) {
-      println("" + e);
-    }
-    try {
-      jdkVer = "b"; //invalid string
-      p = UnsafeUtil.parseJavaVersion(jdkVer);
-      UnsafeUtil.checkJavaVersion(jdkVer, p[0], p[1]); //throws
-      fail();
-    } catch (IllegalArgumentException e) {
-      println("" + e);
-    }
-    try {
-      jdkVer = ""; //invalid string
-      p = UnsafeUtil.parseJavaVersion(jdkVer);
-      UnsafeUtil.checkJavaVersion(jdkVer, p[0], p[1]); //throws
-      fail();
-    } catch (IllegalArgumentException e) {
-      println("" + e);
-    }
-  }
-
   @Test
   public void checkFieldOffset() {
     assertEquals(testField, 1);
diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/UtilTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/UtilTest.java
index 0b8b42c..b807aad 100644
--- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/UtilTest.java
+++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/UtilTest.java
@@ -23,7 +23,8 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.LS;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.LS;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.checkBounds;
 import static org.apache.datasketches.memory.internal.Util.characterPad;
 import static org.apache.datasketches.memory.internal.Util.getResourceBytes;
 import static org.apache.datasketches.memory.internal.Util.getResourceFile;
@@ -65,7 +66,7 @@ public class UtilTest {
 
   @Test(expectedExceptions = IllegalArgumentException.class)
   public void checkBoundsTest() {
-    UnsafeUtil.checkBounds(999, 2, 1000);
+    checkBounds(999, 2, 1000);
   }
 
   @Test
diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/WritableMemoryTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/WritableMemoryTest.java
index 33d1529..6a46e0d 100644
--- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/WritableMemoryTest.java
+++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/WritableMemoryTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.datasketches.memory.internal;
 
-import static org.apache.datasketches.memory.internal.Util.NATIVE_BYTE_ORDER;
+import static org.apache.datasketches.memory.internal.BaseStateImpl.NATIVE_BYTE_ORDER;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datasketches.apache.org
For additional commands, e-mail: commits-help@datasketches.apache.org