You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by mi...@apache.org on 2018/01/22 17:30:56 UTC

[1/2] activemq-artemis git commit: ARTEMIS-1622 Reduce memory footprint of QueueImpl

Repository: activemq-artemis
Updated Branches:
  refs/heads/master 71a49c461 -> 72a267c46


ARTEMIS-1622 Reduce memory footprint of QueueImpl

LinkedListImpl is turned into an optionally intrusive linked list by allowing message references to extend Node.


Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/3f646474
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/3f646474
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/3f646474

Branch: refs/heads/master
Commit: 3f646474c28e86375b3bfc55a31072197579fb5c
Parents: 71a49c4
Author: Francesco Nigro <ni...@gmail.com>
Authored: Thu Jan 18 15:45:20 2018 +0100
Committer: Michael Pearce <mi...@me.com>
Committed: Mon Jan 22 17:30:45 2018 +0000

----------------------------------------------------------------------
 .../utils/collections/LinkedListImpl.java       | 39 +++++++++++++++-----
 .../core/paging/cursor/PagedReferenceImpl.java  |  4 +-
 .../core/server/impl/MessageReferenceImpl.java  |  3 +-
 3 files changed, 34 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/3f646474/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/LinkedListImpl.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/LinkedListImpl.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/LinkedListImpl.java
index 81b5d60..6071324 100644
--- a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/LinkedListImpl.java
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/LinkedListImpl.java
@@ -18,6 +18,7 @@ package org.apache.activemq.artemis.utils.collections;
 
 import java.lang.reflect.Array;
 import java.util.NoSuchElementException;
+import java.util.Objects;
 
 /**
  * A linked list implementation which allows multiple iterators to exist at the same time on the queue, and which see any
@@ -48,7 +49,7 @@ public class LinkedListImpl<E> implements LinkedList<E> {
 
    @Override
    public void addHead(E e) {
-      Node<E> node = new Node<>(e);
+      Node<E> node = Node.with(e);
 
       node.next = head.next;
 
@@ -71,7 +72,7 @@ public class LinkedListImpl<E> implements LinkedList<E> {
       if (size == 0) {
          addHead(e);
       } else {
-         Node<E> node = new Node<>(e);
+         Node<E> node = Node.with(e);
 
          node.prev = tail;
 
@@ -217,23 +218,43 @@ public class LinkedListImpl<E> implements LinkedList<E> {
       throw new IllegalStateException("Cannot find iter to remove");
    }
 
-   private static final class Node<E> {
+   public static class Node<T> {
 
-      Node<E> next;
+      private Node<T> next;
 
-      Node<E> prev;
+      private Node<T> prev;
 
-      final E val;
+      private final T val;
 
-      int iterCount;
+      private int iterCount;
 
-      Node(E e) {
+      @SuppressWarnings("unchecked")
+      protected Node() {
+         val = (T)this;
+      }
+
+      //only the head is allowed to hold a null
+      private Node(T e) {
          val = e;
       }
 
       @Override
       public String toString() {
-         return "Node, value = " + val;
+         return val == this ? "Intrusive Node" : "Node, value = " + val;
+      }
+
+      private static <T> Node<T> with(final T o) {
+         Objects.requireNonNull(o, "Only HEAD nodes are allowed to hold null values");
+         if (o instanceof Node) {
+            final Node node = (Node) o;
+            //only a node that not belong already to a list is allowed to be reused
+            if (node.prev == null && node.next == null) {
+               //reset the iterCount
+               node.iterCount = 0;
+               return node;
+            }
+         }
+         return new Node(o);
       }
    }
 

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/3f646474/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/PagedReferenceImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/PagedReferenceImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/PagedReferenceImpl.java
index 25874f0..7189007 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/PagedReferenceImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/PagedReferenceImpl.java
@@ -20,16 +20,16 @@ import java.lang.ref.WeakReference;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.activemq.artemis.api.core.Message;
-
 import org.apache.activemq.artemis.core.paging.PagedMessage;
 import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
 import org.apache.activemq.artemis.core.server.MessageReference;
 import org.apache.activemq.artemis.core.server.Queue;
 import org.apache.activemq.artemis.core.server.impl.AckReason;
 import org.apache.activemq.artemis.core.transaction.Transaction;
+import org.apache.activemq.artemis.utils.collections.LinkedListImpl;
 import org.jboss.logging.Logger;
 
-public class PagedReferenceImpl implements PagedReference {
+public class PagedReferenceImpl extends LinkedListImpl.Node<PagedReferenceImpl> implements PagedReference {
 
    private static final Logger logger = Logger.getLogger(PagedReferenceImpl.class);
 

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/3f646474/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/MessageReferenceImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/MessageReferenceImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/MessageReferenceImpl.java
index bffb1ad..1b434bc 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/MessageReferenceImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/MessageReferenceImpl.java
@@ -22,11 +22,12 @@ import org.apache.activemq.artemis.api.core.Message;
 import org.apache.activemq.artemis.core.server.MessageReference;
 import org.apache.activemq.artemis.core.server.Queue;
 import org.apache.activemq.artemis.core.transaction.Transaction;
+import org.apache.activemq.artemis.utils.collections.LinkedListImpl;
 
 /**
  * Implementation of a MessageReference
  */
-public class MessageReferenceImpl implements MessageReference {
+public class MessageReferenceImpl extends LinkedListImpl.Node<MessageReferenceImpl> implements MessageReference {
 
    private final AtomicInteger deliveryCount = new AtomicInteger();
 


[2/2] activemq-artemis git commit: This closes #1791

Posted by mi...@apache.org.
This closes #1791


Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/72a267c4
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/72a267c4
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/72a267c4

Branch: refs/heads/master
Commit: 72a267c466e40c6745a28c92067603b3d923172b
Parents: 71a49c4 3f64647
Author: Michael Pearce <mi...@me.com>
Authored: Mon Jan 22 17:30:46 2018 +0000
Committer: Michael Pearce <mi...@me.com>
Committed: Mon Jan 22 17:30:46 2018 +0000

----------------------------------------------------------------------
 .../utils/collections/LinkedListImpl.java       | 39 +++++++++++++++-----
 .../core/paging/cursor/PagedReferenceImpl.java  |  4 +-
 .../core/server/impl/MessageReferenceImpl.java  |  3 +-
 3 files changed, 34 insertions(+), 12 deletions(-)
----------------------------------------------------------------------