【问题标题】:Garbage collection and reflection垃圾收集和反射
【发布时间】:2011-06-22 17:24:45
【问题描述】:

我想知道当你有一个用于获取某些字段值的反射类时,垃圾收集是如何工作的。当不使用正式语言语法来访问它们时,JVM 如何知道这些字段引用的值是可访问的,因此目前不适合进行垃圾收集?

一个小的 sn-p 指示问题(尽管此处过分强调反射):

/**
 *
 */

import java.lang.reflect.Field;

public class B {
    protected B previous = null, next = null;

    /**
     *
     */
    public B(B from) {
        this.previous = from;
    }

    public void transition(B to) {
        this.next = to;
    }

    public B next() {
        try {
            Field f = getClass().getField("next");
            f.setAccessible(true);
            try {
                return (B)f.get(this);
            } finally {
                f.setAccessible(false);
            }
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
    }

    public B previous() {
        try {
            Field f = getClass().getField("previous");
            f.setAccessible(true);
            try {
                return (B)f.get(this);
            } finally {
                f.setAccessible(false);
            }
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
    }
}

干杯,
克里斯

【问题讨论】:

  • 有趣的问题。它是否受到某种嵌入式 Java 应用程序的启发?
  • 能否请您包含一个代码 sn-p 以阐明“用于获取某些字段值的具有反射的类”的含义?
  • 其实我正在做一个网络框架的测试,有些字段是通过反射访问的。想知道反射是如何影响内存使用的,也许是 JVM 保留了它不确定的对象。
  • 反射总是增加额外的开销。例如,如果您正在使用反射执行方法调用,则必须首先获取对 Method 对象的引用等。这意味着您正在构造对象并执行其他几个调用(通常是一些条件逻辑)只是为了执行一种方法调用。一般来说,当这种方法的灵活性超过性能劣势时,您会更喜欢这种方法。
  • 同意。不过,我正在做一些复杂的事情,涉及通过代理的状态和尊重。几乎就像一个更简单的注入版本。

标签: java reflection memory-leaks garbage-collection


【解决方案1】:

如果您正在访问实例的字段,那么您仍然需要对该实例的引用。在这种情况下,GC 不会有任何异常。

【讨论】:

    【解决方案2】:

    要访问对象的字段,您必须具有对该对象的引用。如果您通过反射或直接访问它,则对于您是否对该对象具有强引用没有任何区别。

    【讨论】:

      【解决方案3】:

      这是一个有点奇怪的测试用例:您正在使用反射来访问“this”。根据定义,“this”在声明类的实例方法中使用时是活动的,因此不会被 GC。

      但更重要的是,反射只是允许您在已引用的对象中操作字段等。这就是关键 - 如果你可以给 Reflect 实例来检查,你显然仍然有对该对象的引用,因此它仍然存在。

      【讨论】:

        猜你喜欢
        • 2012-03-21
        • 2013-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多