You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2021/07/28 15:05:28 UTC

[logging-log4j2] branch release-2.x updated: Add and resuse constants to avoid creating empty arrays over and over.

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

ggregory pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/release-2.x by this push:
     new 97ec707  Add and resuse constants to avoid creating empty arrays over and over.
97ec707 is described below

commit 97ec707d69280ef57aed8fd5831dc4f3a75f7715
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Wed Jul 28 11:05:20 2021 -0400

    Add and resuse constants to avoid creating empty arrays over and over.
    
    Also, the NoGcLayout was still allocating empty byte arrays for headers
    and footers.
    
    Full local build OK.
---
 .../org/apache/log4j/bridge/AppenderAdapter.java   |  2 +-
 .../org/apache/log4j/bridge/LogEventAdapter.java   |  3 ++-
 .../builders/appender/AsyncAppenderBuilder.java    |  3 ++-
 .../builders/appender/RewriteAppenderBuilder.java  |  3 ++-
 .../org/apache/log4j/config/PropertySetter.java    |  3 ++-
 .../org/apache/log4j/spi/ThrowableInformation.java |  4 +++-
 .../org/apache/log4j/xml/Log4jEntityResolver.java  |  9 ++++----
 .../test/java/org/apache/log4j/CategoryTest.java   | 25 +++++++++++-----------
 .../logging/log4j/message/ObjectArrayMessage.java  |  6 +++---
 .../log4j/message/ReusableSimpleMessage.java       |  4 ++--
 .../log4j/spi/DefaultThreadContextStack.java       |  2 +-
 .../org/apache/logging/log4j/util/Constants.java   | 10 +++++++++
 .../org/apache/logging/log4j/util/Strings.java     |  5 +++++
 .../apache/logging/log4j/AbstractLoggerTest.java   | 21 +++++++++++-------
 .../log4j/message/ReusableSimpleMessageTest.java   | 13 ++++++-----
 .../logging/log4j/simple/SimpleLoggerTest.java     |  5 +++--
 .../java/org/apache/logging/log4j/core/Filter.java |  5 +++++
 .../core/appender/HttpURLConnectionManager.java    |  2 +-
 .../core/appender/MemoryMappedFileManager.java     |  3 ++-
 .../log4j/core/appender/db/ColumnMapping.java      |  5 +++++
 .../core/appender/db/jdbc/JdbcDatabaseManager.java |  8 +++----
 .../appender/rolling/action/PathCondition.java     |  4 ++--
 .../logging/log4j/core/config/AppenderControl.java |  5 +++++
 .../log4j/core/config/AppenderControlArraySet.java |  4 ++--
 .../log4j/core/config/ConfigurationFactory.java    |  2 +-
 .../log4j/core/config/ConfigurationSource.java     | 11 +++++-----
 .../log4j/core/config/CustomLevelConfig.java       |  5 +++++
 .../logging/log4j/core/config/CustomLevels.java    |  2 +-
 .../apache/logging/log4j/core/config/Property.java |  2 +-
 .../config/plugins/convert/Base64Converter.java    |  3 ++-
 .../config/plugins/convert/TypeConverters.java     |  3 ++-
 .../logging/log4j/core/filter/CompositeFilter.java |  5 ++---
 .../log4j/core/layout/AbstractJacksonLayout.java   |  7 +++++-
 .../logging/log4j/core/layout/GelfLayout.java      |  2 +-
 .../log4j/core/layout/LevelPatternSelector.java    |  4 ++--
 .../log4j/core/layout/MarkerPatternSelector.java   |  4 ++--
 .../logging/log4j/core/layout/PatternLayout.java   |  2 +-
 .../log4j/core/layout/ScriptPatternSelector.java   |  4 ++--
 .../logging/log4j/core/pattern/AnsiEscape.java     |  3 ++-
 .../log4j/core/pattern/PatternFormatter.java       |  6 ++++++
 .../logging/log4j/core/util/KeyValuePair.java      |  5 +++++
 .../apache/logging/log4j/core/util/UuidUtil.java   |  5 ++++-
 .../apache/logging/dumbster/smtp/SmtpMessage.java  |  4 +++-
 .../core/appender/mom/jeromq/JeroMqTestClient.java |  3 ++-
 .../async/AsyncLoggerTestArgumentFreedOnError.java | 14 ++++++------
 .../core/async/QueueFullAsyncLoggerTest3.java      | 12 +++++------
 .../log4j/core/impl/ThrowableProxyTest.java        | 16 ++++++++++----
 .../core/pattern/DatePatternConverterTest.java     |  2 +-
 .../apache/logging/log4j/core/util/AssertTest.java |  6 +++---
 .../core/util/datetime/FixedDateFormatTest.java    |  3 ++-
 .../logging/log4j/flume/appender/FlumeEvent.java   |  3 ++-
 .../layout/template/json/JsonTemplateLayout.java   |  4 +++-
 .../log4j/perf/jmh/GelfLayoutBenchmark.java        |  2 +-
 .../apache/logging/log4j/perf/nogc/NoGcLayout.java |  7 ++++--
 .../boot/Log4j2CloudConfigLoggingSystem.java       |  5 +++--
 src/changes/changes.xml                            |  3 +++
 56 files changed, 204 insertions(+), 109 deletions(-)

diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/AppenderAdapter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/AppenderAdapter.java
index 1ae0369..b2163c6 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/AppenderAdapter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/AppenderAdapter.java
@@ -51,7 +51,7 @@ public class AppenderAdapter {
                     filters.add(new FilterAdapter(filter));
                     filter = filter.getNext();
                 }
-                appenderFilter = CompositeFilter.createFilters(filters.toArray(new Filter[0]));
+                appenderFilter = CompositeFilter.createFilters(filters.toArray(Filter.EMPTY_ARRAY));
             } else {
                 appenderFilter = new FilterAdapter(appender.getFilter());
             }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LogEventAdapter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LogEventAdapter.java
index a91fd98..56f8e7e 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LogEventAdapter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LogEventAdapter.java
@@ -26,6 +26,7 @@ import org.apache.logging.log4j.core.util.Loader;
 import org.apache.logging.log4j.core.util.Throwables;
 import org.apache.logging.log4j.spi.StandardLevel;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.Strings;
 
 import java.lang.reflect.Method;
 import java.util.Map;
@@ -204,7 +205,7 @@ public class LogEventAdapter extends LoggingEvent {
     @Override
     public String[] getThrowableStrRep() {
         if (event.getThrown() != null) {
-            return Throwables.toStringList(event.getThrown()).toArray(new String[0]);
+            return Throwables.toStringList(event.getThrown()).toArray(Strings.EMPTY_ARRAY);
         }
         return null;
     }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AsyncAppenderBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AsyncAppenderBuilder.java
index 46a0b0c..940678c 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AsyncAppenderBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AsyncAppenderBuilder.java
@@ -30,6 +30,7 @@ import org.apache.logging.log4j.core.appender.AsyncAppender;
 import org.apache.logging.log4j.core.config.AppenderRef;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.Strings;
 import org.w3c.dom.Element;
 
 import java.util.ArrayList;
@@ -121,7 +122,7 @@ public class AsyncAppenderBuilder extends AbstractBuilder implements AppenderBui
                 }
             }
         });
