Java中的垃圾收集器和四种类型的引用
我正在与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
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。