Сборщик мусора и четыре типа ссылок в Java
Я борюсь с сборщиком мусора в Java. Я хочу перечислить все объекты, которые доступны из определенного объекта в три списка, в зависимости от типа ссылки: 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 ();
}
}