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

nizhikov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 2d6f8fcbabb IGNITE-26192 Move JdkMarshaller to ignite-binary-impl 
(#12266)
2d6f8fcbabb is described below

commit 2d6f8fcbabb289543d21def49704aca508b0d0ef
Author: Nikolay <[email protected]>
AuthorDate: Thu Aug 14 14:58:12 2025 +0300

    IGNITE-26192 Move JdkMarshaller to ignite-binary-impl (#12266)
---
 .../ignite/marshaller/AbstractMarshaller.java      |  10 +-
 .../AbstractNodeNameAwareMarshaller.java           |  24 +-
 .../org/apache/ignite/marshaller/Marshaller.java   |   3 +-
 .../ignite/marshaller/MarshallerContext.java       |   3 +-
 .../ignite/marshaller/MarshallerExclusions.java    |  91 ++----
 .../org/apache/ignite/marshaller/Marshallers.java  |  60 ++++
 .../ignite/marshaller/MarshallersFactory.java}     |  36 ++-
 .../ignite/marshaller/jdk/JdkMarshaller.java}      |  11 +-
 .../apache/ignite/marshaller/jdk/package-info.java |   0
 .../ignite/marshaller/MarshallersFactoryImpl.java} |  33 +-
 .../jdk/JdkMarshallerDummySerializable.java        |   0
 .../ignite/marshaller/jdk/JdkMarshallerImpl.java}  |  13 +-
 .../jdk/JdkMarshallerInputStreamWrapper.java       |   0
 .../jdk/JdkMarshallerObjectInputStream.java        |   9 +-
 .../jdk/JdkMarshallerObjectOutputStream.java       |   0
 .../jdk/JdkMarshallerOutputStreamWrapper.java      |   0
 ...org.apache.ignite.marshaller.MarshallersFactory |   1 +
 .../processors/rest/TestMemcacheClient.java        |  11 +-
 .../processors/cache/CacheClassLoaderMarker.java   |   0
 .../apache/ignite/internal/util/ClassCache.java    |   0
 .../apache/ignite/internal/util/CommonUtils.java   | 285 ++++++++++++++++++
 .../cache/store/jdbc/CacheJdbcBlobStore.java       |   4 +-
 .../java/org/apache/ignite/dump/DumpReader.java    |   3 +-
 .../ignite/internal/MarshallerContextImpl.java     |  42 ++-
 .../apache/ignite/internal/binary/BinaryArray.java |   5 +-
 .../ignite/internal/binary/BinaryContext.java      |   5 +-
 .../internal/binary/BinaryEnumObjectImpl.java      |  10 +-
 .../ignite/internal/binary/BinaryObjectImpl.java   |   9 +-
 .../internal/binary/BinaryObjectOffheapImpl.java   |   5 +-
 .../ignite/internal/binary/BinaryReaderExImpl.java |   5 +-
 .../apache/ignite/internal/binary/BinaryUtils.java |   5 +-
 .../internal/binary/GridBinaryMarshaller.java      |   3 -
 .../internal/client/thin/TcpIgniteClient.java      |   3 +-
 .../internal/jdbc/thin/JdbcThinConnection.java     |   3 +-
 .../ignite/internal/jdbc2/JdbcBinaryBuffer.java    |   8 +-
 .../org/apache/ignite/internal/jdbc2/JdbcClob.java |   4 +-
 .../optimized/OptimizedClassDescriptor.java        |   9 +-
 .../marshaller/optimized/OptimizedMarshaller.java  |   6 +-
 .../optimized/OptimizedObjectOutputStream.java     |   6 +-
 .../cache/CacheObjectTransformerUtils.java         |   4 +-
 .../client/message/GridClientHandshakeRequest.java |   3 +-
 .../rest/protocols/tcp/GridMemcachedMessage.java   |   3 +-
 .../rest/protocols/tcp/GridTcpRestParser.java      |   7 +-
 .../ignite/internal/util/GridByteArrayList.java    |   4 +-
 .../apache/ignite/internal/util/IgniteUtils.java   | 333 +--------------------
 .../ignite/stream/socket/SocketStreamer.java       |   4 +-
 .../ignite/IgniteExternalizableAbstractTest.java   |   4 +-
 .../GridBinaryMarshallerCtxDisabledSelfTest.java   |   3 +-
 .../binary/RawBinaryObjectExtractorTest.java       |   3 +-
 .../optimized/OptimizedObjectStreamSelfTest.java   |   3 +-
 .../cache/GridCacheEntryMemorySizeSelfTest.java    |   3 +-
 ...CacheConfigurationFileConsistencyCheckTest.java |   4 +-
 .../processors/service/ServiceInfoSelfTest.java    |   3 +-
 .../java/org/apache/ignite/jvmtest/RegExpTest.java |   4 +-
 .../ignite/lang/GridByteArrayListSelfTest.java     |   5 +-
 .../marshaller/GridMarshallerResourceBean.java     |   3 +-
 .../marshaller/jdk/GridJdkMarshallerSelfTest.java  |   3 +-
 .../ignite/p2p/P2PScanQueryUndeployTest.java       |   4 +-
 .../tcp/DiscoveryUnmarshalVulnerabilityTest.java   |   3 +-
 .../stream/socket/SocketStreamerSelfTest.java      |   8 +-
 .../SocketStreamerUnmarshalVulnerabilityTest.java  |   4 +-
 .../junits/common/GridCommonAbstractTest.java      |   3 +-
 .../apache/ignite/internal/util/GridUnsafe.java    |  13 +
 .../internal/util/io/GridByteArrayInputStream.java |   4 +-
 .../util/io/GridByteArrayOutputStream.java         |   4 +-
 .../cache/IgniteCacheAbstractBenchmark.java        |   3 +-
 66 files changed, 606 insertions(+), 561 deletions(-)

diff --git 
a/modules/core/src/main/java/org/apache/ignite/marshaller/AbstractMarshaller.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/AbstractMarshaller.java
similarity index 81%
rename from 
modules/core/src/main/java/org/apache/ignite/marshaller/AbstractMarshaller.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/marshaller/AbstractMarshaller.java
index 6c3428e3924..032e758f853 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/marshaller/AbstractMarshaller.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/AbstractMarshaller.java
@@ -17,18 +17,14 @@
 
 package org.apache.ignite.marshaller;
 
