< prev index next >
src/java.base/share/classes/java/lang/ref/Finalizer.java
Print this page
@@ -25,10 +25,14 @@
package java.lang.ref;
import java.security.PrivilegedAction;
import java.security.AccessController;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
import sun.misc.JavaLangAccess;
import sun.misc.ManagedLocalsThread;
import sun.misc.SharedSecrets;
import sun.misc.VM;
@@ -184,10 +188,33 @@
}
f.runFinalizer(jla);
}}});
}
+ static String printFinalizationQueue() {
+ Map<String, int[]> countMap = new HashMap<>();
+ queue.forEach(r -> {
+ Object referent = r.get();
+ if (referent != null) {
+ countMap.computeIfAbsent(
+ referent.getClass().getName(), k -> new int[1])[0]++;
+ }
+ });
+ @SuppressWarnings("unchecked")
+ Map.Entry<String, int[]>[] entries = countMap.entrySet().toArray(
+ new Map.Entry[countMap.size()]
+ );
+ Arrays.sort(entries, (e1, e2) ->
+ Integer.compare(e2.getValue()[0], e1.getValue()[0]));
+ StringBuilder sb = new StringBuilder();
+ for (Map.Entry<String, int[]> e : entries) {
+ sb.append("Class: ").append(e.getKey())
+ .append(" count: ").append(e.getValue()[0]).append("\n");
+ }
+ return sb.toString();
+ }
+
private static class FinalizerThread extends ManagedLocalsThread {
private volatile boolean running;
FinalizerThread(ThreadGroup g) {
super(g, "Finalizer");
}
< prev index next >