小编Ant*_*lma的帖子

同步方法的weakValue映射引用中的内存泄漏

我正在创建一个同时执行方法的接口,同时抽象出同步细节(在需要时交换分布式实现).我已经创建了一个单独的jvm实现,它允许将字符串作为互斥体存储在映射中,以确保使用一个引用,即使传入不同引用的字符串.并发似乎工作正常,但我是惊讶地看到测试表明参考计数从未减少.我假设使用WeakValues()就足以防止内存泄漏,但似乎并非如此.任何人都可以指出可能导致这种泄漏的原因吗?

public class SynchronousMethodExecutorSynchronizedImpl implements ISynchronousMethodExecutor {

// mutex map to provide string references
final Map<String, String> mutexMap = new MapMaker()
    .weakValues()
    .makeComputingMap(
        new Function<String, String>() {
        @Override
        public String apply(String id) {
            return id;
        }
    });

@Override
public Object doSynchronousMethod(String domain, String id, ISynchronousMethod synchronousMethod) {
    synchronized(mutexMap.get(domain + "." + id))
    {
        return synchronousMethod.execute();
    } 
}
Run Code Online (Sandbox Code Playgroud)

}

这是在最后一个断言失败的测试:

public class SynchronousMethodExecutorSynchronizedImplTest extends TestCase {
int counter;
SynchronousMethodExecutorSynchronizedImpl methodExecutor;

@Override
public void before() throws Exception {
    super.before();

    methodExecutor = new …
Run Code Online (Sandbox Code Playgroud)

java memory synchronization memory-leaks concurrent-collections

5
推荐指数
1
解决办法
506
查看次数