< 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 >