From eba68f4e3546e46815ac127298721d40629e58d3 Mon Sep 17 00:00:00 2001 From: Florian Fittkau <ffi@informatik.uni-kiel.de> Date: Thu, 27 Feb 2014 23:05:26 +0100 Subject: [PATCH] fixed long GC calls for large traces --- .../reconstruction/TraceReconstructionBuffer.java | 10 +++++++++- .../reconstruction/TraceReconstructionFilter.java | 14 ++++++++++++-- .../TracePatternSummarizationFilter.java | 2 ++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBuffer.java b/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBuffer.java index 5767581..df7c441 100644 --- a/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBuffer.java +++ b/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBuffer.java @@ -24,6 +24,14 @@ class TraceReconstructionBuffer { private long lastBufferInsert = -1; private int maxOrderIndex = -1; + public void clear() { + events.clear(); + openEvents = 0; + updatedInThisPeriod = true; + lastBufferInsert = -1; + maxOrderIndex = -1; + } + public final void insertEvent(final AbstractEventRecord event) { updatedInThisPeriod = true; setMaxOrderIndex(event); @@ -90,6 +98,6 @@ class TraceReconstructionBuffer { } } } - return new Trace(events, valid); + return new Trace(new ArrayList<AbstractEventRecord>(events), valid); } } diff --git a/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionFilter.java b/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionFilter.java index d349843..61fa7f0 100644 --- a/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionFilter.java +++ b/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionFilter.java @@ -1,6 +1,7 @@ package explorviz.live_trace_processing.filter.reconstruction; import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -20,6 +21,7 @@ public final class TraceReconstructionFilter extends AbstractFilter implements I private final long maxTraceTimeout; private final Map<Long, TraceReconstructionBuffer> traceId2trace = new ConcurrentSkipListMap<Long, TraceReconstructionBuffer>(); + private final LinkedList<TraceReconstructionBuffer> freeBufferCache = new LinkedList<TraceReconstructionBuffer>(); public TraceReconstructionFilter(final long maxTraceTimeout, final ITraceReduction traceReduction) { @@ -33,13 +35,15 @@ public final class TraceReconstructionFilter extends AbstractFilter implements I if (record instanceof AbstractEventRecord) { final AbstractEventRecord abstractOperationEvent = ((AbstractEventRecord) record); - final long traceId = abstractOperationEvent.getTraceId(); + final Long traceId = abstractOperationEvent.getTraceId(); final TraceReconstructionBuffer traceBuffer = getBufferForTraceId(abstractOperationEvent .getTraceId()); traceBuffer.insertEvent(abstractOperationEvent); if (traceBuffer.isFinished()) { traceId2trace.remove(traceId); + traceBuffer.clear(); + freeBufferCache.addLast(traceBuffer); deliver(traceBuffer.toTrace(true)); } } else if (record instanceof Trace) { @@ -64,7 +68,11 @@ public final class TraceReconstructionFilter extends AbstractFilter implements I private final TraceReconstructionBuffer getBufferForTraceId(final long traceId) { TraceReconstructionBuffer traceBuffer = traceId2trace.get(traceId); if (traceBuffer == null) { - traceBuffer = new TraceReconstructionBuffer(); + if (freeBufferCache.isEmpty()) { + traceBuffer = new TraceReconstructionBuffer(); + } else { + traceBuffer = freeBufferCache.removeFirst(); + } traceId2trace.put(traceId, traceBuffer); } return traceBuffer; @@ -84,6 +92,8 @@ public final class TraceReconstructionFilter extends AbstractFilter implements I if ((timestamp - traceBuffer.getLastBufferInsert()) <= traceTimeout) { deliver(traceBuffer.toTrace(false)); traceIdsToRemove.add(entry.getKey()); + traceBuffer.clear(); + freeBufferCache.addLast(traceBuffer); } } } diff --git a/src/explorviz/live_trace_processing/filter/reduction/summarization/TracePatternSummarizationFilter.java b/src/explorviz/live_trace_processing/filter/reduction/summarization/TracePatternSummarizationFilter.java index 6683064..90b0fbe 100644 --- a/src/explorviz/live_trace_processing/filter/reduction/summarization/TracePatternSummarizationFilter.java +++ b/src/explorviz/live_trace_processing/filter/reduction/summarization/TracePatternSummarizationFilter.java @@ -22,6 +22,8 @@ public class TracePatternSummarizationFilter extends AbstractFilter implements I private final Map<Trace, TracePatternSummarizationBuffer> trace2buffer = new ConcurrentSkipListMap<Trace, TracePatternSummarizationBuffer>( new TraceComperator()); + // TODO cache for buffer objects + public TracePatternSummarizationFilter(final long maxCollectionDuration, final IPipeReceiver sinkReceiver) { super(sinkReceiver, Constants.TRACE_SUMMARIZATION_DISRUPTOR_SIZE, -- GitLab