You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ck...@apache.org on 2018/06/30 02:51:45 UTC

logging-log4j2 git commit: LOG4J2-2362 ReusableObjectMessage memory leak

Repository: logging-log4j2
Updated Branches:
  refs/heads/master 4bfefbb5b -> 4050cf639


LOG4J2-2362 ReusableObjectMessage memory leak

ReusableObjectMessage would previously retain a reference to
the most recently logged object.


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4050cf63
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4050cf63
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4050cf63

Branch: refs/heads/master
Commit: 4050cf63950b3fa2ff41cc54918b2281de9095ef
Parents: 4bfefbb
Author: Carter Kozak <ck...@apache.org>
Authored: Fri Jun 29 16:02:55 2018 -0400
Committer: Carter Kozak <ck...@apache.org>
Committed: Fri Jun 29 22:51:31 2018 -0400

----------------------------------------------------------------------
 .../logging/log4j/message/ReusableMessageFactory.java     |  2 ++
 .../java/org/apache/logging/log4j/LambdaLoggerTest.java   |  5 ++++-
 .../logging/log4j/core/EventParameterMemoryLeakTest.java  | 10 ++++++++--
 src/changes/changes.xml                                   |  6 ++++++
 4 files changed, 20 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4050cf63/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
index d75ca01..c258045 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
@@ -86,6 +86,8 @@ public final class ReusableMessageFactory implements MessageFactory2, Serializab
     public static void release(final Message message) { // LOG4J2-1583
         if (message instanceof ReusableParameterizedMessage) {
             ((ReusableParameterizedMessage) message).reserved = false;
+        } else if (message instanceof ReusableObjectMessage) {
+            ((ReusableObjectMessage) message).set(null);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4050cf63/log4j-api/src/test/java/org/apache/logging/log4j/LambdaLoggerTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/LambdaLoggerTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/LambdaLoggerTest.java
index f6d1623..b532171 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/LambdaLoggerTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/LambdaLoggerTest.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.message.ReusableMessage;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.apache.logging.log4j.spi.AbstractLogger;
 import org.apache.logging.log4j.util.Supplier;
@@ -46,7 +47,9 @@ public class LambdaLoggerTest {
             this.fqcn = fqcn;
             this.level = level;
             this.marker = marker;
-            this.message = message;
+            this.message = (message instanceof ReusableMessage) ?
+                    ((ReusableMessage) message).memento() :
+                    message;
             this.throwable = t;
         }
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4050cf63/log4j-core/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java
index de99eef..d2106f9 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java
@@ -49,21 +49,27 @@ public class EventParameterMemoryLeakTest {
     }
 
     @Test
+    @SuppressWarnings("UnusedAssignment") // parameter set to null to allow garbage collection
     public void testParametersAreNotLeaked() throws Exception {
         final File file = new File("target", "EventParameterMemoryLeakTest.log");
         assertTrue("Deleted old file before test", !file.exists() || file.delete());
 
         final Logger log = LogManager.getLogger("com.foo.Bar");
         CountDownLatch latch = new CountDownLatch(1);
-        log.info("Message with parameter {}", new ParameterObject("paramValue", latch));
+        Object parameter = new ParameterObject("paramValue", latch);
+        log.info("Message with parameter {}", parameter);
+        log.info(parameter);
+        parameter = null;
         CoreLoggerContexts.stopLoggerContext(file);
         final BufferedReader reader = new BufferedReader(new FileReader(file));
         final String line1 = reader.readLine();
         final String line2 = reader.readLine();
+        final String line3 = reader.readLine();
         reader.close();
         file.delete();
         assertThat(line1, containsString("Message with parameter paramValue"));
-        assertNull("Expected only a single line", line2);
+        assertThat(line2, containsString("paramValue"));
+        assertNull("Expected only a two lines", line3);
         GarbageCollectionHelper gcHelper = new GarbageCollectionHelper();
         gcHelper.run();
         try {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4050cf63/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index cd89a1a..9d2a37d 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -194,6 +194,9 @@
       <action issue="LOG4J2-2357" dev="ggregory" type="update">
         Update Jackson from 2.9.5 to 2.9.6.
       </action>
+      <action issue="LOG4J2-2362" dev="ckozak" type="fix">
+        Fixed a memory leak in which ReusableObjectMessage would hold a reference to the most recently logged object.
+      </action>
     </release>
     <release version="2.11.1" date="2018-MM-DD" description="GA Release 2.11.1">
       <action issue="LOG4J2-2268" dev="rgoers" type="fix" due-to="Tilman Hausherr">
@@ -284,6 +287,9 @@
       <action issue="LOG4J2-2358" dev="ggregory" type="update">
         Update Kafka client from 1.0.0 to 1.1.0.
       </action>
+      <action issue="LOG4J2-2362" dev="ckozak" type="fix">
+        Fixed a memory leak in which ReusableObjectMessage would hold a reference to the most recently logged object.
+      </action>
     </release>
     <release version="2.11.0" date="2018-xx-xx" description="GA Release 2.11.0">
       <action issue="LOG4J2-2104" dev="rgoers" type="fix">