[ https://issues.apache.org/jira/browse/AMQ-6239?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15235057#comment-15235057 ]
Tim Bain commented on AMQ-6239: ------------------------------- This algorithm isn't thread-safe in the face of concurrent removals, so if we expect to use it when not holding an exclusive lock, we need a change. The find-the-next-iterator logic needs to exist in next() as well (and so should be refactored out into a helper method that I've called getIteratorThatHasNext() in the code below), to handle the case where the current iterator has a remaining item when hasNext() is called but no longer does when next() is called. The logic of next() should be: while (true) { Iterator<MessageReference> iterator = getIteratorThatHasNext(); if (iterator == null) { return null; } MessageReference messageReference = iterator.next; if (messageReference != null) { return messageReference; } } This algorithm will keep getting the next iterator that should have a next item, and if it turns out not to then we'll keep getting the next one, until we either fine one with a non-null next() value or we run out of iterators to try. > Performance issue in PrioritizedPendingListIterator > --------------------------------------------------- > > Key: AMQ-6239 > URL: https://issues.apache.org/jira/browse/AMQ-6239 > Project: ActiveMQ > Issue Type: Improvement > Components: Broker > Affects Versions: 5.12.2 > Reporter: Martin Lichtin > Attachments: AMQ-6239-yourkit-1.jpg, PrioritizedPendingList.java.patch > > > Sending and consuming 5000 messages to/from a queue, one can see heavy CPU > use on the broker side (v 5.12.2). > Yourkit shows > PrioritizedPendingList$PrioritizedPendingListIterator.<init> > as a hot spot method. It calls ArrayList.add(Object) around 12 mio times. > Situation is that FilePendingMessageCursor.isEmpty() iterates over in-memory > messages and therefore (as it is a prioritized queue) uses > PrioritizedPendingListIterator which uses OrderedPendingList.getAsList() > which overall turns out to be an expensive method as it converts the > self-managed linked list to a Java ArrayList and then this list is filled > into another ArrayList managed by PrioritizedPendingListIterator. > PrioritizedPendingListIterator could be improved to walk the priority lists > via OrderedPendingList iterators, as these are implemented efficiently. -- This message was sent by Atlassian JIRA (v6.3.4#6332)