1

Javaでガベージコレクターと戦っています。参照タイプに応じて、特定のオブジェクトから到達可能なすべてのオブジェクトを 3 つのリストにリストしたいと考えていますstrong, soft, weak。そこにファントムはありません。再帰的かつリフレクションによって行う必要があることはわかっていますが、それを実現する簡単な方法が見つかりません。手伝っていただけませんか?それほど難しい問題ではありませんが、簡単で正しい方法で達成する方法がわかりません。注: メモリ リークを検出しようとしているわけではありません。

   public static List < Object > getStronglyReachable (Object from)
     // contains all objects that are ONLY strongly reachable

   public static List < Object > getSoftlyReachable (Object from)
     // contains all objects that are strongly OR softly reachable

   public static List < Object > getWeaklyReachable (Object from)
     // contains all objects that are strongly OR softly OR weakly reachable

ここに私が現在持っているものがありますが、実際には機能していません:

private static void collectAllReachableObjects (Object from, Set < Object > result) throws IllegalArgumentException, IllegalAccessException
{
    // if it's already added, don't do that again
    if (result.contains (from))
        return;

    // isStrongReference makes softAllowed false and weakAllowed false;
    // isSoftReference makes softAllowed true and weakAllowed false;
    // isWeakReference makes softAllowed true and weakAllowed true;
    // Phantom References are never allowed
    if (PhantomReference.class.isAssignableFrom (from.getClass ())) return;
    if (weakAllowed == false &&  WeakReference.class.isAssignableFrom (from.getClass ())) return;
    if (softAllowed == false &&  SoftReference.class.isAssignableFrom (from.getClass ())) return;

    // add to my list
    result.add (from);

    // if an object is an array, iterate over its elements
    if (from.getClass ().isArray ())
        for (int i = 0; i < Array.getLength (from); i++)
            collectAllReachableObjects (Array.get (from, i), result);

    Class < ? > c = from.getClass ();
    while (c != null)
    {
        Field fields[] = c.getDeclaredFields ();
        for (Field field : fields)
        {
            boolean wasAccessible = field.isAccessible ();
            field.setAccessible (true);
            Object value = field.get (from);
            if (value != null)
            {
                collectAllReachableObjects (value, result);
            }
            field.setAccessible (wasAccessible);
        }
        c = c.getSuperclass ();
    }
}
4

0 に答える 0