-import org.apache.ignite.internal.util.GridByteArrayList;
-import org.apache.ignite.internal.util.io.GridByteArrayInputStream;
-import org.apache.ignite.internal.util.io.GridByteArrayOutputStream;
-
 /**
  * Base class for marshallers. Provides default implementations of methods
- * that work with byte array or {@link GridByteArrayList}. These 
implementations
- * use {@link GridByteArrayInputStream} or {@link GridByteArrayOutputStream}
+ * that work with byte array or {@code GridByteArrayList}. These 
implementations
+ * use {@code GridByteArrayInputStream} or {@code GridByteArrayOutputStream}
  * to marshal and unmarshal objects.
  */
 public abstract class AbstractMarshaller implements Marshaller {
-    /** Default initial buffer size for the {@link GridByteArrayOutputStream}. 
*/
+    /** Default initial buffer size for the {@code GridByteArrayOutputStream}. 
*/
     public static final int DFLT_BUFFER_SIZE = 512;
 
     /** Context. */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/marshaller/AbstractNodeNameAwareMarshaller.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/AbstractNodeNameAwareMarshaller.java
similarity index 84%
rename from 
modules/core/src/main/java/org/apache/ignite/marshaller/AbstractNodeNameAwareMarshaller.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/marshaller/AbstractNodeNameAwareMarshaller.java
index 5a187dcb5cf..6f8150f09fb 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/marshaller/AbstractNodeNameAwareMarshaller.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/AbstractNodeNameAwareMarshaller.java
@@ -20,20 +20,18 @@ package org.apache.ignite.marshaller;
 import java.io.InputStream;
 import java.io.OutputStream;
 import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.internal.util.IgniteUtils;
-import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.util.CommonUtils;
 import org.jetbrains.annotations.Nullable;
 
 /**
- * Marshaller allowing for {@link Ignition#localIgnite()} calls.
+ * Marshaller allowing for {@code Ignition#localIgnite()} calls.
  */
 public abstract class AbstractNodeNameAwareMarshaller extends 
AbstractMarshaller {
     /** Whether node name is set. */
     private volatile boolean nodeNameSet;
 
     /** Node name. */
-    private volatile String nodeName = U.LOC_IGNITE_NAME_EMPTY;
+    private volatile String nodeName = CommonUtils.LOC_IGNITE_NAME_EMPTY;
 
     /**
      * Set node name.
@@ -50,49 +48,49 @@ public abstract class AbstractNodeNameAwareMarshaller 
extends AbstractMarshaller
 
     /** {@inheritDoc} */
     @Override public byte[] marshal(@Nullable Object obj) throws 
IgniteCheckedException {
-        String oldNodeName = IgniteUtils.setCurrentIgniteName(nodeName);
+        String oldNodeName = CommonUtils.setCurrentIgniteName(nodeName);
 
         try {
             return marshal0(obj);
         }
         finally {
-            IgniteUtils.restoreOldIgniteName(oldNodeName, nodeName);
+            CommonUtils.restoreOldIgniteName(oldNodeName, nodeName);
         }
     }
 
     /** {@inheritDoc} */
     @Override public void marshal(@Nullable Object obj, OutputStream out) 
throws IgniteCheckedException {
-        String oldNodeName = IgniteUtils.setCurrentIgniteName(nodeName);
+        String oldNodeName = CommonUtils.setCurrentIgniteName(nodeName);
 
         try {
             marshal0(obj, out);
         }
         finally {
-            IgniteUtils.restoreOldIgniteName(oldNodeName, nodeName);
+            CommonUtils.restoreOldIgniteName(oldNodeName, nodeName);
         }
     }
 
     /** {@inheritDoc} */
     @Override public <T> T unmarshal(byte[] arr, @Nullable ClassLoader clsLdr) 
throws IgniteCheckedException {
-        String oldNodeName = IgniteUtils.setCurrentIgniteName(nodeName);
+        String oldNodeName = CommonUtils.setCurrentIgniteName(nodeName);
 
         try {
             return unmarshal0(arr, clsLdr);
         }
         finally {
-            IgniteUtils.restoreOldIgniteName(oldNodeName, nodeName);
+            CommonUtils.restoreOldIgniteName(oldNodeName, nodeName);
         }
     }
 
     /** {@inheritDoc} */
     @Override public <T> T unmarshal(InputStream in, @Nullable ClassLoader 
clsLdr) throws IgniteCheckedException {
-        String oldNodeName = IgniteUtils.setCurrentIgniteName(nodeName);
+        String oldNodeName = CommonUtils.setCurrentIgniteName(nodeName);
 
         try {
             return unmarshal0(in, clsLdr);
         }
         finally {
-            IgniteUtils.restoreOldIgniteName(oldNodeName, nodeName);
+            CommonUtils.restoreOldIgniteName(oldNodeName, nodeName);
         }
     }
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/marshaller/Marshaller.java 
b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/Marshaller.java
similarity index 97%
rename from 
modules/core/src/main/java/org/apache/ignite/marshaller/Marshaller.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/marshaller/Marshaller.java
index 99b773a8cf7..7bc328ef2b8 100644
--- a/modules/core/src/main/java/org/apache/ignite/marshaller/Marshaller.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/Marshaller.java
@@ -19,7 +19,6 @@ package org.apache.ignite.marshaller;
 
 import java.io.InputStream;
 import java.io.OutputStream;
-import org.apache.ignite.IgniteBinary;
 import org.apache.ignite.IgniteCheckedException;
 import org.jetbrains.annotations.Nullable;
 
@@ -31,7 +30,7 @@ import org.jetbrains.annotations.Nullable;
  * Ignite provides the following {@code Marshaller} implementations:
  * <ul>
  * <li>Default binary marshaller. Will be used when no other marshaller is 
explicitly set to the
- * configuration. For more information, see {@link IgniteBinary}.</li>
+ * configuration. For more information, see {@code IgniteBinary}.</li>
  * <li>{@link org.apache.ignite.marshaller.jdk.JdkMarshaller}</li>
  * </ul>
  * <p>
diff --git 
a/modules/core/src/main/java/org/apache/ignite/marshaller/MarshallerContext.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/MarshallerContext.java
similarity index 96%
rename from 
modules/core/src/main/java/org/apache/ignite/marshaller/MarshallerContext.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/marshaller/MarshallerContext.java
index 36d4e055c26..1cbc84464fc 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/marshaller/MarshallerContext.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/MarshallerContext.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.marshaller;
 
 import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.internal.UnregisteredBinaryTypeException;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 
@@ -35,7 +34,7 @@ public interface MarshallerContext {
      * @param platformId Id of a platform (java, .NET, etc.) to register 
mapping for.
      * @param typeId Type ID.
      * @param clsName Class name.
-     * @param failIfUnregistered If {@code true} then throw {@link 
UnregisteredBinaryTypeException} with
+     * @param failIfUnregistered If {@code true} then throw {@code 
UnregisteredBinaryTypeException} with
      *      registration future instead of synchronously awaiting for its 
completion.
      * @return {@code True} if mapping was registered successfully.
      * @throws IgniteCheckedException In case of error.
diff --git 
a/modules/core/src/main/java/org/apache/ignite/marshaller/MarshallerExclusions.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/MarshallerExclusions.java
similarity index 55%
rename from 
modules/core/src/main/java/org/apache/ignite/marshaller/MarshallerExclusions.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/marshaller/MarshallerExclusions.java
index 8302427cc34..f6e5f3ec700 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/marshaller/MarshallerExclusions.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/MarshallerExclusions.java
@@ -17,24 +17,13 @@
 
 package org.apache.ignite.marshaller;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
 import java.util.Map;
-import java.util.concurrent.ExecutorService;
-import javax.management.MBeanServer;
-import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.compute.ComputeJobContext;
-import org.apache.ignite.compute.ComputeLoadBalancer;
-import org.apache.ignite.compute.ComputeTaskContinuousMapper;
-import org.apache.ignite.compute.ComputeTaskSession;
-import org.apache.ignite.internal.GridComponent;
-import org.apache.ignite.internal.GridLoggerProxy;
-import org.apache.ignite.internal.executor.GridExecutorService;
+import java.util.Set;
 import org.apache.ignite.internal.util.GridBoundedConcurrentLinkedHashMap;
-import org.apache.ignite.internal.util.typedef.internal.U;
 
 /**
- * Controls what classes should be excluded from marshalling by default.
+ * Checks whether given class should be excluded from marshalling.
  */
 public final class MarshallerExclusions {
     /**
@@ -43,11 +32,7 @@ public final class MarshallerExclusions {
      * <p>
      * Note that this list supersedes {@link #EXCL_CLASSES}.
      */
-    private static final Class<?>[] INCL_CLASSES = new Class[] {
-        // Ignite classes.
-        GridLoggerProxy.class,
-        GridExecutorService.class
-    };
+    private static final Set<Class<?>> INCL_CLASSES = new HashSet<>();
 
     /** */
     private static volatile Map<Class<?>, Boolean> cache = new 
GridBoundedConcurrentLinkedHashMap<>(
@@ -59,43 +44,7 @@ public final class MarshallerExclusions {
      * <p>
      * Note that {@link #INCL_CLASSES} supersedes this list.
      */
-    private static final Class<?>[] EXCL_CLASSES;
-
-    /**
-     *
-     */
-    static {
-        Class springCtxCls = null;
-
-        try {
-            springCtxCls = 
Class.forName("org.springframework.context.ApplicationContext");
-        }
-        catch (Exception ignored) {
-            // No-op.
-        }
-
-        List<Class<?>> excl = new ArrayList<>();
-
-        // Non-Ignite classes.
-        excl.add(MBeanServer.class);
-        excl.add(ExecutorService.class);
-        excl.add(ClassLoader.class);
-        excl.add(Thread.class);
-
-        if (springCtxCls != null)
-            excl.add(springCtxCls);
-
-        // Ignite classes.
-        excl.add(IgniteLogger.class);
-        excl.add(ComputeTaskSession.class);
-        excl.add(ComputeLoadBalancer.class);
-        excl.add(ComputeJobContext.class);
-        excl.add(Marshaller.class);
-        excl.add(GridComponent.class);
-        excl.add(ComputeTaskContinuousMapper.class);
-
-        EXCL_CLASSES = U.toArray(excl, new Class[excl.size()]);
-    }
+    private static final Set<Class<?>> EXCL_CLASSES = new HashSet<>();
 
     /**
      * Ensures singleton.
@@ -114,18 +63,12 @@ public final class MarshallerExclusions {
     private static boolean isExcluded0(Class<?> cls) {
         assert cls != null;
 
-        final Class<?>[] inc = INCL_CLASSES;
-
-        // NOTE: don't use foreach for performance reasons.
-        for (int i = 0; i < inc.length; i++)
-            if (inc[i].isAssignableFrom(cls))
+        for (Class<?> inclCls : INCL_CLASSES)
+            if (inclCls.isAssignableFrom(cls))
                 return false;
 
-        final Class<?>[] exc = EXCL_CLASSES;
-
-        // NOTE: don't use foreach for performance reasons.
-        for (int i = 0; i < exc.length; i++)
-            if (exc[i].isAssignableFrom(cls))
+        for (Class<?> exclCls : EXCL_CLASSES)
+            if (exclCls.isAssignableFrom(cls))
                 return true;
 
         return false;
@@ -155,4 +98,20 @@ public final class MarshallerExclusions {
     public static void clearCache() {
         cache = new GridBoundedConcurrentLinkedHashMap<>(512, 512, 0.75f, 16);
     }
+
+    /**
+     * Adds Ignite class included in serialization.
+     * @param cls Class to add.
+     */
+    public static void exclude(Class<?> cls) {
+        EXCL_CLASSES.add(cls);
+    }
+
+    /**
+     * Adds Ignite class included in serialization.
+     * @param cls Class to add.
+     */
+    public static void include(Class<?> cls) {
+        INCL_CLASSES.add(cls);
+    }
 }
diff --git 
a/modules/binary/api/src/main/java/org/apache/ignite/marshaller/Marshallers.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/Marshallers.java
new file mode 100644
index 00000000000..ef54a1452d9
--- /dev/null
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/Marshallers.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.marshaller;
+
+import java.util.Iterator;
+import org.apache.ignite.internal.util.CommonUtils;
+import org.apache.ignite.internal.util.typedef.internal.A;
+import org.apache.ignite.lang.IgnitePredicate;
+import org.apache.ignite.marshaller.jdk.JdkMarshaller;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Factory to create implementation of {@link Marshaller}.
+ */
+public class Marshallers {
+    /** Flag whether class caching should be used by the current thread. */
+    public static final ThreadLocal<Boolean> USE_CACHE = 
ThreadLocal.withInitial(() -> Boolean.TRUE);
+
+    /** Streams factory implementation. */
+    private static final MarshallersFactory factory;
+
+    static {
+        Iterator<MarshallersFactory> factories = 
CommonUtils.loadService(MarshallersFactory.class).iterator();
+
+        A.ensure(
+            factories.hasNext(),
+            "Implementation for MarshallersFactory service not found. Please 
add ignite-binary-impl to classpath"
+        );
+
+        factory = factories.next();
+    }
+
+    /** @return Default instance of {@link JdkMarshaller}. */
+    public static JdkMarshaller jdk() {
+        return factory.jdk();
+    }
+
+    /**
+     * @param clsFilter Class filter.
+     * @return Filtered instance of {@link JdkMarshaller}.
+     */
+    public static JdkMarshaller jdk(@Nullable IgnitePredicate<String> 
clsFilter) {
+        return factory.jdk(clsFilter);
+    }
+}
diff --git 
a/modules/core/src/test/java/org/apache/ignite/IgniteExternalizableAbstractTest.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/MarshallersFactory.java
similarity index 55%
copy from 
modules/core/src/test/java/org/apache/ignite/IgniteExternalizableAbstractTest.java
copy to 
modules/binary/api/src/main/java/org/apache/ignite/marshaller/MarshallersFactory.java
index ce22ead4a64..4500c703eb3 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/IgniteExternalizableAbstractTest.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/MarshallersFactory.java
@@ -15,30 +15,28 @@
  * limitations under the License.
  */
 
-package org.apache.ignite;
+package org.apache.ignite.marshaller;
 
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.ignite.internal.binary.BinaryMarshaller;
-import org.apache.ignite.marshaller.Marshaller;
+import java.util.ServiceLoader;
+import org.apache.ignite.internal.util.CommonUtils;
+import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
-import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.jetbrains.annotations.Nullable;
 
 /**
- * Base externalizable test class.
+ * Marshallers factory.
+ * Implementation loaded via {@link ServiceLoader} mechanism.
+ *
+ * @see CommonUtils#loadService(Class)
+ * @see JdkMarshaller
  */
-public class IgniteExternalizableAbstractTest extends GridCommonAbstractTest {
+public interface MarshallersFactory {
+    /** @return Default instance of {@link JdkMarshaller}. */
+    public JdkMarshaller jdk();
+
     /**
-     * @return Marshallers.
+     * @param clsFilter Class filter.
+     * @return Filtered instance of {@link JdkMarshaller}.
      */
-    protected List<Marshaller> getMarshallers() throws IgniteCheckedException {
-        List<Marshaller> marshallers = new ArrayList<>();
-
-        BinaryMarshaller bin = createStandaloneBinaryMarshaller();
-
-        marshallers.add(new JdkMarshaller());
-        marshallers.add(bin);
-
-        return marshallers;
-    }
+    public JdkMarshaller jdk(@Nullable IgnitePredicate<String> clsFilter);
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/package-info.java 
b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshaller.java
similarity index 80%
copy from 
modules/core/src/main/java/org/apache/ignite/marshaller/jdk/package-info.java
copy to 
modules/binary/api/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshaller.java
index f665bd1a53e..599f1873b03 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/package-info.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshaller.java
@@ -15,9 +15,12 @@
  * limitations under the License.
  */
 
+package org.apache.ignite.marshaller.jdk;
+
+import org.apache.ignite.marshaller.Marshaller;
+
 /**
- * <!-- Package description. -->
- * Contains JDK <tt>java.io</tt> based marshaller.
+ * Implementation of {@link org.apache.ignite.marshaller.Marshaller} based on 
JDK serialization mechanism.
  */
-
-package org.apache.ignite.marshaller.jdk;
+public interface JdkMarshaller extends Marshaller {
+}
diff --git 
a/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/package-info.java 
b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/jdk/package-info.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/marshaller/jdk/package-info.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/marshaller/jdk/package-info.java
diff --git 
a/modules/core/src/test/java/org/apache/ignite/IgniteExternalizableAbstractTest.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/MarshallersFactoryImpl.java
similarity index 54%
copy from 
modules/core/src/test/java/org/apache/ignite/IgniteExternalizableAbstractTest.java
copy to 
modules/binary/impl/src/main/java/org/apache/ignite/marshaller/MarshallersFactoryImpl.java
index ce22ead4a64..04a1224f8b3 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/IgniteExternalizableAbstractTest.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/MarshallersFactoryImpl.java
@@ -15,30 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.ignite;
+package org.apache.ignite.marshaller;
 
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.ignite.internal.binary.BinaryMarshaller;
-import org.apache.ignite.marshaller.Marshaller;
+import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
-import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.apache.ignite.marshaller.jdk.JdkMarshallerImpl;
+import org.jetbrains.annotations.Nullable;
 
 /**
- * Base externalizable test class.
+ * Marshallers factory implementation.
  */
-public class IgniteExternalizableAbstractTest extends GridCommonAbstractTest {
-    /**
-     * @return Marshallers.
-     */
-    protected List<Marshaller> getMarshallers() throws IgniteCheckedException {
-        List<Marshaller> marshallers = new ArrayList<>();
+public class MarshallersFactoryImpl implements MarshallersFactory {
+    /** Singleton instance. */
+    private static final JdkMarshaller INSTANCE = new JdkMarshallerImpl();
 
-        BinaryMarshaller bin = createStandaloneBinaryMarshaller();
-
-        marshallers.add(new JdkMarshaller());
-        marshallers.add(bin);
+    /** {@inheritDoc} */
+    @Override public JdkMarshaller jdk() {
+        return INSTANCE;
+    }
 
-        return marshallers;
+    /** {@inheritDoc} */
+    @Override public JdkMarshaller jdk(@Nullable IgnitePredicate<String> 
clsFilter) {
+        return clsFilter == null ? INSTANCE : new JdkMarshallerImpl(clsFilter);
     }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerDummySerializable.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerDummySerializable.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerDummySerializable.java
rename to 
modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerDummySerializable.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshaller.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerImpl.java
similarity index 93%
rename from 
modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshaller.java
rename to 
modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerImpl.java
index e3e94e12694..a7630a170e9 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshaller.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerImpl.java
@@ -21,7 +21,6 @@ import java.io.InputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.OutputStream;
-import org.apache.ignite.IgniteBinary;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.util.io.GridByteArrayInputStream;
 import org.apache.ignite.internal.util.io.GridByteArrayOutputStream;
@@ -38,7 +37,7 @@ import org.jetbrains.annotations.Nullable;
  * This marshaller has no mandatory configuration parameters.
  * <h2 class="header">Java Example</h2>
  * {@code JdkMarshaller} needs to be explicitly configured to override default 
<b>binary marshaller</b> -
- * see {@link IgniteBinary}.
+ * see {@code IgniteBinary}.
  * <pre name="code" class="java">
  * JdkMarshaller marshaller = new JdkMarshaller();
  *
@@ -56,7 +55,7 @@ import org.jetbrains.annotations.Nullable;
  * &lt;bean id="grid.custom.cfg" 
class="org.apache.ignite.configuration.IgniteConfiguration" singleton="true"&gt;
  *     ...
  *     &lt;property name="marshaller"&gt;
- *         &lt;bean class="org.apache.ignite.marshaller.jdk.JdkMarshaller"/&gt;
+ *         &lt;bean 
class="org.apache.ignite.marshaller.MarshallersFactory"/&gt;
  *     &lt;/property&gt;
  *     ...
  * &lt;/bean&gt;
@@ -66,7 +65,7 @@ import org.jetbrains.annotations.Nullable;
  * <br>
  * For information about Spring framework visit <a 
href="http://www.springframework.org/";>www.springframework.org</a>
  */
-public class JdkMarshaller extends AbstractNodeNameAwareMarshaller {
+public class JdkMarshallerImpl extends AbstractNodeNameAwareMarshaller 
implements JdkMarshaller {
     /** Class name filter. */
     private final IgnitePredicate<String> clsFilter;
 
@@ -75,14 +74,14 @@ public class JdkMarshaller extends 
AbstractNodeNameAwareMarshaller {
      * Use this constructor with caution. It creates a JdkMarshaller instance 
that has class filtering DISABLED. Therefore,
      * if it will be used on the server side to unmarshal user data received 
from the network, it may lead to security breaches.
      */
-    public JdkMarshaller() {
+    public JdkMarshallerImpl() {
         this(null);
     }
 
     /**
      * @param clsFilter Class name filter.
      */
-    public JdkMarshaller(IgnitePredicate<String> clsFilter) {
+    public JdkMarshallerImpl(@Nullable IgnitePredicate<String> clsFilter) {
         this.clsFilter = clsFilter;
     }
 
@@ -146,6 +145,6 @@ public class JdkMarshaller extends 
AbstractNodeNameAwareMarshaller {
 
     /** {@inheritDoc} */
     @Override public String toString() {
-        return S.toString(JdkMarshaller.class, this);
+        return S.toString(JdkMarshallerImpl.class, this);
     }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerInputStreamWrapper.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerInputStreamWrapper.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerInputStreamWrapper.java
rename to 
modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerInputStreamWrapper.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java
similarity index 86%
rename from 
modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java
rename to 
modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java
index 7e7c8f107e2..61ff5f59a6c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java
@@ -21,8 +21,10 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectStreamClass;
-import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.util.CommonUtils;
 import org.apache.ignite.lang.IgnitePredicate;
+import org.apache.ignite.marshaller.Marshallers;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * This class defines custom JDK object input stream.
@@ -37,9 +39,10 @@ class JdkMarshallerObjectInputStream extends 
ObjectInputStream {
     /**
      * @param in Parent input stream.
      * @param clsLdr Custom class loader.
+     * @param clsFilter Class filter lambda.
      * @throws IOException If initialization failed.
      */
-    JdkMarshallerObjectInputStream(InputStream in, ClassLoader clsLdr, 
IgnitePredicate<String> clsFilter) throws IOException {
+    JdkMarshallerObjectInputStream(InputStream in, ClassLoader clsLdr, 
@Nullable IgnitePredicate<String> clsFilter) throws IOException {
         super(in);
 
         assert clsLdr != null;
@@ -56,7 +59,7 @@ class JdkMarshallerObjectInputStream extends 
ObjectInputStream {
         // Must have 'Class.forName()' instead of clsLoader.loadClass()
         // due to weird ClassNotFoundExceptions for arrays of classes
         // in certain cases.
-        return U.forName(desc.getName(), clsLdr, clsFilter);
+        return CommonUtils.forName(desc.getName(), clsLdr, clsFilter, 
Marshallers.USE_CACHE.get());
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectOutputStream.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectOutputStream.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectOutputStream.java
rename to 
modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectOutputStream.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerOutputStreamWrapper.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerOutputStreamWrapper.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerOutputStreamWrapper.java
rename to 
modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerOutputStreamWrapper.java
diff --git 
a/modules/binary/impl/src/main/resources/META-INF/services/org.apache.ignite.marshaller.MarshallersFactory
 
b/modules/binary/impl/src/main/resources/META-INF/services/org.apache.ignite.marshaller.MarshallersFactory
new file mode 100644
index 00000000000..1fd84962a65
--- /dev/null
+++ 
b/modules/binary/impl/src/main/resources/META-INF/services/org.apache.ignite.marshaller.MarshallersFactory
@@ -0,0 +1 @@
+org.apache.ignite.marshaller.MarshallersFactoryImpl
\ No newline at end of file
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/TestMemcacheClient.java
 
b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/TestMemcacheClient.java
index 046cd82d3e3..18dcd66ed6e 100644
--- 
a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/TestMemcacheClient.java
+++ 
b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/TestMemcacheClient.java
@@ -31,10 +31,11 @@ import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.logger.java.JavaLogger;
 import org.apache.ignite.marshaller.Marshaller;
-import org.apache.ignite.marshaller.jdk.JdkMarshaller;
+import org.apache.ignite.marshaller.Marshallers;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -75,7 +76,7 @@ final class TestMemcacheClient {
     private final IgniteLogger log = new JavaLogger();
 
     /** JDK marshaller. */
-    private final Marshaller jdkMarshaller = new JdkMarshaller();
+    private final Marshaller jdkMarshaller = Marshallers.jdk();
 
     /** Socket. */
     private final Socket sock;
@@ -444,13 +445,13 @@ final class TestMemcacheClient {
         }
 
         if (cacheNameBytes != null)
-            U.arrayCopy(cacheNameBytes, 0, packet, HDR_LEN + 
cmd.extrasLength(), cacheNameLength);
+            GridUnsafe.arrayCopy(cacheNameBytes, 0, packet, HDR_LEN + 
cmd.extrasLength(), cacheNameLength);
 
         if (keyData.getBytes() != null)
-            U.arrayCopy(keyData.getBytes(), 0, packet, HDR_LEN + extrasLength, 
keyData.length());
+            GridUnsafe.arrayCopy(keyData.getBytes(), 0, packet, HDR_LEN + 
extrasLength, keyData.length());
 
         if (valData.getBytes() != null)
-            U.arrayCopy(valData.getBytes(), 0, packet, HDR_LEN + extrasLength 
+ keyData.length(), valData.length());
+            GridUnsafe.arrayCopy(valData.getBytes(), 0, packet, HDR_LEN + 
extrasLength + keyData.length(), valData.length());
 
         return packet;
     }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheClassLoaderMarker.java
 
b/modules/commons/src/main/java/org/apache/ignite/internal/processors/cache/CacheClassLoaderMarker.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheClassLoaderMarker.java
rename to 
modules/commons/src/main/java/org/apache/ignite/internal/processors/cache/CacheClassLoaderMarker.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/ClassCache.java 
b/modules/commons/src/main/java/org/apache/ignite/internal/util/ClassCache.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/util/ClassCache.java
rename to 
modules/commons/src/main/java/org/apache/ignite/internal/util/ClassCache.java
diff --git 
a/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java
 
b/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java
index 820035ac29d..2b1c7ccc6e3 100644
--- 
a/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java
+++ 
b/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java
@@ -26,13 +26,19 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.ServiceLoader;
 import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.TimeUnit;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteCommonsSystemProperties;
+import org.apache.ignite.internal.processors.cache.CacheClassLoaderMarker;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.A;
+import org.apache.ignite.lang.IgnitePredicate;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -84,7 +90,37 @@ public abstract class CommonUtils {
     /** Mutex. */
     static final Object mux = new Object();
 
+    /** Empty local Ignite name. */
+    public static final String LOC_IGNITE_NAME_EMPTY = new String();
+
+    /** Local Ignite name thread local. */
+    private static final ThreadLocal<String> LOC_IGNITE_NAME = new 
ThreadLocal<String>() {
+        @Override protected String initialValue() {
+            return LOC_IGNITE_NAME_EMPTY;
+        }
+    };
+
+    /** Class loader used to load Ignite. */
+    private static final ClassLoader gridClassLoader = 
CommonUtils.class.getClassLoader();
+
+    /** Primitive class map. */
+    private static final Map<String, Class<?>> primitiveMap = new 
HashMap<>(16, .5f);
+
+    /** */
+    private static final ConcurrentMap<ClassLoader, ConcurrentMap<String, 
Class>> classCache =
+        new ConcurrentHashMap<>();
+
     static {
+        primitiveMap.put("byte", byte.class);
+        primitiveMap.put("short", short.class);
+        primitiveMap.put("int", int.class);
+        primitiveMap.put("long", long.class);
+        primitiveMap.put("float", float.class);
+        primitiveMap.put("double", double.class);
+        primitiveMap.put("char", char.class);
+        primitiveMap.put("boolean", boolean.class);
+        primitiveMap.put("void", void.class);
+
         try {
             OBJECT_CTOR = Object.class.getConstructor();
         }
@@ -455,4 +491,253 @@ public abstract class CommonUtils {
 
         return null;
     }
+
+    /**
+     * Get current Ignite name.
+     *
+     * @return Current Ignite name.
+     */
+    @Nullable public static String getCurrentIgniteName() {
+        return LOC_IGNITE_NAME.get();
+    }
+
+    /**
+     * Check if current Ignite name is set.
+     *
+     * @param name Name to check.
+     * @return {@code True} if set.
+     */
+    @SuppressWarnings("StringEquality")
+    public static boolean isCurrentIgniteNameSet(@Nullable String name) {
+        return name != LOC_IGNITE_NAME_EMPTY;
+    }
+
+    /**
+     * Set current Ignite name.
+     *
+     * @param newName New name.
+     * @return Old name.
+     */
+    @SuppressWarnings("StringEquality")
+    @Nullable public static String setCurrentIgniteName(@Nullable String 
newName) {
+        String oldName = LOC_IGNITE_NAME.get();
+
+        if (oldName != newName)
+            LOC_IGNITE_NAME.set(newName);
+
+        return oldName;
+    }
+
+    /**
+     * Restore old Ignite name.
+     *
+     * @param oldName Old name.
+     * @param curName Current name.
+     */
+    @SuppressWarnings("StringEquality")
+    public static void restoreOldIgniteName(@Nullable String oldName, 
@Nullable String curName) {
+        if (oldName != curName)
+            LOC_IGNITE_NAME.set(oldName);
+    }
+
+    /**
+     * @return Class loader used to load Ignite itself.
+     */
+    public static ClassLoader gridClassLoader() {
+        return gridClassLoader;
+    }
+
+    /**
+     * @param ldr Custom class loader.
+     * @param cfgLdr Class loader from config.
+     * @return ClassLoader passed as param in case it is not null or cfgLdr  
in case it is not null or ClassLoader used to start Ignite.
+     */
+    public static ClassLoader resolveClassLoader(@Nullable ClassLoader ldr, 
@Nullable ClassLoader cfgLdr) {
+        return (ldr != null && ldr != gridClassLoader)
+            ? ldr
+            : cfgLdr != null
+                ? cfgLdr
+                : gridClassLoader;
+    }
+
+    /**
+     * Tests whether given class is loadable by provided class loader.
+     *
+     * @param clsName Class name to test.
+     * @param ldr Class loader to test with. If {@code null} - we'll use 
system class loader instead.
+     *      If System class loader is not set - this method will return {@code 
false}.
+     * @return {@code True} if class is loadable, {@code false} otherwise.
+     */
+    public static boolean isLoadableBy(String clsName, @Nullable ClassLoader 
ldr) {
+        assert clsName != null;
+
+        if (ldr == null)
+            ldr = gridClassLoader;
+
+        String lambdaParent = lambdaEnclosingClassName(clsName);
+
+        try {
+            ldr.loadClass(lambdaParent == null ? clsName : lambdaParent);
+
+            return true;
+        }
+        catch (ClassNotFoundException ignore) {
+            return false;
+        }
+    }
+
+    /**
+     * Gets a class for a given name if it can be loaded or a given default 
class otherwise.
+     *
+     * @param cls Class.
+     * @param dflt Default class to return.
+     * @return Class or default given class if it can't be found.
+     */
+    @Nullable public static Class<?> classForName(@Nullable String cls, 
@Nullable Class<?> dflt) {
+        return classForName(cls, dflt, false);
+    }
+
+    /**
+     * Gets a class for a given name if it can be loaded or a given default 
class otherwise.
+     *
+     * @param cls Class.
+     * @param dflt Default class to return.
+     * @param includePrimitiveTypes Whether class resolution should include 
primitive types
+     *                              (i.e. "int" will resolve to int.class if 
flag is set)
+     * @return Class or default given class if it can't be found.
+     */
+    @Nullable public static Class<?> classForName(
+        @Nullable String cls,
+        @Nullable Class<?> dflt,
+        boolean includePrimitiveTypes
+    ) {
+        Class<?> clazz;
+        if (cls == null)
+            clazz = dflt;
+        else if (!includePrimitiveTypes || cls.length() > 7 || (clazz = 
primitiveMap.get(cls)) == null) {
+            try {
+                clazz = Class.forName(cls);
+            }
+            catch (ClassNotFoundException ignore) {
+                clazz = dflt;
+            }
+        }
+        return clazz;
+    }
+
+    /**
+     * Gets class for provided name. Accepts primitive types names.
+     *
+     * @param clsName Class name.
+     * @param ldr Class loader.
+     * @param useCache If true class loader and result should be cached 
internally, false otherwise.
+     * @return Class.
+     * @throws ClassNotFoundException If class not found.
+     */
+    public static Class<?> forName(
+        String clsName,
+        @Nullable ClassLoader ldr,
+        @Nullable IgnitePredicate<String> clsFilter,
+        boolean useCache
+    ) throws ClassNotFoundException {
+        assert clsName != null;
+
+        Class<?> cls = primitiveMap.get(clsName);
+
+        if (cls != null)
+            return cls;
+
+        if (ldr != null) {
+            if (ldr instanceof ClassCache)
+                return ((ClassCache)ldr).getFromCache(clsName);
+            else if (!useCache) {
+                cls = Class.forName(clsName, true, ldr);
+
+                return cls;
+            }
+        }
+        else
+            ldr = gridClassLoader;
+
+        if (!useCache) {
+            cls = Class.forName(clsName, true, ldr);
+
+            return cls;
+        }
+
+        ConcurrentMap<String, Class> ldrMap = classCache.get(ldr);
+
+        if (ldrMap == null) {
+            ConcurrentMap<String, Class> old = classCache.putIfAbsent(ldr, 
ldrMap = new ConcurrentHashMap<>());
+
+            if (old != null)
+                ldrMap = old;
+        }
+
+        cls = ldrMap.get(clsName);
+
+        if (cls == null) {
+            if (clsFilter != null && !clsFilter.apply(clsName))
+                throw new ClassNotFoundException("Deserialization of class " + 
clsName + " is disallowed.");
+
+            // Avoid class caching inside Class.forName
+            if (ldr instanceof CacheClassLoaderMarker)
+                cls = ldr.loadClass(clsName);
+            else
+                cls = Class.forName(clsName, true, ldr);
+
+            Class old = ldrMap.putIfAbsent(clsName, cls);
+
+            if (old != null)
+                cls = old;
+        }
+
+        return cls;
+    }
+
+    /**
+     * Clears class associated with provided class loader from class cache.
+     *
+     * @param ldr Class loader.
+     * @param clsName Class name of clearing class.
+     */
+    public static void clearClassFromClassCache(ClassLoader ldr, String 
clsName) {
+        ConcurrentMap<String, Class> map = classCache.get(ldr);
+
+        if (map != null)
+            map.remove(clsName);
+    }
+
+    /**
+     * Clears class cache for provided loader.
+     *
+     * @param ldr Class loader.
+     */
+    public static void clearClassCache(ClassLoader ldr) {
+        classCache.remove(ldr);
+    }
+
+    /**
+     * Completely clears class cache.
+     */
+    public static void clearClassCache() {
+        classCache.clear();
+    }
+
+    /**
+     * Extracts full name of enclosing class from JDK8 lambda class name.
+     *
+     * @param clsName JDK8 lambda class name.
+     * @return Full name of enclosing class for JDK8 lambda class name or
+     *      {@code null} if passed in name is not related to lambda.
+     */
+    @Nullable public static String lambdaEnclosingClassName(String clsName) {
+        int idx0 = clsName.indexOf("$$Lambda$"); // Java 8+
+        int idx1 = clsName.indexOf("$$Lambda/"); // Java 21+
+
+        if (idx0 == idx1)
+            return null;
+
+        return clsName.substring(0, idx0 >= 0 ? idx0 : idx1);
+    }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheJdbcBlobStore.java
 
b/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheJdbcBlobStore.java
index b8ad5eb1621..8074a354ba8 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheJdbcBlobStore.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheJdbcBlobStore.java
@@ -45,7 +45,7 @@ import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.marshaller.Marshaller;
-import org.apache.ignite.marshaller.jdk.JdkMarshaller;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.resources.CacheStoreSessionResource;
 import org.apache.ignite.resources.IgniteInstanceResource;
 import org.apache.ignite.resources.LoggerResource;
@@ -109,7 +109,7 @@ public class CacheJdbcBlobStore<K, V> extends 
CacheStoreAdapter<K, V> {
     private static final String ATTR_CONN = "JDBC_STORE_CONNECTION";
 
     /** Marshaller. */
-    private static final Marshaller marsh = new JdkMarshaller();
+    private static final Marshaller marsh = Marshallers.jdk();
 
     /** Connection URL. */
     private String connUrl = DFLT_CONN_URL;
diff --git a/modules/core/src/main/java/org/apache/ignite/dump/DumpReader.java 
b/modules/core/src/main/java/org/apache/ignite/dump/DumpReader.java
index 58289bd4b29..1c165ac7d48 100644
--- a/modules/core/src/main/java/org/apache/ignite/dump/DumpReader.java
+++ b/modules/core/src/main/java/org/apache/ignite/dump/DumpReader.java
@@ -58,6 +58,7 @@ import org.apache.ignite.internal.util.typedef.internal.CU;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.lang.IgniteExperimental;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 import org.apache.ignite.spi.IgniteSpiAdapter;
 import org.apache.ignite.spi.encryption.EncryptionSpi;
@@ -320,7 +321,7 @@ public class DumpReader implements Runnable {
      * @return List of snapshot metadata saved in {@code #dumpDir}.
      */
     public static List<SnapshotMetadata> metadata(File dumpDir) {
-        JdkMarshaller marsh = new JdkMarshaller();
+        JdkMarshaller marsh = Marshallers.jdk();
 
         ClassLoader clsLdr = U.resolveClassLoader(new IgniteConfiguration());
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
index 39e8f557d2a..28131e156d0 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
@@ -32,11 +32,18 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ExecutorService;
 import java.util.function.BiPredicate;
 import java.util.function.Function;
+import javax.management.MBeanServer;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.compute.ComputeJobContext;
+import org.apache.ignite.compute.ComputeLoadBalancer;
+import org.apache.ignite.compute.ComputeTaskContinuousMapper;
+import org.apache.ignite.compute.ComputeTaskSession;
+import org.apache.ignite.internal.executor.GridExecutorService;
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap;
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap;
 import 
org.apache.ignite.internal.processors.cache.persistence.filename.SharedFileTree;
@@ -51,8 +58,11 @@ import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.CU;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgnitePredicate;
+import org.apache.ignite.marshaller.Marshaller;
 import org.apache.ignite.marshaller.MarshallerContext;
+import org.apache.ignite.marshaller.MarshallerExclusions;
 import org.apache.ignite.marshaller.MarshallerUtils;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 import org.apache.ignite.plugin.PluginProvider;
 import org.jetbrains.annotations.NotNull;
@@ -108,9 +118,10 @@ public class MarshallerContextImpl implements 
MarshallerContext {
      */
     public MarshallerContextImpl(@Nullable Collection<PluginProvider> plugins, 
IgnitePredicate<String> clsFilter) {
         this.clsFilter = clsFilter;
-        this.jdkMarsh = new JdkMarshaller(clsFilter);
+        this.jdkMarsh = Marshallers.jdk(clsFilter);
 
         initializeCaches();
+        initializeMarshallerExclusions();
 
         try {
             ClassLoader ldr = U.gridClassLoader();
@@ -143,6 +154,35 @@ public class MarshallerContextImpl implements 
MarshallerContext {
         }
     }
 
+    /** */
+    private void initializeMarshallerExclusions() {
+        try {
+            
MarshallerExclusions.exclude(Class.forName("org.springframework.context.ApplicationContext"));
+        }
+        catch (Exception ignored) {
+            // No-op.
+        }
+
+        // Non-Ignite classes.
+        MarshallerExclusions.exclude(MBeanServer.class);
+        MarshallerExclusions.exclude(ExecutorService.class);
+        MarshallerExclusions.exclude(ClassLoader.class);
+        MarshallerExclusions.exclude(Thread.class);
+
+        // Ignite classes.
+        MarshallerExclusions.exclude(IgniteLogger.class);
+        MarshallerExclusions.exclude(ComputeTaskSession.class);
+        MarshallerExclusions.exclude(ComputeLoadBalancer.class);
+        MarshallerExclusions.exclude(ComputeJobContext.class);
+        MarshallerExclusions.exclude(Marshaller.class);
+        MarshallerExclusions.exclude(GridComponent.class);
+        MarshallerExclusions.exclude(ComputeTaskContinuousMapper.class);
+
+        // Ignite classes.
+        MarshallerExclusions.include(GridLoggerProxy.class);
+        MarshallerExclusions.include(GridExecutorService.class);
+    }
+
     /** */
     private void initializeCaches() {
         allCaches.add(new CombinedMap(new ConcurrentHashMap<Integer, 
MappedName>(), sysTypesMap));
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryArray.java 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryArray.java
index fef7e7d746a..8279fc48f1c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryArray.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryArray.java
@@ -35,6 +35,7 @@ import 
org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.marshaller.Marshallers;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -106,7 +107,7 @@ class BinaryArray implements BinaryObjectEx, 
Externalizable, Comparable<BinaryAr
         ClassLoader resolveLdr = ldr == null ? ctx.classLoader() : ldr;
 
         if (ldr != null)
-            GridBinaryMarshaller.USE_CACHE.set(Boolean.FALSE);
+            Marshallers.USE_CACHE.set(Boolean.FALSE);
 
         try {
             Class<?> compType = BinaryUtils.resolveClass(ctx, compTypeId, 
compClsName, resolveLdr, false);
@@ -130,7 +131,7 @@ class BinaryArray implements BinaryObjectEx, 
Externalizable, Comparable<BinaryAr
             return (T)deserialized;
         }
         finally {
-            GridBinaryMarshaller.USE_CACHE.set(Boolean.TRUE);
+            Marshallers.USE_CACHE.set(Boolean.TRUE);
         }
     }
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
index 4670e73f515..81b8035a3e3 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
@@ -71,6 +71,7 @@ import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.marshaller.MarshallerContext;
+import org.apache.ignite.marshaller.Marshallers;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -727,7 +728,7 @@ public class BinaryContext {
         Class cls;
 
         try {
-            if (GridBinaryMarshaller.USE_CACHE.get()) {
+            if (Marshallers.USE_CACHE.get()) {
                 cls = marshCtx.getClass(typeId, ldr);
 
                 desc = descByCls.get(cls);
@@ -823,7 +824,7 @@ public class BinaryContext {
         else {
             BinaryClassDescriptor regDesc = desc.makeRegistered();
 
-            if (GridBinaryMarshaller.USE_CACHE.get()) {
+            if (Marshallers.USE_CACHE.get()) {
                 BinaryClassDescriptor old = 
descByCls.putIfAbsent(desc.describedClass(), regDesc);
 
                 if (old != null)
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryEnumObjectImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryEnumObjectImpl.java
index 4d69956edff..6814a9e63ff 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryEnumObjectImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryEnumObjectImpl.java
@@ -33,9 +33,11 @@ import 
org.apache.ignite.internal.processors.cache.CacheObjectAdapter;
 import org.apache.ignite.internal.processors.cache.CacheObjectContext;
 import org.apache.ignite.internal.processors.cache.CacheObjectValueContext;
 import 
org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl;
+import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.SB;
 import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.plugin.extensions.communication.MessageReader;
 import org.apache.ignite.plugin.extensions.communication.MessageWriter;
 import org.jetbrains.annotations.Nullable;
@@ -108,7 +110,7 @@ class BinaryEnumObjectImpl implements BinaryObjectEx, 
Externalizable, CacheObjec
 
             valBytes[0] = GridBinaryMarshaller.ENUM;
 
-            U.arrayCopy(arr, 1, valBytes, 1, arr.length - 1);
+            GridUnsafe.arrayCopy(arr, 1, valBytes, 1, arr.length - 1);
         }
 
         this.ctx = ctx;
@@ -176,7 +178,7 @@ class BinaryEnumObjectImpl implements BinaryObjectEx, 
Externalizable, CacheObjec
         ClassLoader resolveLdr = ldr == null ? ctx.classLoader() : ldr;
 
         if (ldr != null)
-            GridBinaryMarshaller.USE_CACHE.set(Boolean.FALSE);
+            Marshallers.USE_CACHE.set(Boolean.FALSE);
 
         try {
             Class cls = BinaryUtils.resolveClass(ctx, typeId, clsName, 
resolveLdr, false);
@@ -184,7 +186,7 @@ class BinaryEnumObjectImpl implements BinaryObjectEx, 
Externalizable, CacheObjec
             return (T)(ldr == null ? BinaryEnumCache.get(cls, ord) : 
uncachedValue(cls));
         }
         finally {
-            GridBinaryMarshaller.USE_CACHE.set(Boolean.TRUE);
+            Marshallers.USE_CACHE.set(Boolean.TRUE);
         }
 
     }
@@ -197,7 +199,7 @@ class BinaryEnumObjectImpl implements BinaryObjectEx, 
Externalizable, CacheObjec
     private <T> T uncachedValue(Class<?> cls) throws BinaryObjectException {
         assert cls != null;
 
-        assert !GridBinaryMarshaller.USE_CACHE.get();
+        assert !Marshallers.USE_CACHE.get();
 
         if (ord >= 0) {
             Object[] vals = cls.getEnumConstants();
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
index 5cbd148c31b..5c6ed595d19 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
@@ -43,8 +43,9 @@ import 
org.apache.ignite.internal.processors.cache.CacheObjectTransformerUtils;
 import org.apache.ignite.internal.processors.cache.CacheObjectValueContext;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
 import 
org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl;
+import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.plugin.extensions.communication.MessageReader;
 import org.apache.ignite.plugin.extensions.communication.MessageWriter;
 import org.jetbrains.annotations.Nullable;
@@ -309,7 +310,7 @@ final class BinaryObjectImpl extends BinaryObjectExImpl 
implements Externalizabl
 
         byte[] detachedData = new byte[len];
 
-        U.arrayCopy(arr, start, detachedData, 0, len);
+        GridUnsafe.arrayCopy(arr, start, detachedData, 0, len);
 
         return new BinaryObjectImpl(ctx, detachedData, 0);
     }
@@ -728,13 +729,13 @@ final class BinaryObjectImpl extends BinaryObjectExImpl 
implements Externalizabl
         if (ldr == null)
             return deserialize();
 
-        GridBinaryMarshaller.USE_CACHE.set(Boolean.FALSE);
+        Marshallers.USE_CACHE.set(Boolean.FALSE);
 
         try {
             return (T)reader(null, ldr, true).deserialize();
         }
         finally {
-            GridBinaryMarshaller.USE_CACHE.set(Boolean.TRUE);
+            Marshallers.USE_CACHE.set(Boolean.TRUE);
         }
     }
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
index 40ff9130c45..e5778190f52 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
@@ -40,6 +40,7 @@ import 
org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.cache.CacheObjectContext;
 import org.apache.ignite.internal.processors.cache.CacheObjectValueContext;
 import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.plugin.extensions.communication.MessageReader;
 import org.apache.ignite.plugin.extensions.communication.MessageWriter;
 import org.jetbrains.annotations.Nullable;
@@ -416,13 +417,13 @@ class BinaryObjectOffheapImpl extends BinaryObjectExImpl 
implements Externalizab
         if (ldr == null)
             return deserialize();
 
-        GridBinaryMarshaller.USE_CACHE.set(Boolean.FALSE);
+        Marshallers.USE_CACHE.set(Boolean.FALSE);
 
         try {
             return (T)reader(null, ldr, true).deserialize();
         }
         finally {
-            GridBinaryMarshaller.USE_CACHE.set(Boolean.TRUE);
+            Marshallers.USE_CACHE.set(Boolean.TRUE);
         }
     }
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
index 025e33eb52f..aad7833d34d 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
@@ -39,6 +39,7 @@ import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.SB;
 import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.marshaller.Marshallers;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -1399,7 +1400,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
             if (cls == null)
                 cls = cls0;
 
-            return BinaryUtils.doReadEnum(in, cls, 
GridBinaryMarshaller.USE_CACHE.get());
+            return BinaryUtils.doReadEnum(in, cls, 
Marshallers.USE_CACHE.get());
         }
         else
             return null;
@@ -1923,7 +1924,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
 
             case ENUM:
                 obj = BinaryUtils.doReadEnum(in, BinaryUtils.doReadClass(in, 
ctx, ldr),
-                    GridBinaryMarshaller.USE_CACHE.get());
+                    Marshallers.USE_CACHE.get());
 
                 break;
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
index a20482004ca..aa2f44abd9d 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
@@ -81,6 +81,7 @@ import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.T2;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteBiTuple;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.platform.PlatformType;
 import org.apache.ignite.plugin.extensions.communication.Message;
 import org.jetbrains.annotations.Nullable;
@@ -1594,7 +1595,7 @@ public class BinaryUtils {
             cls = ctx.descriptorForTypeId(true, typeId, ldr, 
false).describedClass();
         else {
             String clsName = doReadClassName(in);
-            boolean useCache = GridBinaryMarshaller.USE_CACHE.get();
+            boolean useCache = Marshallers.USE_CACHE.get();
 
             try {
                 cls = U.forName(clsName, ldr, null);
@@ -1788,7 +1789,7 @@ public class BinaryUtils {
             if (flag == GridBinaryMarshaller.NULL)
                 arr[i] = null;
             else
-                arr[i] = doReadEnum(in, doReadClass(in, ctx, ldr), 
GridBinaryMarshaller.USE_CACHE.get());
+                arr[i] = doReadEnum(in, doReadClass(in, ctx, ldr), 
Marshallers.USE_CACHE.get());
         }
 
         return arr;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java
index 4ebac2bd59a..95e80e82a2a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java
@@ -42,9 +42,6 @@ public class GridBinaryMarshaller {
     private static final ThreadLocal<BinaryContextHolder> BINARY_CTX =
         ThreadLocal.withInitial(BinaryContextHolder::new);
 
-    /** Flag whether class caching should be used by the current thread. */
-    public static final ThreadLocal<Boolean> USE_CACHE = 
ThreadLocal.withInitial(() -> Boolean.TRUE);
-
     /** */
     public static final byte TRANSFORMED = -3;
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java
index 15d9e0c3e82..0bef412ca93 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java
@@ -78,6 +78,7 @@ import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.logger.NullLogger;
 import org.apache.ignite.marshaller.MarshallerContext;
 import org.apache.ignite.marshaller.MarshallerUtils;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 import org.jetbrains.annotations.Nullable;
 
@@ -881,7 +882,7 @@ public class TcpIgniteClient implements IgniteClient {
 
         /** {@inheritDoc} */
         @Override public JdkMarshaller jdkMarshaller() {
-            return new JdkMarshaller();
+            return Marshallers.jdk();
         }
 
         /**
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java
index 9af01eaaa45..1ce478c7c86 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java
@@ -126,6 +126,7 @@ import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.lang.IgniteProductVersion;
 import org.apache.ignite.logger.NullLogger;
 import org.apache.ignite.marshaller.MarshallerContext;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 import org.apache.ignite.thread.IgniteThreadFactory;
 import org.apache.ignite.transactions.TransactionIsolation;
@@ -2465,7 +2466,7 @@ public class JdbcThinConnection implements Connection {
 
         /** {@inheritDoc} */
         @Override public JdkMarshaller jdkMarshaller() {
-            return new JdkMarshaller();
+            return Marshallers.jdk();
         }
     }
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcBinaryBuffer.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcBinaryBuffer.java
index f6d1839ac07..5948ecf7458 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcBinaryBuffer.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcBinaryBuffer.java
@@ -21,7 +21,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.Objects;
-import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.util.GridUnsafe;
 
 import static org.apache.ignite.internal.util.CommonUtils.MAX_ARRAY_SIZE;
 
@@ -195,7 +195,7 @@ public class JdbcBinaryBuffer {
 
         int size = Math.min(resLen, len - pos);
 
-        U.arrayCopy(arr, bufOff, resBuf, resOff, size);
+        GridUnsafe.arrayCopy(arr, bufOff, resBuf, resOff, size);
 
         return size;
     }
@@ -217,7 +217,7 @@ public class JdbcBinaryBuffer {
 
         updateLength(Math.max(pos + inpLen, len));
 
-        U.arrayCopy(inpBuf, inpOff, arr, pos, inpLen);
+        GridUnsafe.arrayCopy(inpBuf, inpOff, arr, pos, inpLen);
     }
 
     /**
@@ -294,7 +294,7 @@ public class JdbcBinaryBuffer {
     private void reallocate(int newCapacity) {
         byte[] newBuf = new byte[newCapacity];
 
-        U.arrayCopy(arr, off, newBuf, 0, len);
+        GridUnsafe.arrayCopy(arr, off, newBuf, 0, len);
 
         arr = newBuf;
         off = 0;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcClob.java 
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcClob.java
index ecef1abd6ab..7336006244e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcClob.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcClob.java
@@ -25,7 +25,7 @@ import java.io.Writer;
 import java.sql.Clob;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
-import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.util.GridUnsafe;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 
@@ -285,7 +285,7 @@ public class JdbcClob implements Clob {
 
                 int encodedChunkSize = Math.min(len - i, buf.length - bufPos);
 
-                U.arrayCopy(buf, bufPos, b, off + i, encodedChunkSize);
+                GridUnsafe.arrayCopy(buf, bufPos, b, off + i, 
encodedChunkSize);
 
                 bufPos += encodedChunkSize;
                 i += encodedChunkSize;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedClassDescriptor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedClassDescriptor.java
index 1125622a325..67747d00807 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedClassDescriptor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedClassDescriptor.java
@@ -45,12 +45,11 @@ import java.util.Map;
 import java.util.Properties;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentMap;
-
-import org.apache.ignite.internal.binary.GridBinaryMarshaller;
 import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.marshaller.MarshallerContext;
 import org.apache.ignite.marshaller.MarshallerExclusions;
+import org.apache.ignite.marshaller.Marshallers;
 
 import static java.lang.reflect.Modifier.isFinal;
 import static java.lang.reflect.Modifier.isPrivate;
@@ -725,7 +724,7 @@ class OptimizedClassDescriptor {
             case OBJ_ARR:
                 OptimizedClassDescriptor compDesc = 
OptimizedMarshallerUtils.classDescriptor(clsMap,
                     obj.getClass().getComponentType(),
-                    GridBinaryMarshaller.USE_CACHE.get(),
+                    Marshallers.USE_CACHE.get(),
                     ctx,
                     mapper);
 
@@ -787,7 +786,7 @@ class OptimizedClassDescriptor {
 
             case CLS:
                 OptimizedClassDescriptor clsDesc = 
OptimizedMarshallerUtils.classDescriptor(
-                    clsMap, (Class<?>)obj, 
GridBinaryMarshaller.USE_CACHE.get(), ctx, mapper);
+                    clsMap, (Class<?>)obj, Marshallers.USE_CACHE.get(), ctx, 
mapper);
 
                 clsDesc.writeTypeData(out);
 
@@ -798,7 +797,7 @@ class OptimizedClassDescriptor {
 
                 for (Class<?> intf : proxyIntfs) {
                     OptimizedClassDescriptor intfDesc = 
OptimizedMarshallerUtils.classDescriptor(
-                        clsMap, intf, GridBinaryMarshaller.USE_CACHE.get(), 
ctx, mapper);
+                        clsMap, intf, Marshallers.USE_CACHE.get(), ctx, 
mapper);
 
                     intfDesc.writeTypeData(out);
                 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshaller.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshaller.java
index c694dd48782..f8738a6e58a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshaller.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshaller.java
@@ -27,10 +27,10 @@ import java.util.concurrent.ConcurrentMap;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.IgniteSystemProperties;
-import org.apache.ignite.internal.binary.GridBinaryMarshaller;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller;
+import org.apache.ignite.marshaller.Marshallers;
 import org.jetbrains.annotations.Nullable;
 import sun.misc.Unsafe;
 
@@ -222,7 +222,7 @@ public class OptimizedMarshaller extends 
AbstractNodeNameAwareMarshaller {
 
     /** {@inheritDoc} */
     @Override protected <T> T unmarshal0(InputStream in, @Nullable ClassLoader 
clsLdr) throws IgniteCheckedException {
-        return unmarshal0(in, clsLdr, GridBinaryMarshaller.USE_CACHE.get());
+        return unmarshal0(in, clsLdr, Marshallers.USE_CACHE.get());
     }
 
     /**
@@ -278,7 +278,7 @@ public class OptimizedMarshaller extends 
AbstractNodeNameAwareMarshaller {
             objIn = registry.in();
 
             objIn.context(clsMap, ctx, mapper,
-                clsLdr != null ? clsLdr : dfltClsLdr, 
GridBinaryMarshaller.USE_CACHE.get());
+                clsLdr != null ? clsLdr : dfltClsLdr, 
Marshallers.USE_CACHE.get());
 
             objIn.in().bytes(arr, arr.length);
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectOutputStream.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectOutputStream.java
index f422246e329..d3ce371324a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectOutputStream.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectOutputStream.java
@@ -39,13 +39,13 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentMap;
 import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.internal.binary.GridBinaryMarshaller;
 import org.apache.ignite.internal.util.GridHandleTable;
 import org.apache.ignite.internal.util.io.GridDataOutput;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.marshaller.MarshallerContext;
+import org.apache.ignite.marshaller.Marshallers;
 
 import static 
org.apache.ignite.internal.marshaller.optimized.OptimizedMarshallerUtils.HANDLE;
 import static 
org.apache.ignite.internal.marshaller.optimized.OptimizedMarshallerUtils.JDK;
@@ -202,7 +202,7 @@ public class OptimizedObjectOutputStream extends 
ObjectOutputStream {
                 OptimizedClassDescriptor desc = classDescriptor(
                     clsMap,
                     obj instanceof Object[] ? Object[].class : obj.getClass(),
-                    GridBinaryMarshaller.USE_CACHE.get(),
+                    Marshallers.USE_CACHE.get(),
                     ctx,
                     mapper);
 
@@ -230,7 +230,7 @@ public class OptimizedObjectOutputStream extends 
ObjectOutputStream {
 
                     desc = classDescriptor(clsMap,
                         obj instanceof Object[] ? Object[].class : 
obj.getClass(),
-                        GridBinaryMarshaller.USE_CACHE.get(),
+                        Marshallers.USE_CACHE.get(),
                         ctx,
                         mapper);
                 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectTransformerUtils.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectTransformerUtils.java
index 58eff96b98c..6af164686ae 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectTransformerUtils.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectTransformerUtils.java
@@ -20,7 +20,7 @@ package org.apache.ignite.internal.processors.cache;
 import java.nio.ByteBuffer;
 import org.apache.ignite.events.CacheObjectTransformedEvent;
 import 
org.apache.ignite.internal.cache.transform.CacheObjectTransformerProcessor;
-import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.util.GridUnsafe;
 
 import static org.apache.ignite.events.EventType.EVT_CACHE_OBJECT_TRANSFORMED;
 import static 
org.apache.ignite.internal.binary.GridBinaryMarshaller.TRANSFORMED;
@@ -102,7 +102,7 @@ public class CacheObjectTransformerUtils {
 
         byte[] res = new byte[length];
 
-        U.arrayCopy(bytes, offset, res, 0, length);
+        GridUnsafe.arrayCopy(bytes, offset, res, 0, length);
 
         return res;
     }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientHandshakeRequest.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientHandshakeRequest.java
index 4e1ba91efb1..747600656a0 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientHandshakeRequest.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientHandshakeRequest.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.processors.rest.client.message;
 
 import java.util.Arrays;
+import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.typedef.internal.U;
 
 /**
@@ -82,7 +83,7 @@ public class GridClientHandshakeRequest extends 
GridClientAbstractMessage {
         if (arr == null)
             arr = new byte[PACKET_SIZE];
 
-        U.arrayCopy(buf, 0, arr, off, len);
+        GridUnsafe.arrayCopy(buf, 0, arr, off, len);
     }
 
     /**
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridMemcachedMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridMemcachedMessage.java
index 3e83cb05fba..1e153086a6c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridMemcachedMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridMemcachedMessage.java
@@ -19,6 +19,7 @@ package 
org.apache.ignite.internal.processors.rest.protocols.tcp;
 
 import java.util.UUID;
 import 
org.apache.ignite.internal.processors.rest.client.message.GridClientMessage;
+import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.jetbrains.annotations.Nullable;
@@ -150,7 +151,7 @@ public class GridMemcachedMessage implements 
GridClientMessage {
         opCode = req.opCode;
 
         opaque = new byte[req.opaque.length];
-        U.arrayCopy(req.opaque, 0, opaque, 0, req.opaque.length);
+        GridUnsafe.arrayCopy(req.opaque, 0, opaque, 0, req.opaque.length);
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestParser.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestParser.java
index 8b72e5a7804..4ca84258c3b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestParser.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestParser.java
@@ -34,12 +34,13 @@ import 
org.apache.ignite.internal.processors.rest.client.message.GridRouterRespo
 import 
org.apache.ignite.internal.processors.rest.protocols.tcp.redis.GridRedisMessage;
 import 
org.apache.ignite.internal.processors.rest.protocols.tcp.redis.GridRedisProtocolParser;
 import org.apache.ignite.internal.util.GridByteArrayList;
+import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.nio.GridNioParser;
 import org.apache.ignite.internal.util.nio.GridNioSession;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.marshaller.Marshaller;
-import org.apache.ignite.marshaller.jdk.JdkMarshaller;
+import org.apache.ignite.marshaller.Marshallers;
 import org.jetbrains.annotations.Nullable;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
@@ -77,7 +78,7 @@ public class GridTcpRestParser implements GridNioParser {
      * @param routerClient Router client flag.
      */
     public GridTcpRestParser(boolean routerClient) {
-        this(routerClient, new JdkMarshaller());
+        this(routerClient, Marshallers.jdk());
     }
 
     /**
@@ -819,7 +820,7 @@ public class GridTcpRestParser implements GridNioParser {
             if (extras.length - len > 0) {
                 byte[] cacheName = new byte[extras.length - len];
 
-                U.arrayCopy(extras, len, cacheName, 0, extras.length - len);
+                GridUnsafe.arrayCopy(extras, len, cacheName, 0, extras.length 
- len);
 
                 req.cacheName(new String(cacheName, UTF_8));
             }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/GridByteArrayList.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/util/GridByteArrayList.java
index 2143027217e..d3d536db8b1 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/GridByteArrayList.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/util/GridByteArrayList.java
@@ -121,7 +121,7 @@ public class GridByteArrayList implements Message, 
Externalizable {
     public byte[] array() {
         byte[] res = new byte[size];
 
-        U.arrayCopy(data, 0, res, 0, size);
+        GridUnsafe.arrayCopy(data, 0, res, 0, size);
 
         return res;
     }
@@ -304,7 +304,7 @@ public class GridByteArrayList implements Message, 
Externalizable {
     public void add(byte[] bytes, int off, int len) {
         requestFreeSize(len);
 
-        U.arrayCopy(bytes, off, data, size, len);
+        GridUnsafe.arrayCopy(bytes, off, data, size, len);
 
         size += len;
     }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java 
b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index a0a391e6334..71e42f6a04b 100755
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -188,7 +188,6 @@ import org.apache.ignite.internal.binary.BinaryMarshaller;
 import org.apache.ignite.internal.binary.BinaryMetadata;
 import org.apache.ignite.internal.binary.BinaryMetadataHandler;
 import org.apache.ignite.internal.binary.BinaryUtils;
-import org.apache.ignite.internal.binary.GridBinaryMarshaller;
 import org.apache.ignite.internal.cluster.ClusterGroupEmptyCheckedException;
 import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException;
 import org.apache.ignite.internal.compute.ComputeTaskCancelledCheckedException;
@@ -200,7 +199,6 @@ import 
org.apache.ignite.internal.managers.deployment.GridDeployment;
 import org.apache.ignite.internal.managers.deployment.GridDeploymentInfo;
 import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
 import org.apache.ignite.internal.mxbean.IgniteStandardMXBean;
-import org.apache.ignite.internal.processors.cache.CacheClassLoaderMarker;
 import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
 import 
org.apache.ignite.internal.processors.cache.IgnitePeerToPeerClassLoadingException;
 import 
org.apache.ignite.internal.transactions.IgniteTxHeuristicCheckedException;
@@ -236,6 +234,7 @@ import org.apache.ignite.lifecycle.LifecycleAware;
 import org.apache.ignite.logger.NullLogger;
 import org.apache.ignite.logger.java.JavaLogger;
 import org.apache.ignite.marshaller.Marshaller;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.plugin.PluginProvider;
 import org.apache.ignite.plugin.extensions.communication.Message;
 import org.apache.ignite.plugin.extensions.communication.MessageWriter;
@@ -252,7 +251,6 @@ import 
org.apache.ignite.transactions.TransactionRollbackException;
 import org.apache.ignite.transactions.TransactionTimeoutException;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import sun.misc.Unsafe;
 
 import static java.util.Objects.isNull;
 import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_DISABLE_HOSTNAME_VERIFIER;
@@ -315,9 +313,6 @@ public abstract class IgniteUtils extends CommonUtils {
     /** @see IgniteSystemProperties#IGNITE_MBEAN_APPEND_CLASS_LOADER_ID */
     public static final boolean DFLT_MBEAN_APPEND_CLASS_LOADER_ID = true;
 
-    /** {@code True} if {@code unsafe} should be used for array copy. */
-    private static final boolean UNSAFE_BYTE_ARR_CP = 
unsafeByteArrayCopyAvailable();
-
     /** All grid event names. */
     private static final Map<Integer, String> GRID_EVT_NAMES = new HashMap<>();
 
@@ -430,15 +425,9 @@ public abstract class IgniteUtils extends CommonUtils {
     /** Supplier of network interfaces. Could be used for tests purposes, must 
not be changed in production code. */
     public static InterfaceSupplier INTERFACE_SUPPLIER = 
NetworkInterface::getNetworkInterfaces;
 
-    /** Primitive class map. */
-    private static final Map<String, Class<?>> primitiveMap = new 
HashMap<>(16, .5f);
-
     /** Boxed class map. */
     private static final Map<Class<?>, Class<?>> boxedClsMap = new 
HashMap<>(16, .5f);
 
-    /** Class loader used to load Ignite. */
-    private static final ClassLoader gridClassLoader = 
IgniteUtils.class.getClassLoader();
-
     /** MAC OS invalid argument socket error message. */
     public static final String MAC_INVALID_ARG_MSG = "On MAC OS you may have 
too many file descriptors open " +
         "(simple restart usually solves the issue)";
@@ -465,10 +454,6 @@ public abstract class IgniteUtils extends CommonUtils {
     /** */
     private static volatile IgniteBiTuple<Collection<String>, 
Collection<String>> cachedLocalAddrAllHostNames;
 
-    /** */
-    private static final ConcurrentMap<ClassLoader, ConcurrentMap<String, 
Class>> classCache =
-        new ConcurrentHashMap<>();
-
     /** Object.hashCode() */
     private static Method hashCodeMtd;
 
@@ -478,16 +463,6 @@ public abstract class IgniteUtils extends CommonUtils {
     /** Object.toString() */
     private static Method toStringMtd;
 
-    /** Empty local Ignite name. */
-    public static final String LOC_IGNITE_NAME_EMPTY = new String();
-
-    /** Local Ignite name thread local. */
-    private static final ThreadLocal<String> LOC_IGNITE_NAME = new 
ThreadLocal<String>() {
-        @Override protected String initialValue() {
-            return LOC_IGNITE_NAME_EMPTY;
-        }
-    };
-
     /** Ignite MBeans disabled flag. */
     public static boolean IGNITE_MBEANS_DISABLED =
         
IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_MBEANS_DISABLED);
@@ -609,16 +584,6 @@ public abstract class IgniteUtils extends CommonUtils {
 
         jvm32Bit = "32".equals(jvmArchDataModel);
 
-        primitiveMap.put("byte", byte.class);
-        primitiveMap.put("short", short.class);
-        primitiveMap.put("int", int.class);
-        primitiveMap.put("long", long.class);
-        primitiveMap.put("float", float.class);
-        primitiveMap.put("double", double.class);
-        primitiveMap.put("char", char.class);
-        primitiveMap.put("boolean", boolean.class);
-        primitiveMap.put("void", void.class);
-
         boxedClsMap.put(byte.class, Byte.class);
         boxedClsMap.put(short.class, Short.class);
         boxedClsMap.put(int.class, Integer.class);
@@ -1260,45 +1225,6 @@ public abstract class IgniteUtils extends CommonUtils {
             sb.a(NL).a("        ").a(info);
     }
 
-    /**
-     * Gets class for the given name if it can be loaded or default given 
class.
-     *
-     * @param cls Class.
-     * @param dflt Default class to return.
-     * @return Class or default given class if it can't be found.
-     */
-    @Nullable public static Class<?> classForName(@Nullable String cls, 
@Nullable Class<?> dflt) {
-        return classForName(cls, dflt, false);
-    }
-
-    /**
-     * Gets class for the given name if it can be loaded or default given 
class.
-     *
-     * @param cls Class.
-     * @param dflt Default class to return.
-     * @param includePrimitiveTypes Whether class resolution should include 
primitive types
-     *                              (i.e. "int" will resolve to int.class if 
flag is set)
-     * @return Class or default given class if it can't be found.
-     */
-    @Nullable public static Class<?> classForName(
-        @Nullable String cls,
-        @Nullable Class<?> dflt,
-        boolean includePrimitiveTypes
-    ) {
-        Class<?> clazz;
-        if (cls == null)
-            clazz = dflt;
-        else if (!includePrimitiveTypes || cls.length() > 7 || (clazz = 
primitiveMap.get(cls)) == null) {
-            try {
-                clazz = Class.forName(cls);
-            }
-            catch (ClassNotFoundException ignore) {
-                clazz = dflt;
-            }
-        }
-        return clazz;
-    }
-
     /**
      * Creates new instance of a class only if it has an empty constructor 
(can be non-public).
      *
@@ -2027,13 +1953,6 @@ public abstract class IgniteUtils extends CommonUtils {
         return uri;
     }
 
-    /**
-     * @return Class loader used to load Ignite itself.
-     */
-    public static ClassLoader gridClassLoader() {
-        return gridClassLoader;
-    }
-
     /**
      * @return ClassLoader at IgniteConfiguration in case it is not null or
      * ClassLoader used to start Ignite.
@@ -2053,19 +1972,6 @@ public abstract class IgniteUtils extends CommonUtils {
         return resolveClassLoader(ldr, cfg.getClassLoader());
     }
 
-    /**
-     * @param ldr Custom class loader.
-     * @param cfgLdr Class loader from config.
-     * @return ClassLoader passed as param in case it is not null or cfgLdr  
in case it is not null or ClassLoader used to start Ignite.
-     */
-    public static ClassLoader resolveClassLoader(@Nullable ClassLoader ldr, 
@Nullable ClassLoader cfgLdr) {
-        return (ldr != null && ldr != gridClassLoader)
-            ? ldr
-            : cfgLdr != null
-                ? cfgLdr
-                : gridClassLoader;
-    }
-
     /**
      * @param parent Parent to find.
      * @param ldr Loader to check.
@@ -2155,7 +2061,7 @@ public abstract class IgniteUtils extends CommonUtils {
         byte[] res = new byte[size];
         int position = 0;
         for (byte[] buf : bufs) {
-            arrayCopy(buf, 0, res, position, buf.length);
+            GridUnsafe.arrayCopy(buf, 0, res, position, buf.length);
             position += buf.length;
         }
 
@@ -5081,32 +4987,6 @@ public abstract class IgniteUtils extends CommonUtils {
         return detectClassLoader(obj.getClass());
     }
 
-    /**
-     * Tests whether or not given class is loadable provided class loader.
-     *
-     * @param clsName Class name to test.
-     * @param ldr Class loader to test with. If {@code null} - we'll use 
system class loader instead.
-     *      If System class loader is not set - this method will return {@code 
false}.
-     * @return {@code True} if class is loadable, {@code false} otherwise.
-     */
-    public static boolean isLoadableBy(String clsName, @Nullable ClassLoader 
ldr) {
-        assert clsName != null;
-
-        if (ldr == null)
-            ldr = gridClassLoader;
-
-        String lambdaParent = lambdaEnclosingClassName(clsName);
-
-        try {
-            ldr.loadClass(lambdaParent == null ? clsName : lambdaParent);
-
-            return true;
-        }
-        catch (ClassNotFoundException ignore) {
-            return false;
-        }
-    }
-
     /**
      * Gets the peer deploy aware instance for the object with the widest 
class loader.
      * If collection is {@code null}, empty or contains only {@code null}s - 
the peer
@@ -6927,7 +6807,7 @@ public abstract class IgniteUtils extends CommonUtils {
      * @throws ClassNotFoundException If class not found.
      */
     public static Class<?> forName(String clsName, @Nullable ClassLoader ldr) 
throws ClassNotFoundException {
-        return forName(clsName, ldr, null, 
GridBinaryMarshaller.USE_CACHE.get());
+        return forName(clsName, ldr, null, Marshallers.USE_CACHE.get());
     }
 
     /**
@@ -6943,106 +6823,7 @@ public abstract class IgniteUtils extends CommonUtils {
         @Nullable ClassLoader ldr,
         IgnitePredicate<String> clsFilter
     ) throws ClassNotFoundException {
-        return forName(clsName, ldr, clsFilter, 
GridBinaryMarshaller.USE_CACHE.get());
-    }
-
-    /**
-     * Gets class for provided name. Accepts primitive types names.
-     *
-     * @param clsName Class name.
-     * @param ldr Class loader.
-     * @param useCache If true class loader and result should be cached 
internally, false otherwise.
-     * @return Class.
-     * @throws ClassNotFoundException If class not found.
-     */
-    public static Class<?> forName(
-        String clsName,
-        @Nullable ClassLoader ldr,
-        IgnitePredicate<String> clsFilter,
-        boolean useCache
-    ) throws ClassNotFoundException {
-        assert clsName != null;
-
-        Class<?> cls = primitiveMap.get(clsName);
-
-        if (cls != null)
-            return cls;
-
-        if (ldr != null) {
-            if (ldr instanceof ClassCache)
-                return ((ClassCache)ldr).getFromCache(clsName);
-            else if (!useCache) {
-                cls = Class.forName(clsName, true, ldr);
-
-                return cls;
-            }
-        }
-        else
-            ldr = gridClassLoader;
-
-        if (!useCache) {
-            cls = Class.forName(clsName, true, ldr);
-
-            return cls;
-        }
-
-        ConcurrentMap<String, Class> ldrMap = classCache.get(ldr);
-
-        if (ldrMap == null) {
-            ConcurrentMap<String, Class> old = classCache.putIfAbsent(ldr, 
ldrMap = new ConcurrentHashMap<>());
-
-            if (old != null)
-                ldrMap = old;
-        }
-
-        cls = ldrMap.get(clsName);
-
-        if (cls == null) {
-            if (clsFilter != null && !clsFilter.apply(clsName))
-                throw new ClassNotFoundException("Deserialization of class " + 
clsName + " is disallowed.");
-
-            // Avoid class caching inside Class.forName
-            if (ldr instanceof CacheClassLoaderMarker)
-                cls = ldr.loadClass(clsName);
-            else
-                cls = Class.forName(clsName, true, ldr);
-
-            Class old = ldrMap.putIfAbsent(clsName, cls);
-
-            if (old != null)
-                cls = old;
-        }
-
-        return cls;
-    }
-
-    /**
-     * Clears class associated with provided class loader from class cache.
-     *
-     * @param ldr Class loader.
-     * @param clsName Class name of clearing class.
-     */
-    public static void clearClassFromClassCache(ClassLoader ldr, String 
clsName) {
-        ConcurrentMap<String, Class> map = classCache.get(ldr);
-
-        if (map != null)
-            map.remove(clsName);
-    }
-
-    /**
-     * Clears class cache for provided loader.
-     *
-     * @param ldr Class loader.
-     */
-    public static void clearClassCache(ClassLoader ldr) {
-        classCache.remove(ldr);
-    }
-
-    /**
-     * Completely clears class cache.
-     */
-    public static void clearClassCache() {
-        classCache.clear();
+        return forName(clsName, ldr, clsFilter, Marshallers.USE_CACHE.get());
     }
 
     /**
@@ -7123,47 +6904,6 @@ public abstract class IgniteUtils extends CommonUtils {
         return ManagementFactory.getRuntimeMXBean().getInputArguments();
     }
 
-    /**
-     * As long as array copying uses JVM-private API, which is not guaranteed
-     * to be available on all JVM, this method should be called to ensure
-     * logic could work properly.
-     *
-     * @return {@code True} if unsafe copying can work on the current JVM or
-     *      {@code false} if it can't.
-     */
-    @SuppressWarnings("TypeParameterExtendsFinalClass")
-    private static boolean unsafeByteArrayCopyAvailable() {
-        try {
-            Class<? extends Unsafe> unsafeCls = Unsafe.class;
-
-            unsafeCls.getMethod("copyMemory", Object.class, long.class, 
Object.class, long.class, long.class);
-
-            return true;
-        }
-        catch (Exception ignored) {
-            return false;
-        }
-    }
-
-    /**
-     * @param src Buffer to copy from (length included).
-     * @param off Offset in source buffer.
-     * @param resBuf Result buffer.
-     * @param resOff Result offset.
-     * @param len Length.
-     * @return Number of bytes overwritten in {@code bytes} array.
-     */
-    public static int arrayCopy(byte[] src, int off, byte[] resBuf, int 
resOff, int len) {
-        assert resBuf.length >= resOff + len;
-
-        if (UNSAFE_BYTE_ARR_CP)
-            GridUnsafe.copyMemory(src, GridUnsafe.BYTE_ARR_OFF + off, resBuf, 
GridUnsafe.BYTE_ARR_OFF + resOff, len);
-        else
-            System.arraycopy(src, off, resBuf, resOff, len);
-
-        return resOff + len;
-    }
-
     /**
      * @param addrs Node's addresses.
      * @return A string compatible with {@link ClusterNode#consistentId()} 
requirements.
@@ -7694,23 +7434,6 @@ public abstract class IgniteUtils extends CommonUtils {
         return e;
     }
 
-    /**
-     * Extracts full name of enclosing class from JDK8 lambda class name.
-     *
-     * @param clsName JDK8 lambda class name.
-     * @return Full name of enclosing class for JDK8 lambda class name or
-     *      {@code null} if passed in name is not related to lambda.
-     */
-    @Nullable public static String lambdaEnclosingClassName(String clsName) {
-        int idx0 = clsName.indexOf("$$Lambda$"); // Java 8+
-        int idx1 = clsName.indexOf("$$Lambda/"); // Java 21+
-
-        if (idx0 == idx1)
-            return null;
-
-        return clsName.substring(0, idx0 >= 0 ? idx0 : idx1);
-    }
-
     /**
      * Converts a hexadecimal character to an integer.
      *
@@ -8392,54 +8115,6 @@ public abstract class IgniteUtils extends CommonUtils {
         return marshal(ctx.marshaller(), obj);
     }
 
-    /**
-     * Get current Ignite name.
-     *
-     * @return Current Ignite name.
-     */
-    @Nullable public static String getCurrentIgniteName() {
-        return LOC_IGNITE_NAME.get();
-    }
-
-    /**
-     * Check if current Ignite name is set.
-     *
-     * @param name Name to check.
-     * @return {@code True} if set.
-     */
-    @SuppressWarnings("StringEquality")
-    public static boolean isCurrentIgniteNameSet(@Nullable String name) {
-        return name != LOC_IGNITE_NAME_EMPTY;
-    }
-
-    /**
-     * Set current Ignite name.
-     *
-     * @param newName New name.
-     * @return Old name.
-     */
-    @SuppressWarnings("StringEquality")
-    @Nullable public static String setCurrentIgniteName(@Nullable String 
newName) {
-        String oldName = LOC_IGNITE_NAME.get();
-
-        if (oldName != newName)
-            LOC_IGNITE_NAME.set(newName);
-
-        return oldName;
-    }
-
-    /**
-     * Restore old Ignite name.
-     *
-     * @param oldName Old name.
-     * @param curName Current name.
-     */
-    @SuppressWarnings("StringEquality")
-    public static void restoreOldIgniteName(@Nullable String oldName, 
@Nullable String curName) {
-        if (oldName != curName)
-            LOC_IGNITE_NAME.set(oldName);
-    }
-
     /**
      * Zip binary payload using default compression.
      *
diff --git 
a/modules/core/src/main/java/org/apache/ignite/stream/socket/SocketStreamer.java
 
b/modules/core/src/main/java/org/apache/ignite/stream/socket/SocketStreamer.java
index a0bdcc39c4c..9ea50a0819d 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/stream/socket/SocketStreamer.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/stream/socket/SocketStreamer.java
@@ -39,7 +39,7 @@ import org.apache.ignite.internal.util.typedef.internal.A;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.marshaller.Marshaller;
 import org.apache.ignite.marshaller.MarshallerUtils;
-import org.apache.ignite.marshaller.jdk.JdkMarshaller;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.stream.StreamAdapter;
 import org.apache.ignite.stream.StreamTupleExtractor;
 import org.jetbrains.annotations.Nullable;
@@ -229,7 +229,7 @@ public class SocketStreamer<T, K, V> extends 
StreamAdapter<T, K, V> {
          * @param igniteInstanceName Ignite instance name.
          */
         private DefaultConverter(@Nullable String igniteInstanceName) {
-            marsh = new 
JdkMarshaller(((IgniteKernal)ignite).context().marshallerContext().classNameFilter());
+            marsh = 
Marshallers.jdk(((IgniteKernal)ignite).context().marshallerContext().classNameFilter());
 
             MarshallerUtils.setNodeName(marsh, igniteInstanceName);
         }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/IgniteExternalizableAbstractTest.java
 
b/modules/core/src/test/java/org/apache/ignite/IgniteExternalizableAbstractTest.java
index ce22ead4a64..5e8f420ed5b 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/IgniteExternalizableAbstractTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/IgniteExternalizableAbstractTest.java
@@ -21,7 +21,7 @@ import java.util.ArrayList;
 import java.util.List;
 import org.apache.ignite.internal.binary.BinaryMarshaller;
 import org.apache.ignite.marshaller.Marshaller;
-import org.apache.ignite.marshaller.jdk.JdkMarshaller;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 
 /**
@@ -36,7 +36,7 @@ public class IgniteExternalizableAbstractTest extends 
GridCommonAbstractTest {
 
         BinaryMarshaller bin = createStandaloneBinaryMarshaller();
 
-        marshallers.add(new JdkMarshaller());
+        marshallers.add(Marshallers.jdk());
         marshallers.add(bin);
 
         return marshallers;
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/binary/GridBinaryMarshallerCtxDisabledSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/binary/GridBinaryMarshallerCtxDisabledSelfTest.java
index 03d0b3752c6..e300dfc7532 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/binary/GridBinaryMarshallerCtxDisabledSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/binary/GridBinaryMarshallerCtxDisabledSelfTest.java
@@ -31,6 +31,7 @@ import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.marshaller.MarshallerContext;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Test;
@@ -128,7 +129,7 @@ public class GridBinaryMarshallerCtxDisabledSelfTest 
extends GridCommonAbstractT
 
         /** {@inheritDoc} */
         @Override public JdkMarshaller jdkMarshaller() {
-            return new JdkMarshaller();
+            return Marshallers.jdk();
         }
     }
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java
index 41dd2bc03b2..1f4fe14c8fa 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java
@@ -33,6 +33,7 @@ import 
org.apache.ignite.internal.binary.streams.BinaryStreams;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.marshaller.MarshallerContext;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Test;
@@ -157,7 +158,7 @@ public class RawBinaryObjectExtractorTest extends 
GridCommonAbstractTest {
 
         /** {@inheritDoc} */
         @Override public JdkMarshaller jdkMarshaller() {
-            return new JdkMarshaller();
+            return Marshallers.jdk();
         }
     }
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectStreamSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectStreamSelfTest.java
index c1bf64b46d7..b974f49f89b 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectStreamSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectStreamSelfTest.java
@@ -51,6 +51,7 @@ import java.util.Objects;
 import java.util.PriorityQueue;
 import java.util.Properties;
 import java.util.Queue;
+import java.util.Set;
 import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.UUID;
@@ -1111,7 +1112,7 @@ public class OptimizedObjectStreamSelfTest extends 
GridCommonAbstractTest {
      */
     @Test
     public void testExcludedClass() throws Exception {
-        Class<?>[] exclClasses = U.staticField(MarshallerExclusions.class, 
"EXCL_CLASSES");
+        Set<Class<?>> exclClasses = U.staticField(MarshallerExclusions.class, 
"EXCL_CLASSES");
 
         assertFalse(F.isEmpty(exclClasses));
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheEntryMemorySizeSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheEntryMemorySizeSelfTest.java
index 000b208f7a3..3bd7c18923a 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheEntryMemorySizeSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheEntryMemorySizeSelfTest.java
@@ -33,6 +33,7 @@ import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.marshaller.Marshaller;
 import org.apache.ignite.marshaller.MarshallerContext;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Ignore;
@@ -160,7 +161,7 @@ public class GridCacheEntryMemorySizeSelfTest extends 
GridCommonAbstractTest {
             }
 
             @Override public JdkMarshaller jdkMarshaller() {
-                return new JdkMarshaller();
+                return Marshallers.jdk();
             }
         });
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsCacheConfigurationFileConsistencyCheckTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsCacheConfigurationFileConsistencyCheckTest.java
index 9db275ddd66..ce53a6a5e27 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsCacheConfigurationFileConsistencyCheckTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsCacheConfigurationFileConsistencyCheckTest.java
@@ -38,7 +38,7 @@ import 
org.apache.ignite.internal.processors.cache.GridLocalConfigManager;
 import org.apache.ignite.internal.processors.cache.StoredCacheData;
 import 
org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree;
 import org.apache.ignite.marshaller.Marshaller;
-import org.apache.ignite.marshaller.jdk.JdkMarshaller;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Test;
@@ -199,7 +199,7 @@ public class 
IgnitePdsCacheConfigurationFileConsistencyCheckTest extends GridCom
      * @throws IgniteCheckedException If fails.
      */
     private void storeTmpCacheData(DynamicCacheDescriptor cacheDescr) throws 
Exception {
-        Marshaller marshaller = new JdkMarshaller();
+        Marshaller marshaller = Marshallers.jdk();
 
         for (int i = 0; i < NODES; i++) {
             IgniteEx ig = grid(i);
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceInfoSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceInfoSelfTest.java
index 60b9531d45e..a67980f89d2 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceInfoSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceInfoSelfTest.java
@@ -27,6 +27,7 @@ import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 import org.apache.ignite.services.Service;
 import org.apache.ignite.services.ServiceConfiguration;
@@ -141,7 +142,7 @@ public class ServiceInfoSelfTest {
     /** */
     private ServiceInfo serviceInfo(ServiceConfiguration cfg) {
         try {
-            JdkMarshaller marsh = new JdkMarshaller();
+            JdkMarshaller marsh = Marshallers.jdk();
 
             byte[] srvcBytes = U.marshal(marsh, cfg.getService());
             byte[] nodeFilterBytes = U.marshal(marsh, cfg.getNodeFilter());
diff --git 
a/modules/core/src/test/java/org/apache/ignite/jvmtest/RegExpTest.java 
b/modules/core/src/test/java/org/apache/ignite/jvmtest/RegExpTest.java
index 6add401663b..312386f8824 100644
--- a/modules/core/src/test/java/org/apache/ignite/jvmtest/RegExpTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/jvmtest/RegExpTest.java
@@ -19,8 +19,8 @@ package org.apache.ignite.jvmtest;
 
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.typedef.X;
-import org.apache.ignite.internal.util.typedef.internal.U;
 import org.junit.Test;
 
 /**
@@ -38,7 +38,7 @@ public class RegExpTest {
         byte[] b1 = new byte[200];
         byte[] b2 = normal.getBytes();
 
-        U.arrayCopy(b2, 0, b1, 30, b2.length);
+        GridUnsafe.arrayCopy(b2, 0, b1, 30, b2.length);
 
         CharSequence corrupt = new String(b1);
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/lang/GridByteArrayListSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/lang/GridByteArrayListSelfTest.java
index 0c67dea93c8..3cd615b0160 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/lang/GridByteArrayListSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/lang/GridByteArrayListSelfTest.java
@@ -22,6 +22,7 @@ import java.io.InputStream;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 import org.apache.ignite.internal.util.GridByteArrayList;
+import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.apache.ignite.testframework.junits.common.GridCommonTest;
@@ -110,8 +111,8 @@ public class GridByteArrayListSelfTest extends 
GridCommonAbstractTest {
 
         byte[] arr2 = new byte[8];
 
-        U.arrayCopy(U.intToBytes(num), 0, arr2, 0, 4);
-        U.arrayCopy(U.intToBytes(num3), 0, arr2, 4, 4);
+        GridUnsafe.arrayCopy(U.intToBytes(num), 0, arr2, 0, 4);
+        GridUnsafe.arrayCopy(U.intToBytes(num3), 0, arr2, 4, 4);
 
         assert Arrays.equals(list.array(), arr2);
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/marshaller/GridMarshallerResourceBean.java
 
b/modules/core/src/test/java/org/apache/ignite/marshaller/GridMarshallerResourceBean.java
index b834eb0a059..20d01aeaa33 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/marshaller/GridMarshallerResourceBean.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/marshaller/GridMarshallerResourceBean.java
@@ -33,7 +33,6 @@ import org.apache.ignite.compute.ComputeLoadBalancer;
 import org.apache.ignite.compute.ComputeTaskSession;
 import 
org.apache.ignite.internal.managers.loadbalancer.GridLoadBalancerAdapter;
 import org.apache.ignite.logger.java.JavaLogger;
-import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 import org.apache.ignite.thread.IgniteThreadFactory;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.support.GenericApplicationContext;
@@ -71,7 +70,7 @@ class GridMarshallerResourceBean implements Serializable {
      */
     GridMarshallerResourceBean() {
         log = new JavaLogger();
-        marshaller = new JdkMarshaller();
+        marshaller = Marshallers.jdk();
         mbeanSrv = ManagementFactory.getPlatformMBeanServer();
         ses = new GridTestTaskSession();
         execSvc = Executors.newSingleThreadExecutor(new 
IgniteThreadFactory("testscope", "grid-marshaller"));
diff --git 
a/modules/core/src/test/java/org/apache/ignite/marshaller/jdk/GridJdkMarshallerSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/marshaller/jdk/GridJdkMarshallerSelfTest.java
index ff7726dfcc4..f34baa36094 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/marshaller/jdk/GridJdkMarshallerSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/marshaller/jdk/GridJdkMarshallerSelfTest.java
@@ -19,6 +19,7 @@ package org.apache.ignite.marshaller.jdk;
 
 import org.apache.ignite.marshaller.GridMarshallerAbstractTest;
 import org.apache.ignite.marshaller.Marshaller;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.testframework.junits.common.GridCommonTest;
 
 /**
@@ -28,6 +29,6 @@ import 
org.apache.ignite.testframework.junits.common.GridCommonTest;
 public class GridJdkMarshallerSelfTest extends GridMarshallerAbstractTest {
     /** {@inheritDoc} */
     @Override protected Marshaller marshaller() {
-        return new JdkMarshaller();
+        return Marshallers.jdk();
     }
 }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/p2p/P2PScanQueryUndeployTest.java
 
b/modules/core/src/test/java/org/apache/ignite/p2p/P2PScanQueryUndeployTest.java
index f49c66b2c91..708dac51081 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/p2p/P2PScanQueryUndeployTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/p2p/P2PScanQueryUndeployTest.java
@@ -33,7 +33,7 @@ import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.managers.communication.GridIoMessage;
 import org.apache.ignite.internal.managers.deployment.GridDeploymentRequest;
-import org.apache.ignite.internal.util.IgniteUtils;
+import org.apache.ignite.internal.util.CommonUtils;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteBiPredicate;
 import org.apache.ignite.lang.IgniteInClosure;
@@ -165,7 +165,7 @@ public class P2PScanQueryUndeployTest extends 
GridCommonAbstractTest {
      * @throws Exception if something wrong.
      */
     private Set<String> igniteUtilsCachedClasses() throws Exception {
-        Field f = IgniteUtils.class.getDeclaredField("classCache");
+        Field f = CommonUtils.class.getDeclaredField("classCache");
 
         f.setAccessible(true);
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/DiscoveryUnmarshalVulnerabilityTest.java
 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/DiscoveryUnmarshalVulnerabilityTest.java
index 1cd4cc6d2b7..a184cd42fe4 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/DiscoveryUnmarshalVulnerabilityTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/DiscoveryUnmarshalVulnerabilityTest.java
@@ -29,6 +29,7 @@ import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.internal.util.lang.GridAbsPredicate;
 import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.WithSystemProperty;
@@ -45,7 +46,7 @@ import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_MARSHALLER_WHITELI
 @WithSystemProperty(key = IGNITE_ENABLE_OBJECT_INPUT_FILTER_AUTOCONFIGURATION, 
value = "false")
 public class DiscoveryUnmarshalVulnerabilityTest extends 
GridCommonAbstractTest {
     /** Marshaller. */
-    private static final JdkMarshaller MARSH = new JdkMarshaller();
+    private static final JdkMarshaller MARSH = Marshallers.jdk();
 
     /** Shared value. */
     private static final AtomicBoolean SHARED = new AtomicBoolean();
diff --git 
a/modules/core/src/test/java/org/apache/ignite/stream/socket/SocketStreamerSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/stream/socket/SocketStreamerSelfTest.java
index 75ead89642f..0897dbbfd39 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/stream/socket/SocketStreamerSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/stream/socket/SocketStreamerSelfTest.java
@@ -42,7 +42,7 @@ import org.apache.ignite.internal.util.GridConcurrentHashSet;
 import org.apache.ignite.lang.IgniteBiPredicate;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.marshaller.Marshaller;
-import org.apache.ignite.marshaller.jdk.JdkMarshaller;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.stream.StreamMultipleTupleExtractor;
 import org.apache.ignite.stream.StreamSingleTupleExtractor;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
@@ -99,7 +99,7 @@ public class SocketStreamerSelfTest extends 
GridCommonAbstractTest {
             @Override public void run() {
                 try (Socket sock = new Socket(InetAddress.getLocalHost(), 
port);
                      OutputStream os = new 
BufferedOutputStream(sock.getOutputStream())) {
-                    Marshaller marsh = new JdkMarshaller();
+                    Marshaller marsh = Marshallers.jdk();
 
                     for (int i = 0; i < CNT; i++) {
                         byte[] msg = marsh.marshal(new Message(i));
@@ -128,7 +128,7 @@ public class SocketStreamerSelfTest extends 
GridCommonAbstractTest {
             @Override public void run() {
                 try (Socket sock = new Socket(InetAddress.getLocalHost(), 
port);
                      OutputStream os = new 
BufferedOutputStream(sock.getOutputStream())) {
-                    Marshaller marsh = new JdkMarshaller();
+                    Marshaller marsh = Marshallers.jdk();
 
                     int[] values = new int[CNT];
                     for (int i = 0; i < CNT; i++)
@@ -199,7 +199,7 @@ public class SocketStreamerSelfTest extends 
GridCommonAbstractTest {
             @Override public void run() {
                 try (Socket sock = new Socket(InetAddress.getLocalHost(), 
port);
                     OutputStream os = new 
BufferedOutputStream(sock.getOutputStream())) {
-                    Marshaller marsh = new JdkMarshaller();
+                    Marshaller marsh = Marshallers.jdk();
 
                     for (int i = 0; i < CNT; i++) {
                         byte[] msg = marsh.marshal(new Message(i));
diff --git 
a/modules/core/src/test/java/org/apache/ignite/stream/socket/SocketStreamerUnmarshalVulnerabilityTest.java
 
b/modules/core/src/test/java/org/apache/ignite/stream/socket/SocketStreamerUnmarshalVulnerabilityTest.java
index 1502a5b294f..4c8e3abeb61 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/stream/socket/SocketStreamerUnmarshalVulnerabilityTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/stream/socket/SocketStreamerUnmarshalVulnerabilityTest.java
@@ -37,7 +37,7 @@ import org.apache.ignite.internal.util.lang.GridAbsPredicate;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.marshaller.Marshaller;
-import org.apache.ignite.marshaller.jdk.JdkMarshaller;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.stream.StreamSingleTupleExtractor;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.WithSystemProperty;
@@ -184,7 +184,7 @@ public class SocketStreamerUnmarshalVulnerabilityTest 
extends GridCommonAbstract
 
                 try (Socket sock = new Socket(InetAddress.getLocalHost(), 
port);
                      OutputStream os = new 
BufferedOutputStream(sock.getOutputStream())) {
-                    Marshaller marsh = new JdkMarshaller();
+                    Marshaller marsh = Marshallers.jdk();
 
                     byte[] msg = marsh.marshal(new Exploit());
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
 
b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
index 8790dc9d5a7..d3d9efffaa5 100755
--- 
a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
@@ -141,6 +141,7 @@ import org.apache.ignite.lang.IgniteRunnable;
 import org.apache.ignite.marshaller.Marshaller;
 import org.apache.ignite.marshaller.MarshallerContext;
 import org.apache.ignite.marshaller.MarshallerContextTestImpl;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 import org.apache.ignite.mxbean.MXBeanDescription;
 import org.apache.ignite.resources.IgniteInstanceResource;
@@ -182,7 +183,7 @@ public abstract class GridCommonAbstractTest extends 
GridAbstractTest {
     protected static final int SERVICE_DEPLOYMENT_WAIT_TIMEOUT = 10_000;
 
     /** */
-    public static final JdkMarshaller TEST_JDK_MARSHALLER = new 
JdkMarshaller();
+    public static final JdkMarshaller TEST_JDK_MARSHALLER = Marshallers.jdk();
 
     /**
      * @param startGrid If {@code true}, then grid node will be auto-started.
diff --git 
a/modules/unsafe/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java 
b/modules/unsafe/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java
index 8b5a5adda7d..a4ff4c7d38a 100644
--- 
a/modules/unsafe/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java
+++ 
b/modules/unsafe/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java
@@ -1573,6 +1573,19 @@ public abstract class GridUnsafe {
         return (size + (OBJ_ALIGN - 1L)) & (-OBJ_ALIGN);
     }
 
+    /**
+     * @param src Buffer to copy from (length included).
+     * @param off Offset in source buffer.
+     * @param resBuf Result buffer.
+     * @param resOff Result offset.
+     * @param len Number of bytes to copy from src to resBuf.
+     */
+    public static void arrayCopy(byte[] src, int off, byte[] resBuf, int 
resOff, int len) {
+        assert resBuf.length >= resOff + len;
+
+        copyMemory(src, BYTE_ARR_OFF + off, resBuf, BYTE_ARR_OFF + resOff, 
len);
+    }
+
     /**
      * Returns unaligned flag.
      */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridByteArrayInputStream.java
 
b/modules/unsafe/src/main/java/org/apache/ignite/internal/util/io/GridByteArrayInputStream.java
similarity index 98%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/util/io/GridByteArrayInputStream.java
rename to 
modules/unsafe/src/main/java/org/apache/ignite/internal/util/io/GridByteArrayInputStream.java
index c3cdc156655..ae3b95a3aaf 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridByteArrayInputStream.java
+++ 
b/modules/unsafe/src/main/java/org/apache/ignite/internal/util/io/GridByteArrayInputStream.java
@@ -19,8 +19,8 @@ package org.apache.ignite.internal.util.io;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
+import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.internal.util.typedef.internal.U;
 
 /**
  * This class defines input stream backed by byte array.
@@ -114,7 +114,7 @@ public class GridByteArrayInputStream extends InputStream {
         if (len <= 0)
             return 0;
 
-        U.arrayCopy(buf, pos, b, off, len);
+        GridUnsafe.arrayCopy(buf, pos, b, off, len);
 
         pos += len;
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridByteArrayOutputStream.java
 
b/modules/unsafe/src/main/java/org/apache/ignite/internal/util/io/GridByteArrayOutputStream.java
similarity index 98%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/util/io/GridByteArrayOutputStream.java
rename to 
modules/unsafe/src/main/java/org/apache/ignite/internal/util/io/GridByteArrayOutputStream.java
index d14030bb913..908f8fb8baf 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridByteArrayOutputStream.java
+++ 
b/modules/unsafe/src/main/java/org/apache/ignite/internal/util/io/GridByteArrayOutputStream.java
@@ -22,8 +22,8 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.Arrays;
+import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.internal.util.typedef.internal.U;
 
 /**
  * This class defines output stream backed by byte array.
@@ -102,7 +102,7 @@ public class GridByteArrayOutputStream extends OutputStream 
{
         if (newCnt > buf.length)
             buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newCnt));
 
-        U.arrayCopy(b, off, buf, cnt, len);
+        GridUnsafe.arrayCopy(b, off, buf, cnt, len);
 
         cnt = newCnt;
     }
diff --git 
a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteCacheAbstractBenchmark.java
 
b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteCacheAbstractBenchmark.java
index 588082283fd..74f78083b09 100644
--- 
a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteCacheAbstractBenchmark.java
+++ 
b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteCacheAbstractBenchmark.java
@@ -38,6 +38,7 @@ import org.apache.ignite.cluster.ClusterState;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.internal.util.typedef.T2;
 import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 import org.apache.ignite.yardstick.IgniteAbstractBenchmark;
 import org.apache.ignite.yardstick.cache.model.SampleValue;
@@ -127,7 +128,7 @@ public abstract class IgniteCacheAbstractBenchmark<K, V> 
extends IgniteAbstractB
             List<CacheConfiguration> toCreate = new ArrayList<>();
 
             for (int i = 0; i < caches - 1; i++) {
-                JdkMarshaller marsh = new JdkMarshaller();
+                JdkMarshaller marsh = Marshallers.jdk();
 
                 CacheConfiguration ccfg0 = 
marsh.unmarshal(marsh.marshal(ccfg), null);
 

Reply via email to