-        return createAppender(name, level.get(), appenderRefs.get().toArray(new String[0]), blocking.get(),
+        return createAppender(name, level.get(), appenderRefs.get().toArray(Strings.EMPTY_ARRAY), blocking.get(),
                 bufferSize.get(), includeLocation.get(), config);
     }
 
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RewriteAppenderBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RewriteAppenderBuilder.java
index b06973c..3c6e642 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RewriteAppenderBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RewriteAppenderBuilder.java
@@ -33,6 +33,7 @@ import org.apache.logging.log4j.core.appender.rewrite.RewriteAppender;
 import org.apache.logging.log4j.core.config.AppenderRef;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.Strings;
 import org.w3c.dom.Element;
 
 import java.util.ArrayList;
@@ -104,7 +105,7 @@ public class RewriteAppenderBuilder extends AbstractBuilder implements AppenderB
                 }
             }
         });
-        return createAppender(name, level.get(), appenderRefs.get().toArray(new String[0]), rewritePolicyHolder.get(),
+        return createAppender(name, level.get(), appenderRefs.get().toArray(Strings.EMPTY_ARRAY), rewritePolicyHolder.get(),
                 filter.get(), config);
     }
 
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertySetter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertySetter.java
index e865da6..5325761 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertySetter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertySetter.java
@@ -56,6 +56,7 @@ import java.util.Properties;
  * Otherwise an {@link IntrospectionException} are thrown.
  */
 public class PropertySetter {
+    private static final PropertyDescriptor[] EMPTY_PROPERTY_DESCRIPTOR_ARRAY = {};
     private static Logger LOGGER = StatusLogger.getLogger();
     protected Object obj;
     protected PropertyDescriptor[] props;
@@ -93,7 +94,7 @@ public class PropertySetter {
             props = bi.getPropertyDescriptors();
         } catch (IntrospectionException ex) {
             LOGGER.error("Failed to introspect {}: {}", obj, ex.getMessage());
-            props = new PropertyDescriptor[0];
+            props = EMPTY_PROPERTY_DESCRIPTOR_ARRAY;
         }
     }
 
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/spi/ThrowableInformation.java b/log4j-1.2-api/src/main/java/org/apache/log4j/spi/ThrowableInformation.java
index 0e82a1c..898eb9c 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/spi/ThrowableInformation.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/spi/ThrowableInformation.java
@@ -20,6 +20,8 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.List;
 
+import org.apache.logging.log4j.util.Strings;
+
 /**
  * Class Description goes here.
  */
