Java 使用jmx的动态代理会导致线程泄漏吗?

Java 使用jmx的动态代理会导致线程泄漏吗?,java,multithreading,jmx,proxy-classes,Java,Multithreading,Jmx,Proxy Classes,我在Java中遇到了一个问题,我使用JMX接口设置了一个动态代理,将其传递给另一个组件,然后该组件调用代理对象。当我这样做时,应用程序每次调用都会泄漏两个线程,这些线程似乎永远不会超时,并且在应用程序耗尽内存之前一直在生成 线程成对出现,请参见底部的stacktrace 我曾尝试在JMX中使用一些略显晦涩的系统属性一起关闭超时,但没有任何区别。关键操作似乎是动态代理调用。通过代理调用的对象实现了Serializable,因此这不应该是一个问题 当我用MBean路径和对象接口的字符串手动创建一个B

我在Java中遇到了一个问题,我使用JMX接口设置了一个动态代理,将其传递给另一个组件,然后该组件调用代理对象。当我这样做时,应用程序每次调用都会泄漏两个线程,这些线程似乎永远不会超时,并且在应用程序耗尽内存之前一直在生成

线程成对出现,请参见底部的stacktrace

我曾尝试在JMX中使用一些略显晦涩的系统属性一起关闭超时,但没有任何区别。关键操作似乎是动态代理调用。通过代理调用的对象实现了Serializable,因此这不应该是一个问题

当我用MBean路径和对象接口的字符串手动创建一个Bean并从中调用该方法时,问题就消失了

我在这里主要寻找的是关于动态代理的经典问题,因为我对它们没有太多经验

这就是proxyinstance的创建方式

public <T> T create(final Class<T> type,
        final Object... nameParameters) throws JmxConnectionException {
    return type.cast(Proxy.newProxyInstance(
            type.getClassLoader(),
            new Class< ? >[] {type},
            new MyInvocationHandler(this,
                    fill(nameOf(type), nameParameters))));
}
}

两个线程的线程堆栈跟踪(始终成对出现):


问题已经解决了。在对RemoteObject下面的对象进行序列化时会出现此问题

当你创建一个文件时,确保在你使用完它后关闭它,而不是把它留给垃圾收集,否则它们可能会继续堆积

JMXConnector connector = JMXConnectorFactory.connect(url);
//...
connector.close();

我多么幸运地搜索了
com.sun.jmx.remote.internal.ClientCommunicatorAdmin
,首先找到了这个答案。
Name: JMX server connection timeout 53
State: TIMED_WAITING on [I@18bbe70
Total blocked: 3  Total waited: 4

Stack trace: 
java.lang.Object.wait(Native Method)
com.sun.jmx.remote.internal.ServerCommunicatorAdmin$Timeout.run(ServerCommunicatorAdmin.java:150)
java.lang.Thread.run(Thread.java:619)

Name: Thread-21
State: TIMED_WAITING
Total blocked: 0  Total waited: 1

Stack trace: 
java.lang.Thread.sleep(Native Method)
com.sun.jmx.remote.internal.ClientCommunicatorAdmin$Checker.run(ClientCommunicatorAdmin.java:154)
java.lang.Thread.run(Thread.java:619)
JMXConnector connector = JMXConnectorFactory.connect(url);
//...
connector.close();