Java getMethod正在缓存并导致内存泄漏

Java getMethod正在缓存并导致内存泄漏,java,class,reflection,memory-leaks,Java,Class,Reflection,Memory Leaks,我使用一个自动生成的Java类来执行一个特殊的方法。因此,我必须通过反射调用该方法 此执行由Swing线程触发,因为该方法(从“未知”类调用)正在更新UI元素。新线程的每次执行都是通过调用 Class { ... public Method[] getMethods() throws SecurityException ... } getMethods的逻辑缓存元素,但我不知道为什么。一个分析器告诉我,方法obejcts正在浮动内存 我可以通过设置系统属性“sun.reflect.noCach

我使用一个自动生成的Java类来执行一个特殊的方法。因此,我必须通过反射调用该方法

此执行由Swing线程触发,因为该方法(从“未知”类调用)正在更新UI元素。新线程的每次执行都是通过调用

Class {
...
public Method[] getMethods() throws SecurityException
...
}
getMethods的逻辑缓存元素,但我不知道为什么。一个分析器告诉我,方法obejcts正在浮动内存

我可以通过设置系统属性“sun.reflect.noCaches”来禁用Java的方法缓存,但是在我更改了这些属性之后,我的应用程序变得异常缓慢

问题: 在尝试从类中获取方法之前,我可以实现自己的缓存算法。但是我正在工作的项目非常大,我们有多个反思电话

什么能解决这些问题

哪些情况会触发这些内存泄漏(错误的类加载器等)

该项目使用Java 1.5在Linux下运行

  • 首先,它使用的缓存是一个,所以缓存的方法将在OOME出现之前被删除

  • 如果仍然要删除它,只需在每次调用
    getMethods(…)
    之后调用
    clearCachesOnClassRedefinition()
    方法即可;由于方法是私有的,因此必须使用反射


  • 您是否可以使用
    getMethod(String,Class[])
    ?如果不使用所有的方法对象,它可能会减少缓存方法对象的数量。不会,因为参数不是直接已知的。只有名字是已知的。这些参数是神奇地计算出来的。这是对可用内存的过度使用,与内存泄漏不同。或者你得到了OOME并且这些缓存对象在发生时仍然存在吗?@Markus,你有十多个问题没有被接受的答案@彼得,如果没有问题能解决问题,你会怎么做?一周后你会接受一个问题吗?+1用于链接到SoftReference(因此这里显然没有mem泄漏)它不应该导致OOME,但是这个信息应该对性能调整有帮助。最后我们得到了一个OOME,分析器显示了很多方法对象。我将再次详细检查分析状态。@Markus Lausberg请执行此操作。很难相信存在内存泄漏,因为代码是公开的,并且被广泛使用。很有可能这些软引用是您认为它正在泄漏的原因。但是尽管如此,请让我们再次了解有关检查配置文件详细信息的信息。探查器(netBeans)显示的堆栈不正确。JProfiler未显示缓存的方法对象。因此,包含缓存对象的表是错误的。