@@ -52,7 +54,7 @@ public class ThrowableInformation implements java.io.Serializable {
                 @SuppressWarnings("unchecked")
                 List<String> elements = (List<String>) toStringList.invoke(null, throwable);
                 if (elements != null) {
-                    return elements.toArray(new String[0]);
+                    return elements.toArray(Strings.EMPTY_ARRAY);
                 }
             } catch (IllegalAccessException | InvocationTargetException ex) {
                 // Ignore the exception.
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/xml/Log4jEntityResolver.java b/log4j-1.2-api/src/main/java/org/apache/log4j/xml/Log4jEntityResolver.java
index 8bd0ff3..9c9226b 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/xml/Log4jEntityResolver.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/xml/Log4jEntityResolver.java
@@ -17,14 +17,15 @@
 
 package org.apache.log4j.xml;
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.Constants;
 import org.xml.sax.EntityResolver;
 import org.xml.sax.InputSource;
 
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
 /**
  * An {@link EntityResolver} specifically designed to return
  * <code>log4j.dtd</code> which is embedded within the log4j jar
@@ -42,7 +43,7 @@ public class Log4jEntityResolver implements EntityResolver {
             if (in == null) {
                 LOGGER.warn("Could not find [log4j.dtd] using [{}] class loader, parsed without DTD.",
                         clazz.getClassLoader());
-                in = new ByteArrayInputStream(new byte[0]);
+                in = new ByteArrayInputStream(Constants.EMPTY_BYTE_ARRAY);
             }
             return new InputSource(in);
         }
diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/CategoryTest.java b/log4j-1.2-api/src/test/java/org/apache/log4j/CategoryTest.java
index f73c22b..7140b5b 100644
--- a/log4j-1.2-api/src/test/java/org/apache/log4j/CategoryTest.java
+++ b/log4j-1.2-api/src/test/java/org/apache/log4j/CategoryTest.java
@@ -17,6 +17,16 @@
 
 package org.apache.log4j;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.LoggerContext;
@@ -27,22 +37,13 @@ import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.ObjectMessage;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.apache.logging.log4j.test.appender.ListAppender;
+import org.apache.logging.log4j.util.Constants;
 import org.apache.logging.log4j.util.Strings;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Consumer;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
 /**
  * Tests of Category.
  */
@@ -133,7 +134,7 @@ public class CategoryTest {
         final Logger logger = Logger.getLogger("org.example.foo");
         logger.setLevel(Level.ERROR);
         final Priority debug = Level.DEBUG;
-        logger.l7dlog(debug, "Hello, World", new Object[0], null);
+        logger.l7dlog(debug, "Hello, World", Constants.EMPTY_OBJECT_ARRAY, null);
         assertTrue(appender.getEvents().isEmpty());
     }
 
@@ -152,7 +153,7 @@ public class CategoryTest {
         final Priority debug = Level.DEBUG;
         // the next line will throw an exception if the LogManager loggers
         // aren't supported by 1.2 Logger/Category
-        logger.l7dlog(debug, "Hello, World", new Object[0], null);
+        logger.l7dlog(debug, "Hello, World", Constants.EMPTY_OBJECT_ARRAY, null);
         assertTrue(appender.getEvents().isEmpty());
     }
 
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectArrayMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectArrayMessage.java
index dc11a56..1cf139e 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectArrayMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectArrayMessage.java
@@ -21,6 +21,8 @@ import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.util.Arrays;
 
+import org.apache.logging.log4j.util.Constants;
+
 /**
  * Handles messages that contain an Object[].
  * <p>
@@ -34,8 +36,6 @@ import java.util.Arrays;
  */
 public final class ObjectArrayMessage implements Message {
 
-    private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
-
     private static final long serialVersionUID = -5903272448334166185L;
 
     private transient Object[] array;
@@ -48,7 +48,7 @@ public final class ObjectArrayMessage implements Message {
      *            The Object to format.
      */
     public ObjectArrayMessage(final Object... obj) {
-        this.array = obj == null ? EMPTY_OBJECT_ARRAY : obj;
+        this.array = obj == null ? Constants.EMPTY_OBJECT_ARRAY : obj;
     }
 
     private boolean equalObjectsOrStrings(final Object[] left, final Object[] right) {
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java
index de0b975..258c9a4 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java
@@ -16,6 +16,7 @@
  */
 package org.apache.logging.log4j.message;
 
+import org.apache.logging.log4j.util.Constants;
 import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
@@ -25,7 +26,6 @@ import org.apache.logging.log4j.util.PerformanceSensitive;
 @PerformanceSensitive("allocation")
 public class ReusableSimpleMessage implements ReusableMessage, CharSequence, ParameterVisitable, Clearable {
     private static final long serialVersionUID = -9199974506498249809L;
-    private static Object[] EMPTY_PARAMS = new Object[0];
     private CharSequence charSequence;
 
     public void set(final String message) {
@@ -48,7 +48,7 @@ public class ReusableSimpleMessage implements ReusableMessage, CharSequence, Par
 
     @Override
     public Object[] getParameters() {
-        return EMPTY_PARAMS;
+        return Constants.EMPTY_OBJECT_ARRAY;
     }
 
     @Override
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextStack.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextStack.java
index e7a0f87..da6a5e1 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextStack.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextStack.java
@@ -259,7 +259,7 @@ public class DefaultThreadContextStack implements ThreadContextStack, StringBuil
     public Object[] toArray() {
         final MutableThreadContextStack result = STACK.get();
         if (result == null) {
-            return new String[0];
+            return Strings.EMPTY_ARRAY;
         }
         return result.toArray(new Object[result.size()]);
     }
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/Constants.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/Constants.java
index 13f20a8..2af1a17 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/Constants.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/Constants.java
@@ -83,6 +83,16 @@ public final class Constants {
     }
 
     /**
+     * The empty array.
+     */
+    public static final Object[] EMPTY_OBJECT_ARRAY = {};
+
+    /**
+     * The empty array.
+     */
+    public static final byte[] EMPTY_BYTE_ARRAY = {};
+
+    /**
      * Prevent class instantiation.
      */
     private Constants() {
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java
index 0686558..143a841 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java
@@ -35,6 +35,11 @@ public final class Strings {
     public static final String EMPTY = "";
     
     /**
+     * The empty array.
+     */
+    public static final String[] EMPTY_ARRAY = {};
+    
+    /**
      * OS-dependent line separator, defaults to {@code "\n"} if the system property {@code ""line.separator"} cannot be
      * read.
      */
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/AbstractLoggerTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/AbstractLoggerTest.java
index 02df0ed..9c51190 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/AbstractLoggerTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/AbstractLoggerTest.java
@@ -16,6 +16,16 @@
  */
 package org.apache.logging.log4j;
 
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.util.List;
+
 import org.apache.logging.log4j.junit.StatusLoggerLevel;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.ObjectMessage;
@@ -26,17 +36,12 @@ import org.apache.logging.log4j.spi.AbstractLogger;
 import org.apache.logging.log4j.spi.MessageFactory2Adapter;
 import org.apache.logging.log4j.status.StatusData;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.Constants;
 import org.apache.logging.log4j.util.MessageSupplier;
 import org.apache.logging.log4j.util.Supplier;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.parallel.ResourceLock;
 
-import java.util.List;
-
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.*;
-
 @StatusLoggerLevel("WARN")
 @ResourceLock("log4j2.MarkerManager")
 public class AbstractLoggerTest {
@@ -935,7 +940,7 @@ public class AbstractLoggerTest {
 
         @Override
         public Object[] getParameters() {
-            return new Object[0];
+            return Constants.EMPTY_OBJECT_ARRAY;
         }
 
         @Override
@@ -1293,7 +1298,7 @@ public class AbstractLoggerTest {
 
         @Override
         public Object[] getParameters() {
-            return new Object[0];
+            return Constants.EMPTY_OBJECT_ARRAY;
         }
 
         @Override
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableSimpleMessageTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableSimpleMessageTest.java
index 622f355..a53b951 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableSimpleMessageTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableSimpleMessageTest.java
@@ -16,9 +16,12 @@
  */
 package org.apache.logging.log4j.message;
 
-import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
-import static org.junit.jupiter.api.Assertions.*;
+import org.apache.logging.log4j.util.Constants;
+import org.junit.jupiter.api.Test;
 
 /**
  * Tests ReusableSimpleMessage.
@@ -66,16 +69,16 @@ public class ReusableSimpleMessageTest {
 
     @Test
     public void testGetParameters_InitiallyReturnsEmptyArray() throws Exception {
-        assertArrayEquals(new Object[0], new ReusableSimpleMessage().getParameters());
+        assertArrayEquals(Constants.EMPTY_OBJECT_ARRAY, new ReusableSimpleMessage().getParameters());
     }
 
     @Test
     public void testGetParameters_ReturnsEmptyArrayAfterMessageSet() throws Exception {
         final ReusableSimpleMessage msg = new ReusableSimpleMessage();
         msg.set("abc");
-        assertArrayEquals(new Object[0], msg.getParameters());
+        assertArrayEquals(Constants.EMPTY_OBJECT_ARRAY, msg.getParameters());
         msg.set("def");
-        assertArrayEquals(new Object[0], msg.getParameters());
+        assertArrayEquals(Constants.EMPTY_OBJECT_ARRAY, msg.getParameters());
     }
 
     @Test
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/simple/SimpleLoggerTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/simple/SimpleLoggerTest.java
index 9cd4043..63388f3 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/simple/SimpleLoggerTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/simple/SimpleLoggerTest.java
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.simple;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.junit.LoggerContextFactoryExtension;
+import org.apache.logging.log4j.util.Constants;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -46,7 +47,7 @@ public class SimpleLoggerTest {
 
     @Test
     public void testEmptyObjectArray() {
-        logger.error(new Object[0]);
+        logger.error(Constants.EMPTY_OBJECT_ARRAY);
     }
 
     /**
@@ -54,7 +55,7 @@ public class SimpleLoggerTest {
      */
     @Test
     public void testMessageWithEmptyObjectArray() {
-        logger.error("Logging with an empty Object[] {} {}", new Object[0]);
+        logger.error("Logging with an empty Object[] {} {}", Constants.EMPTY_BYTE_ARRAY);
     }
 
     /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/Filter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/Filter.java
index 0286498..054d67b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/Filter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/Filter.java
@@ -33,6 +33,11 @@ import org.apache.logging.log4j.util.EnglishEnums;
 public interface Filter extends LifeCycle {
 
     /**
+     * The empty array.
+     */
+    Filter[] EMPTY_ARRAY = {};
+
+    /**
      * Main {@linkplain org.apache.logging.log4j.core.config.plugins.Plugin#elementType() plugin element type} for
      * Filter plugins.
      *
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/HttpURLConnectionManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/HttpURLConnectionManager.java
index 90c8550..55ccfdc 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/HttpURLConnectionManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/HttpURLConnectionManager.java
@@ -65,7 +65,7 @@ public class HttpURLConnectionManager extends HttpManager {
         this.method = Objects.requireNonNull(method, "method");
         this.connectTimeoutMillis = connectTimeoutMillis;
         this.readTimeoutMillis = readTimeoutMillis;
-        this.headers = headers != null ? headers : new Property[0];
+        this.headers = headers != null ? headers : Property.EMPTY_ARRAY;
         this.sslConfiguration = sslConfiguration;
         if (this.sslConfiguration != null && !isHttps) {
             throw new ConfigurationException("SSL configuration can only be specified with URL scheme https");
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java
index d8d9ced..26c3edd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java
@@ -37,6 +37,7 @@ import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.util.Closer;
 import org.apache.logging.log4j.core.util.FileUtils;
 import org.apache.logging.log4j.core.util.NullOutputStream;
+import org.apache.logging.log4j.util.Constants;
 
 //Lines too long...
 //CHECKSTYLE:OFF
@@ -76,7 +77,7 @@ public class MemoryMappedFileManager extends OutputStreamManager {
     protected MemoryMappedFileManager(final RandomAccessFile file, final String fileName, final OutputStream os,
             final boolean immediateFlush, final long position, final int regionLength, final String advertiseURI,
             final Layout<? extends Serializable> layout, final boolean writeHeader) throws IOException {
-        super(os, fileName, layout, writeHeader, ByteBuffer.wrap(new byte[0]));
+        super(os, fileName, layout, writeHeader, ByteBuffer.wrap(Constants.EMPTY_BYTE_ARRAY));
         this.immediateFlush = immediateFlush;
         this.randomAccessFile = Objects.requireNonNull(file, "RandomAccessFile");
         this.regionLength = regionLength;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/ColumnMapping.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/ColumnMapping.java
index 1219060..a011879 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/ColumnMapping.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/ColumnMapping.java
@@ -44,6 +44,11 @@ import org.apache.logging.log4j.util.ReadOnlyStringMap;
 public class ColumnMapping {
 
     /**
+     * The empty array.
+     */
+    public static final ColumnMapping[] EMPTY_ARRAY = {};
+
+    /**
      * Builder for {@link ColumnMapping}.
      */
     public static class Builder implements org.apache.logging.log4j.core.util.Builder<ColumnMapping> {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java
index 5a6db17..1314765 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java
@@ -389,11 +389,11 @@ public final class JdbcDatabaseManager extends AbstractDatabaseManager {
      */
     @Deprecated
     public static JdbcDatabaseManager getJDBCDatabaseManager(final String name, final int bufferSize,
-            final ConnectionSource connectionSource, final String tableName, final ColumnConfig[] columnConfigs) {
+        final ConnectionSource connectionSource, final String tableName, final ColumnConfig[] columnConfigs) {
         return getManager(
-                name, new FactoryData(bufferSize, null, connectionSource, tableName, columnConfigs,
-                        new ColumnMapping[0], false, AbstractDatabaseAppender.DEFAULT_RECONNECT_INTERVAL_MILLIS, true),
-                getFactory());
+            name, new FactoryData(bufferSize, null, connectionSource, tableName, columnConfigs,
+                ColumnMapping.EMPTY_ARRAY, false, AbstractDatabaseAppender.DEFAULT_RECONNECT_INTERVAL_MILLIS, true),
+            getFactory());
     }
 
     /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/PathCondition.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/PathCondition.java
index 5308177..d00a93a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/PathCondition.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/PathCondition.java
@@ -28,7 +28,7 @@ import java.util.Arrays;
 public interface PathCondition {
     
     /**
-     * Empty array.
+     * The empty array.
      */
     static final PathCondition[] EMPTY_ARRAY = {};
 
@@ -39,7 +39,7 @@ public interface PathCondition {
      * @return a copy, never null.
      */
     static PathCondition[] copy(PathCondition[] source) {
-        return source == null ? new PathCondition[0] : Arrays.copyOf(source, source.length);
+        return source == null ? EMPTY_ARRAY : Arrays.copyOf(source, source.length);
     }
     
     /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
index 58c1e57..dc9d990 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
@@ -32,6 +32,11 @@ import org.apache.logging.log4j.util.PerformanceSensitive;
  */
 public class AppenderControl extends AbstractFilterable {
 
+    /**
+     * The empty array.
+     */
+    static final AppenderControl[] EMPTY_ARRAY = {};
+
     private final ThreadLocal<AppenderControl> recursive = new ThreadLocal<>();
     private final Appender appender;
     private final Level level;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
index b0bcab8..9886581 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
@@ -32,7 +32,7 @@ import org.apache.logging.log4j.util.PerformanceSensitive;
  */
 @PerformanceSensitive
 public class AppenderControlArraySet {
-    private final AtomicReference<AppenderControl[]> appenderArray = new AtomicReference<>(new AppenderControl[0]);
+    private final AtomicReference<AppenderControl[]> appenderArray = new AtomicReference<>(AppenderControl.EMPTY_ARRAY);
 
     /**
      * Adds an AppenderControl to this set. If this set already contains the element, the call leaves the set unchanged
@@ -108,7 +108,7 @@ public class AppenderControlArraySet {
      * @return the contents before this collection was cleared.
      */
     public AppenderControl[] clear() {
-        return appenderArray.getAndSet(new AppenderControl[0]);
+        return appenderArray.getAndSet(AppenderControl.EMPTY_ARRAY);
     }
 
     public boolean isEmpty() {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java
index 70bd425..ae6e0e4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java
@@ -609,7 +609,7 @@ public abstract class ConfigurationFactory extends ConfigurationBuilderFactory {
                         LOGGER.warn("Invalid query parameter in {}", configLocations);
                     }
                 }
-                return locations.toArray(new String[0]);
+                return locations.toArray(Strings.EMPTY_ARRAY);
             }
             return new String[] {uris[0]};
         }
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationSource.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationSource.java
index 3de940b..5e6ef9b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationSource.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationSource.java
@@ -17,7 +17,6 @@
 
 package org.apache.logging.log4j.core.config;
 
-import javax.net.ssl.HttpsURLConnection;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -32,6 +31,8 @@ import java.net.URL;
 import java.net.URLConnection;
 import java.util.Objects;
 
+import javax.net.ssl.HttpsURLConnection;
+
 import org.apache.logging.log4j.core.net.UrlConnectionFactory;
 import org.apache.logging.log4j.core.net.ssl.LaxHostnameVerifier;
 import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
@@ -40,6 +41,7 @@ import org.apache.logging.log4j.core.util.AuthorizationProvider;
 import org.apache.logging.log4j.core.util.FileUtils;
 import org.apache.logging.log4j.core.util.Loader;
 import org.apache.logging.log4j.core.util.Source;
+import org.apache.logging.log4j.util.Constants;
 import org.apache.logging.log4j.util.LoaderUtil;
 import org.apache.logging.log4j.util.PropertiesUtil;
 
@@ -48,18 +50,15 @@ import org.apache.logging.log4j.util.PropertiesUtil;
  */
 public class ConfigurationSource {
 
-    /** Empty byte array singleton. */
-    private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
-
     /**
      * ConfigurationSource to use with Configurations that do not require a "real" configuration source.
      */
-    public static final ConfigurationSource NULL_SOURCE = new ConfigurationSource(EMPTY_BYTE_ARRAY, null, 0);
+    public static final ConfigurationSource NULL_SOURCE = new ConfigurationSource(Constants.EMPTY_BYTE_ARRAY, null, 0);
 
     /**
      * ConfigurationSource to use with {@link org.apache.logging.log4j.core.config.composite.CompositeConfiguration}.
      */
-    public static final ConfigurationSource COMPOSITE_SOURCE = new ConfigurationSource(EMPTY_BYTE_ARRAY, null, 0);
+    public static final ConfigurationSource COMPOSITE_SOURCE = new ConfigurationSource(Constants.EMPTY_BYTE_ARRAY, null, 0);
     private static final String HTTPS = "https";
 
     private final File file;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CustomLevelConfig.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CustomLevelConfig.java
index d28753d..b4172ec 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CustomLevelConfig.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CustomLevelConfig.java
@@ -31,6 +31,11 @@ import org.apache.logging.log4j.status.StatusLogger;
 @Plugin(name = "CustomLevel", category = Core.CATEGORY_NAME, printObject = true)
 public final class CustomLevelConfig {
 
+    /**
+     * The empty array.
+     */
+    static final CustomLevelConfig[] EMPTY_ARRAY = {};
+
     private final String levelName;
     private final int intLevel;
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CustomLevels.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CustomLevels.java
index db6eab3..832e9c6 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CustomLevels.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CustomLevels.java
@@ -47,7 +47,7 @@ public final class CustomLevels {
     @PluginFactory
     public static CustomLevels createCustomLevels(//
             @PluginElement("CustomLevels") final CustomLevelConfig[] customLevels) {
-        return new CustomLevels(customLevels == null ? new CustomLevelConfig[0] : customLevels);
+        return new CustomLevels(customLevels == null ? CustomLevelConfig.EMPTY_ARRAY : customLevels);
     }
 
     /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Property.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Property.java
index 137fba8..076ae44 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Property.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Property.java
@@ -35,7 +35,7 @@ public final class Property {
     /**
      * @since 2.11.2
      */
-    public static final Property[] EMPTY_ARRAY = new Property[0];
+    public static final Property[] EMPTY_ARRAY = {};
 
     private static final Logger LOGGER = StatusLogger.getLogger();
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java
index e539f77..fb2c723 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java
@@ -21,6 +21,7 @@ import java.lang.reflect.Method;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.Constants;
 import org.apache.logging.log4j.util.LoaderUtil;
 
 /**
@@ -67,6 +68,6 @@ public class Base64Converter {
                 LOGGER.error("Error decoding string - " + ex.getMessage());
             }
         }
-        return new byte[0];
+        return Constants.EMPTY_BYTE_ARRAY;
     }
 }
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
index e688874..ae54525 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
@@ -39,6 +39,7 @@ import org.apache.logging.log4j.core.appender.rolling.action.Duration;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.util.CronExpression;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.Constants;
 import org.apache.logging.log4j.util.LoaderUtil;
 
 /**
@@ -109,7 +110,7 @@ public final class TypeConverters {
         public byte[] convert(final String value) {
             byte[] bytes;
             if (value == null || value.isEmpty()) {
-                bytes = new byte[0];
+                bytes = Constants.EMPTY_BYTE_ARRAY;
             } else if (value.startsWith(PREFIX_BASE64)) {
                 final String lexicalXSDBase64Binary = value.substring(PREFIX_BASE64.length());
                 bytes = Base64Converter.parseBase64Binary(lexicalXSDBase64Binary);
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java
index 5394bfb..b942bbb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java
@@ -44,15 +44,14 @@ import org.apache.logging.log4j.util.PerformanceSensitive;
 @PerformanceSensitive("allocation")
 public final class CompositeFilter extends AbstractLifeCycle implements Iterable<Filter>, Filter {
 
-    private static final Filter[] EMPTY_FILTERS = new Filter[0];
     private final Filter[] filters;
 
     private CompositeFilter() {
-        this.filters = EMPTY_FILTERS;
+        this.filters = Filter.EMPTY_ARRAY;
     }
 
     private CompositeFilter(final Filter[] filters) {
-        this.filters = filters == null ? EMPTY_FILTERS : filters;
+        this.filters = filters == null ? Filter.EMPTY_ARRAY : filters;
     }
 
     public CompositeFilter addFilter(final Filter filter) {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractJacksonLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractJacksonLayout.java
index 1cdce04..f3bdbff 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractJacksonLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractJacksonLayout.java
@@ -261,7 +261,7 @@ abstract class AbstractJacksonLayout extends AbstractStringLayout {
     private static ResolvableKeyValuePair[] prepareAdditionalFields(final Configuration config, final KeyValuePair[] additionalFields) {
         if (additionalFields == null || additionalFields.length == 0) {
             // No fields set
-            return new ResolvableKeyValuePair[0];
+            return ResolvableKeyValuePair.EMPTY_ARRAY;
         }
 
         // Convert to specific class which already determines whether values needs lookup during serialization
@@ -374,6 +374,11 @@ abstract class AbstractJacksonLayout extends AbstractStringLayout {
     }
 
     protected static class ResolvableKeyValuePair {
+        
+        /**
+         * The empty array.
+         */
+        static final ResolvableKeyValuePair[] EMPTY_ARRAY = {};
 
         final String key;
         final String value;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
index 9f3bb4a..e3fcd81 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
@@ -455,7 +455,7 @@ public final class GelfLayout extends AbstractStringLayout {
             final String mapPrefix) {
         super(config, StandardCharsets.UTF_8, null, null);
         this.host = host != null ? host : NetUtils.getLocalHostname();
-        this.additionalFields = additionalFields != null ? additionalFields : new KeyValuePair[0];
+        this.additionalFields = additionalFields != null ? additionalFields : KeyValuePair.EMPTY_ARRAY;
         if (config == null) {
             for (final KeyValuePair additionalField : this.additionalFields) {
                 if (valueNeedsLookup(additionalField.getValue())) {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/LevelPatternSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/LevelPatternSelector.java
index 0ea85f4..2c4ad4b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/LevelPatternSelector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/LevelPatternSelector.java
@@ -140,7 +140,7 @@ public class LevelPatternSelector implements PatternSelector, LocationAware {
             try {
                 final List<PatternFormatter> list = parser.parse(property.getPattern(), alwaysWriteExceptions,
                         disableAnsi, noConsoleNoAnsi);
-                PatternFormatter[] formatters = list.toArray(new PatternFormatter[0]);
+                PatternFormatter[] formatters = list.toArray(PatternFormatter.EMPTY_ARRAY);
                 formatterMap.put(property.getKey(), formatters);
                 for (int i = 0; !needsLocation && i < formatters.length; ++i) {
                     needsLocation = formatters[i].requiresLocation();
@@ -154,7 +154,7 @@ public class LevelPatternSelector implements PatternSelector, LocationAware {
         try {
             final List<PatternFormatter> list = parser.parse(defaultPattern, alwaysWriteExceptions, disableAnsi,
                     noConsoleNoAnsi);
-            defaultFormatters = list.toArray(new PatternFormatter[0]);
+            defaultFormatters = list.toArray(PatternFormatter.EMPTY_ARRAY);
             this.defaultPattern = defaultPattern;
             for (int i = 0; !needsLocation && i < defaultFormatters.length; ++i) {
                 needsLocation = defaultFormatters[i].requiresLocation();
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java
index 8b9da90..b6a78c5 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java
@@ -140,7 +140,7 @@ public class MarkerPatternSelector implements PatternSelector, LocationAware {
             try {
                 final List<PatternFormatter> list = parser.parse(property.getPattern(), alwaysWriteExceptions,
                         disableAnsi, noConsoleNoAnsi);
-                PatternFormatter[] formatters = list.toArray(new PatternFormatter[0]);
+                PatternFormatter[] formatters = list.toArray(PatternFormatter.EMPTY_ARRAY);
                 formatterMap.put(property.getKey(), formatters);
                 for (int i = 0; !needsLocation && i < formatters.length; ++i) {
                     needsLocation = formatters[i].requiresLocation();
@@ -154,7 +154,7 @@ public class MarkerPatternSelector implements PatternSelector, LocationAware {
         try {
             final List<PatternFormatter> list = parser.parse(defaultPattern, alwaysWriteExceptions, disableAnsi,
                     noConsoleNoAnsi);
-            defaultFormatters = list.toArray(new PatternFormatter[0]);
+            defaultFormatters = list.toArray(PatternFormatter.EMPTY_ARRAY);
             this.defaultPattern = defaultPattern;
             for (int i = 0; !needsLocation && i < defaultFormatters.length; ++i) {
                 needsLocation = defaultFormatters[i].requiresLocation();
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
index 4d3c978..e276237 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
@@ -396,7 +396,7 @@ public final class PatternLayout extends AbstractStringLayout {
                     final PatternParser parser = createPatternParser(configuration);
                     final List<PatternFormatter> list = parser.parse(pattern == null ? defaultPattern : pattern,
                             alwaysWriteExceptions, disableAnsi, noConsoleNoAnsi);
-                    final PatternFormatter[] formatters = list.toArray(new PatternFormatter[0]);
+                    final PatternFormatter[] formatters = list.toArray(PatternFormatter.EMPTY_ARRAY);
                     return new PatternSerializer(formatters, replace);
                 } catch (final RuntimeException ex) {
                     throw new IllegalArgumentException("Cannot parse pattern '" + pattern + "'", ex);
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
index addf5e3..fe21da2 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
@@ -165,7 +165,7 @@ public class ScriptPatternSelector implements PatternSelector, LocationAware {
         for (final PatternMatch property : properties) {
             try {
                 final List<PatternFormatter> list = parser.parse(property.getPattern(), alwaysWriteExceptions, disableAnsi, noConsoleNoAnsi);
-                PatternFormatter[] formatters = list.toArray(new PatternFormatter[0]);
+                PatternFormatter[] formatters = list.toArray(PatternFormatter.EMPTY_ARRAY);
                 formatterMap.put(property.getKey(), formatters);
                 patternMap.put(property.getKey(), property.getPattern());
                 for (int i = 0; !needsLocation && i < formatters.length; ++i) {
@@ -177,7 +177,7 @@ public class ScriptPatternSelector implements PatternSelector, LocationAware {
         }
         try {
             final List<PatternFormatter> list = parser.parse(defaultPattern, alwaysWriteExceptions, disableAnsi, noConsoleNoAnsi);
-            defaultFormatters = list.toArray(new PatternFormatter[0]);
+            defaultFormatters = list.toArray(PatternFormatter.EMPTY_ARRAY);
             this.defaultPattern = defaultPattern;
             for (int i = 0; !needsLocation && i < defaultFormatters.length; ++i) {
                 needsLocation = defaultFormatters[i].requiresLocation();
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/AnsiEscape.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/AnsiEscape.java
index c831234..64ea554 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/AnsiEscape.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/AnsiEscape.java
@@ -23,6 +23,7 @@ import java.util.Map;
 
 import org.apache.logging.log4j.core.util.Patterns;
 import org.apache.logging.log4j.util.EnglishEnums;
+import org.apache.logging.log4j.util.Strings;
 
 /**
  * Converts text into ANSI escape sequences.
@@ -289,7 +290,7 @@ public enum AnsiEscape {
      * @return a new map
      */
     public static Map<String, String> createMap(final String[] values, final String[] dontEscapeKeys) {
-        final String[] sortedIgnoreKeys = dontEscapeKeys != null ? dontEscapeKeys.clone() : new String[0];
+        final String[] sortedIgnoreKeys = dontEscapeKeys != null ? dontEscapeKeys.clone() : Strings.EMPTY_ARRAY;
         Arrays.sort(sortedIgnoreKeys);
         final Map<String, String> map = new HashMap<>();
         for (final String string : values) {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternFormatter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternFormatter.java
index 4ed2c6b..fd10374 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternFormatter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternFormatter.java
@@ -23,6 +23,12 @@ import org.apache.logging.log4j.core.impl.LocationAware;
  *
  */
 public class PatternFormatter {
+
+    /**
+     * The empty array.
+     */
+    public static final PatternFormatter[] EMPTY_ARRAY = {};
+
     private final LogEventPatternConverter converter;
     private final FormattingInfo field;
     private final boolean skipFormattingInfo;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/KeyValuePair.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/KeyValuePair.java
index 3c3b11b..63ef493 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/KeyValuePair.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/KeyValuePair.java
@@ -32,6 +32,11 @@ import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
 @Plugin(name = "KeyValuePair", category = Node.CATEGORY, printObject = true)
 public final class KeyValuePair {
 
+    /**
+     * The empty array.
+     */
+    public static final KeyValuePair[] EMPTY_ARRAY = {};
+
     private final String key;
     private final String value;
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/UuidUtil.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/UuidUtil.java
index 3ed80e5..4f5eb39 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/UuidUtil.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/UuidUtil.java
@@ -31,6 +31,9 @@ import org.apache.logging.log4j.util.PropertiesUtil;
  * less than 10,000 IDs are generated per millisecond on the same device (as identified by its MAC address).
  */
 public final class UuidUtil {
+
+    private static final long[] EMPTY_LONG_ARRAY = {};
+
     /**
      * System property that may be used to seed the UUID generation with an integer value.
      */
@@ -88,7 +91,7 @@ public final class UuidUtil {
         String assigned = PropertiesUtil.getProperties().getStringProperty(ASSIGNED_SEQUENCES);
         long[] sequences;
         if (assigned == null) {
-            sequences = new long[0];
+            sequences = EMPTY_LONG_ARRAY;
         } else {
             final String[] array = assigned.split(Patterns.COMMA_SEPARATOR);
             sequences = new long[array.length];
diff --git a/log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpMessage.java b/log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpMessage.java
index 967bb5e..93e38d1 100644
--- a/log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpMessage.java
+++ b/log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpMessage.java
@@ -23,6 +23,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.logging.log4j.util.Strings;
+
 /**
  * Container for a complete SMTP message - headers and message body.
  */
@@ -84,7 +86,7 @@ public class SmtpMessage {
     public String[] getHeaderValues(final String name) {
         final List<String> values = headers.get(name);
         if (values == null) {
-            return new String[0];
+            return Strings.EMPTY_ARRAY;
         }
         return values.toArray(new String[values.size()]);
     }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqTestClient.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqTestClient.java
index a1104ac..3807a96 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqTestClient.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqTestClient.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.Callable;
 
+import org.apache.logging.log4j.util.Constants;
 import org.zeromq.ZMQ;
 
 class JeroMqTestClient implements Callable<List<String>> {
@@ -42,7 +43,7 @@ class JeroMqTestClient implements Callable<List<String>> {
     public List<String> call() throws Exception {
         try (ZMQ.Socket subscriber = context.socket(ZMQ.SUB)) {
             subscriber.connect(endpoint);
-            subscriber.subscribe(new byte[0]);
+            subscriber.subscribe(Constants.EMPTY_BYTE_ARRAY);
             for (int messageNum = 0; messageNum < receiveCount
                     && !Thread.currentThread().isInterrupted(); messageNum++) {
                 // Use trim to remove the tailing '0' character
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestArgumentFreedOnError.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestArgumentFreedOnError.java
index 5f9f4b5..bba8007 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestArgumentFreedOnError.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestArgumentFreedOnError.java
@@ -16,6 +16,11 @@
  */
 package org.apache.logging.log4j.core.async;
 
+import static org.junit.Assert.assertTrue;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.categories.AsyncLoggers;
 import org.apache.logging.log4j.core.GarbageCollectionHelper;
@@ -28,11 +33,6 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import static org.junit.Assert.assertTrue;
-
 @Category(AsyncLoggers.class)
 public class AsyncLoggerTestArgumentFreedOnError {
 
@@ -88,12 +88,12 @@ public class AsyncLoggerTestArgumentFreedOnError {
 
         @Override
         public String getFormat() {
-            return "";
+            return Strings.EMPTY;
         }
 
         @Override
         public Object[] getParameters() {
-            return new Object[0];
+            return org.apache.logging.log4j.util.Constants.EMPTY_OBJECT_ARRAY;
         }
 
         @Override
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest3.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest3.java
index 2ec737c..af9dd96 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest3.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest3.java
@@ -16,6 +16,11 @@
  */
 package org.apache.logging.log4j.core.async;
 
+import static org.junit.Assert.assertTrue;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.categories.AsyncLoggers;
@@ -34,11 +39,6 @@ import org.junit.experimental.categories.Category;
 import org.junit.runner.RunWith;
 import org.junit.runners.BlockJUnit4ClassRunner;
 
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import static org.junit.Assert.assertTrue;
-
 /**
  * Tests queue full scenarios with pure AsyncLoggers (all loggers async).
  */
@@ -114,7 +114,7 @@ public class QueueFullAsyncLoggerTest3 extends QueueFullAbstractTest {
 
         @Override
         public Object[] getParameters() {
-            return new Object[0];
+            return org.apache.logging.log4j.util.Constants.EMPTY_OBJECT_ARRAY;
         }
 
         @Override
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableProxyTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableProxyTest.java
index 39172c7..4900476 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableProxyTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableProxyTest.java
@@ -16,6 +16,13 @@
  */
 package org.apache.logging.log4j.core.impl;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -29,23 +36,24 @@ import java.security.SecureRandom;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Stack;
+
 import javax.crypto.BadPaddingException;
 import javax.crypto.Cipher;
 import javax.crypto.KeyGenerator;
 import javax.crypto.spec.IvParameterSpec;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.config.plugins.convert.Base64Converter;
 import org.apache.logging.log4j.core.jackson.Log4jJsonObjectMapper;
 import org.apache.logging.log4j.core.jackson.Log4jXmlObjectMapper;
 import org.apache.logging.log4j.core.pattern.PlainTextRenderer;
+import org.apache.logging.log4j.util.Constants;
 import org.apache.logging.log4j.util.Strings;
 import org.junit.jupiter.api.Test;
 
-import static org.junit.jupiter.api.Assertions.*;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 /**
  *
@@ -194,7 +202,7 @@ public class ThrowableProxyTest {
             generator.init(128);
             final IvParameterSpec algorithmParameterSpec = new IvParameterSpec(bytes);
             ec.init(Cipher.ENCRYPT_MODE, generator.generateKey(), algorithmParameterSpec, secureRandom);
-            final byte[] raw = new byte[0];
+            final byte[] raw = Constants.EMPTY_BYTE_ARRAY;
             final byte[] encrypted = ec.doFinal(raw);
             final Cipher dc = Cipher.getInstance(algorithm);
             dc.init(Cipher.DECRYPT_MODE, generator.generateKey(), algorithmParameterSpec, secureRandom);
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/DatePatternConverterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/DatePatternConverterTest.java
index b735aa4..2e217e8 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/DatePatternConverterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/DatePatternConverterTest.java
@@ -319,7 +319,7 @@ public class DatePatternConverterTest {
 
     @Test
     public void testGetPatternReturnsDefaultForEmptyOptionsArray() {
-        assertEquals(DEFAULT_PATTERN, DatePatternConverter.newInstance(new String[0]).getPattern());
+        assertEquals(DEFAULT_PATTERN, DatePatternConverter.newInstance(Strings.EMPTY_ARRAY).getPattern());
     }
 
     @Test
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java
index 56c4299..0216e88 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java
@@ -16,6 +16,8 @@
  */
 package org.apache.logging.log4j.core.util;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -23,8 +25,6 @@ import java.util.HashMap;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
 public class AssertTest {
 
     public static Object[][] data() {
@@ -32,7 +32,7 @@ public class AssertTest {
             // value, isEmpty
             {null, true},
             {"", true},
-            {new Object[0], true},
+            {org.apache.logging.log4j.util.Constants.EMPTY_OBJECT_ARRAY, true},
             {new ArrayList<>(), true},
             {new HashMap<>(), true},
             {0, false},
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/datetime/FixedDateFormatTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/util/datetime/FixedDateFormatTest.java
index 43c710a..434335f 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/datetime/FixedDateFormatTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/util/datetime/FixedDateFormatTest.java
@@ -31,6 +31,7 @@ import java.util.TimeZone;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.logging.log4j.core.util.datetime.FixedDateFormat.FixedFormat;
+import org.apache.logging.log4j.util.Strings;
 import org.junit.Test;
 
 /**
@@ -62,7 +63,7 @@ public class FixedDateFormatTest {
 
     @Test
     public void testCreateIfSupported_defaultIfOptionsArrayEmpty() {
-        final FixedDateFormat fmt = FixedDateFormat.createIfSupported(new String[0]);
+        final FixedDateFormat fmt = FixedDateFormat.createIfSupported(Strings.EMPTY_ARRAY);
         assertEquals(DEFAULT.getPattern(), fmt.getFormat());
     }
 
diff --git a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java
index cee5d9c..045f3dd 100644
--- a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java
+++ b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java
@@ -39,6 +39,7 @@ import org.apache.logging.log4j.message.MapMessage;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.StructuredDataId;
 import org.apache.logging.log4j.message.StructuredDataMessage;
+import org.apache.logging.log4j.util.Constants;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.Strings;
 
@@ -188,7 +189,7 @@ public class FlumeEvent extends SimpleEvent implements LogEvent {
     @Override
     public void setBody(final byte[] body) {
         if (body == null || body.length == 0) {
-            super.setBody(new byte[0]);
+            super.setBody(Constants.EMPTY_BYTE_ARRAY);
             return;
         }
         if (compress) {
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java
index 9276fd3..59336c8 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java
@@ -139,7 +139,7 @@ public class JsonTemplateLayout implements StringLayout {
         final EventTemplateAdditionalField[] eventTemplateAdditionalFields =
                 builder.eventTemplateAdditionalFields != null
                         ? builder.eventTemplateAdditionalFields
-                        : new EventTemplateAdditionalField[0];
+                        : EventTemplateAdditionalField.EMPTY_ARRAY;
 
         // Create the resolver context.
         final EventResolverContext resolverContext = EventResolverContext
@@ -535,6 +535,8 @@ public class JsonTemplateLayout implements StringLayout {
             printObject = true)
     public static final class EventTemplateAdditionalField {
 
+        static final EventTemplateAdditionalField[] EMPTY_ARRAY = {};
+
         public enum Format { STRING, JSON }
 
         private final String key;
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/GelfLayoutBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/GelfLayoutBenchmark.java
index dd64055..0a4d353 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/GelfLayoutBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/GelfLayoutBenchmark.java
@@ -50,7 +50,7 @@ public class GelfLayoutBenchmark {
     private static final CharSequence MESSAGE =
             "This is rather long and chatty log message with quite some interesting information and a bit of fun in it which is suitable here";
     private static final LogEvent EVENT = createLogEvent();
-    private static final KeyValuePair[] ADDITIONAL_FIELDS = new KeyValuePair[0];
+    private static final KeyValuePair[] ADDITIONAL_FIELDS = KeyValuePair.EMPTY_ARRAY;
 
     private static LogEvent createLogEvent() {
         final Marker marker = null;
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/NoGcLayout.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/NoGcLayout.java
index 62bbf50..0eedb28 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/NoGcLayout.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/NoGcLayout.java
@@ -37,6 +37,9 @@ import java.util.Map;
  * </p>
  */
 public class NoGcLayout implements Layout<Serializable> {
+
+    private static final byte[] EMPTY_BYTE_ARRAY = {};
+
     private final StringBuilder cachedStringBuilder = new StringBuilder(2048);
     private final PatternSerializer2 serializer = new PatternSerializer2();
     private final StringBuilderEncoder cachedHelper;
@@ -103,12 +106,12 @@ public class NoGcLayout implements Layout<Serializable> {
 
     @Override
     public byte[] getFooter() {
-        return new byte[0];
+        return EMPTY_BYTE_ARRAY;
     }
 
     @Override
     public byte[] getHeader() {
-        return new byte[0];
+        return EMPTY_BYTE_ARRAY;
     }
 
     @Override
diff --git a/log4j-spring-boot/src/main/java/org/apache/logging/log4j/spring/boot/Log4j2CloudConfigLoggingSystem.java b/log4j-spring-boot/src/main/java/org/apache/logging/log4j/spring/boot/Log4j2CloudConfigLoggingSystem.java
index 2ebe9ce..05f378c 100644
--- a/log4j-spring-boot/src/main/java/org/apache/logging/log4j/spring/boot/Log4j2CloudConfigLoggingSystem.java
+++ b/log4j-spring-boot/src/main/java/org/apache/logging/log4j/spring/boot/Log4j2CloudConfigLoggingSystem.java
@@ -46,6 +46,7 @@ import org.apache.logging.log4j.core.util.AuthorizationProvider;
 import org.apache.logging.log4j.core.util.FileUtils;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.Strings;
 import org.springframework.boot.logging.LogFile;
 import org.springframework.boot.logging.LoggingInitializationContext;
 import org.springframework.boot.logging.log4j2.Log4J2LoggingSystem;
@@ -88,7 +89,7 @@ public class Log4j2CloudConfigLoggingSystem extends Log4J2LoggingSystem {
         if (location != null) {
             List<String> list = new ArrayList<>(Arrays.asList(super.getStandardConfigLocations()));
             list.add(location);
-            locations = list.toArray(new String[0]);
+            locations = list.toArray(Strings.EMPTY_ARRAY);
         }
         return locations;
     }
@@ -174,7 +175,7 @@ public class Log4j2CloudConfigLoggingSystem extends Log4J2LoggingSystem {
                         LOGGER.warn("Bad data in configuration string: {}", pair);
                     }
                 }
-                return locations.toArray(new String[0]);
+                return locations.toArray(Strings.EMPTY_ARRAY);
             } catch (MalformedURLException ex) {
                 LOGGER.warn("Unable to parse configuration URL {}", configLocations);
             }
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index b5dc341..f0f253d 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -217,6 +217,9 @@
       <action issue="LOG4J2-3131" dev="ggregory" type="fix" due-to="Adam Long, Gary Gregory">
         Attempting to call getExtendedStackTraceAsString() after deserializing JSON LogEvent results in a NPE.
       </action>
+      <action issue="LOG4J2-3131" dev="ggregory" type="fix" due-to="Gary Gregory">
+        NoGcLayout allocates empty bytes arrays for its header and footer.
+      </action>
       <!-- ADDS -->
       <action issue="LOG4J2-2962" dev="vy" type="add">
         Enrich "map" resolver by unifying its backend with "mdc" resolver.