Skip to content

Commit 63a796b

Browse files
committed
HeapOperations: added entrypoint for computing retained sizes
1 parent 0075c32 commit 63a796b

File tree

2 files changed

+71
-17
lines changed

2 files changed

+71
-17
lines changed

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/DataType.java

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,11 @@
2828
import java.lang.ref.WeakReference;
2929
import java.util.Arrays;
3030
import java.util.HashSet;
31-
import java.util.List;
3231
import java.util.Map;
3332
import java.util.Set;
3433
import java.util.WeakHashMap;
3534
import javax.swing.SwingUtilities;
36-
import org.netbeans.api.progress.ProgressHandle;
35+
import org.graalvm.visualvm.heapviewer.utils.HeapOperations;
3736
import org.graalvm.visualvm.lib.jfluid.heap.Heap;
3837
import org.graalvm.visualvm.lib.jfluid.heap.Instance;
3938
import org.graalvm.visualvm.lib.jfluid.heap.JavaClass;
@@ -169,8 +168,7 @@ public static abstract class ValueProvider {
169168

170169
@NbBundle.Messages({
171170
"RetainedSize_ComputeRetainedMsg=<html><b>Retained sizes will be computed.</b><br><br>For large heap dumps this operation can take a significant<br>amount of time. Do you want to continue?</html>",
172-
"RetainedSize_ComputeRetainedCaption=Compute Retained Sizes",
173-
"RetainedSize_ComputingRetainedMsg=Computing retained sizes..."
171+
"RetainedSize_ComputeRetainedCaption=Compute Retained Sizes"
174172
})
175173
private static class RetainedSize extends Lazy<Long> {
176174

@@ -207,19 +205,17 @@ public void computeValuesImmediately(Heap heap) {
207205
}
208206

209207
public void computeValuesImmediately(Heap heap, final Runnable whenComputed) {
210-
List<JavaClass> classes = heap.getAllClasses();
211-
if (classes.size() > 0) {
212-
ProgressHandle pd = ProgressHandle.createHandle(Bundle.RetainedSize_ComputingRetainedMsg());
213-
pd.start();
214-
classes.get(0).getRetainedSizeByClass();
215-
pd.finish();
208+
try {
209+
HeapOperations.initializeRetainedSizes(heap);
210+
211+
SwingUtilities.invokeLater(new Runnable() {
212+
public void run() { valuesComputed(heap, whenComputed); }
213+
});
214+
} catch (InterruptedException ex) {
215+
// requesting thread has been interrupted, any subsequent requests will wait for the result as well
216+
} finally {
217+
computing = false;
216218
}
217-
218-
computing = false;
219-
220-
SwingUtilities.invokeLater(new Runnable() {
221-
public void run() { valuesComputed(heap, whenComputed); }
222-
});
223219
}
224220

225221
}

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/HeapOperations.java

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@
2424
*/
2525
package org.graalvm.visualvm.heapviewer.utils;
2626

27+
import java.util.List;
2728
import java.util.Map;
2829
import java.util.WeakHashMap;
2930
import javax.swing.SwingUtilities;
3031
import org.graalvm.visualvm.heapviewer.HeapFragment;
3132
import org.graalvm.visualvm.lib.jfluid.heap.Heap;
3233
import org.graalvm.visualvm.lib.jfluid.heap.HeapProgress;
3334
import org.graalvm.visualvm.lib.jfluid.heap.Instance;
35+
import org.graalvm.visualvm.lib.jfluid.heap.JavaClass;
3436
import org.netbeans.api.progress.ProgressHandle;
3537
import org.openide.util.NbBundle;
3638

@@ -40,7 +42,8 @@
4042
*/
4143
@NbBundle.Messages({
4244
"HeapOperations_ComputingReferences=Computing References...",
43-
"HeapOperations_ComputingGCRoots=Computing GC Roots..."
45+
"HeapOperations_ComputingGCRoots=Computing GC Roots...",
46+
"HeapOperations_ComputingRetainedSizes=Computing Retained Sizes..."
4447
})
4548
public final class HeapOperations {
4649

@@ -71,6 +74,10 @@ public static void initializeGCRoots(Heap heap) throws InterruptedException {
7174
get(heap).initializeGCRootsImpl(heap);
7275
}
7376

77+
public static void initializeRetainedSizes(Heap heap) throws InterruptedException {
78+
get(heap).initializeRetainedSizesImpl(heap);
79+
}
80+
7481

7582
// --- References ----------------------------------------------------------
7683

@@ -171,4 +178,55 @@ public void run() {
171178
_gcrootsComputer.join();
172179
}
173180

181+
182+
// --- GC Roots ------------------------------------------------------------
183+
184+
private static boolean retainedInitialized;
185+
private static volatile Thread retainedComputer;
186+
187+
private void initializeRetainedSizesImpl(Heap heap) throws InterruptedException {
188+
initializeGCRootsImpl(heap);
189+
190+
Thread _retainedComputer;
191+
192+
synchronized (this) {
193+
if (retainedInitialized) return;
194+
195+
if (retainedComputer == null) {
196+
Runnable workerR = new Runnable() {
197+
public void run() {
198+
ProgressHandle pHandle = null;
199+
200+
try {
201+
pHandle = ProgressHandle.createHandle(Bundle.HeapOperations_ComputingRetainedSizes());
202+
pHandle.setInitialDelay(1000);
203+
pHandle.start();
204+
205+
HeapFragment.setProgress(pHandle, 0);
206+
207+
List<JavaClass> classes = heap.getAllClasses();
208+
if (!classes.isEmpty()) classes.get(0).getRetainedSizeByClass();
209+
} finally {
210+
if (pHandle != null) pHandle.finish();
211+
}
212+
213+
synchronized (this) {
214+
retainedInitialized = false;
215+
retainedComputer = null;
216+
}
217+
}
218+
};
219+
retainedComputer = new Thread(workerR, "Retained Sizes Computer"); // NO18N
220+
_retainedComputer = retainedComputer; // NOTE: must be assigned before starting the thread which eventually nulls the retainedComputer!
221+
retainedComputer.start();
222+
} else {
223+
_retainedComputer = retainedComputer;
224+
}
225+
}
226+
227+
assert !SwingUtilities.isEventDispatchThread();
228+
229+
_retainedComputer.join();
230+
}
231+
174232
}

0 commit comments

Comments
 (0)