Java中的垃圾收集器和四种类型的引用

Java中的垃圾收集器和四种类型的引用,java,reference,garbage-collection,strong-references,Java,Reference,Garbage Collection,Strong References,我正在与Java中的垃圾收集器进行斗争。我想根据引用类型,在三个列表中列出可以从某个对象访问的所有对象:强、软、弱。那里没有幽灵。我知道我需要通过递归和反射来实现它,但我找不到一个简单的方法来实现它。你能帮帮我吗?这不是一个很难的问题,但我不知道如何用简单而正确的方法来实现它。注意:我没有试图检测内存泄漏 public static List < Object > getStronglyReachable (Object from) // contains all o

我正在与Java中的垃圾收集器进行斗争。我想根据引用类型,在三个列表中列出可以从某个对象访问的所有对象:强、软、弱。那里没有幽灵。我知道我需要通过递归和反射来实现它,但我找不到一个简单的方法来实现它。你能帮帮我吗?这不是一个很难的问题,但我不知道如何用简单而正确的方法来实现它。注意:我没有试图检测内存泄漏

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

不要这样做。使用和。不幸的是,我需要它,我不能使用这些工具,因为我没有试图检测内存泄漏。我正在构建一些更复杂的东西,但是要向用户展示它。这只是它的必要部分。这只是它的必要部分然后,我强烈建议您重新审视设计决策,使其成为必要。。。因为无法从对象所在的JVM中找到对对象的所有引用。正如我写的:我想列出从某个对象可以访问的所有对象。什么不起作用?乍一看很好。只需将null检查移到方法start,这样它也适用于数组。旁注:您不需要的AFAIK是可访问的,因为您得到的是您自己的副本,之后会得到GC'd。