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 ();
}
}