2017-06-08 85 views
0

在我的Android应用程序中,我使用了ConcurrentHashMap。只是一个GET操作,然后堆放超过流量java.util.concurrent.ConcurrentHashMap.get()抛出StackOverflowError

设备型号:NX511J Android操作系统5.1.1 Android SDK中:22

以下是完整的堆栈跟踪:

java.lang.StackOverflowError: stack size 1036KB 

(13000 same stack trace) 

    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1507) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:754) 
    at com.tmall.wireless.minsk.internal.store.impl.ConfigStoreImpl.c(ConfigStoreImpl.java:526) 
    at com.tmall.wireless.minsk.internal.store.impl.ConfigStoreImpl.a(ConfigStoreImpl.java:461) 
    at mwo.a(MinskImpl.java:265) 
    at jfd.a(TMConfigCenterManager.java:186) 
    at ogf.c(TMRewriteEngine.java:177) 
    at ogf$1.run(TMRewriteEngine.java:141) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
    at java.lang.Thread.run(Thread.java:818) 

的源代码(我想是不是用的问题):

private final ConcurrentMap<String, Module> immutableLocalCache = new ConcurrentHashMap<>(); 
    private Module getFromLocal(String moduleName) { 
     Module module = immutableLocalCache.get(moduleName);// Stack over flow 
     if (null != module) { 
      return module; 
     } 
     //... 
     try { 
      Module ret = MinskDataConvertUtils.createMinskModule(data); 
      immutableLocalCache.put(ret.name, ret); 
      return ret; 
     } catch (Exception e) { 
      LogUtils.exception(e); 
      return null; 
     } 
    } 
+0

你可以发布你的代码和一些上下文吗?很难说从堆栈跟踪中发生了什么。 – pablochan

+0

@pablochan android 5.1.1,只是一个简单的获取调用,没有什么不同 – teaey

+0

你在该图中有多少条目? – pablochan

回答

0

一个堆栈溢出常见的原因是糟糕的递归调用或条件你已经通循环播放。通常,这是由于递归函数没有正确的终止条件导致的,所以它最终会永远调用它自己。

可能是你迭代或使用递归来获取操作。如果您正在使用循环,请检查您提供的条件。 仍然错误是坚持然后张贴您的代码。

+0

实际上没有递归调用 – teaey

+0

可以请你分享一下你的代码 –

+0

我更新了源代码。 – teaey