【发布时间】:2013-09-08 15:25:52
【问题描述】:
我正在使用一个有 5 个活动线程的 ThreadPoolExecutor,任务数量是 20,000 个。
队列几乎立即被 Runnable 任务的实例填满 (pool.execute(new WorkingThreadTask()))。
每个WorkingThreadTask 都有一个HashMap:
Map<Integer, HashMap<Integer, String>> themap ;
每个地图最多可以有 2000 个项目,每个子地图有 5 个项目。还有一个共享的BlockingQueue。
当进程运行时,我的内存不足。我正在运行:(32bit -Xms1024m -Xmx1024m)
我该如何处理这个问题?我不认为我在 hashmap 中有泄漏......当线程完成时,hashmap 被清理了对吗?
更新:
运行分析器并检查内存后,最大的命中是:
byte[] 2,516,024 hits, 918 MB
我不知道它是从哪里调用或使用的。
Name Instance count Size (bytes)
byte[ ] 2519560 918117496
oracle.jdbc.ttc7.TTCItem 2515402 120739296
char[ ] 357882 15549280
java.lang.String 9677 232248
int[ ] 2128 110976
short[ ] 2097 150024
java.lang.Class 1537 635704
java.util.concurrent.locks.ReentrantLock$NonfairSync 1489 35736
java.util.Hashtable$Entry 1417 34008
java.util.concurrent.ConcurrentHashMap$HashEntry[ ] 1376 22312
java.util.concurrent.ConcurrentHashMap$Segment 1376 44032
java.lang.Object[ ] 1279 60216
java.util.TreeMap$Entry 828 26496
oracle.jdbc.dbaccess.DBItem[ ] 802 10419712
oracle.jdbc.ttc7.v8TTIoac 732 52704
【问题讨论】:
-
尝试分析内存,看看是什么在吞噬它。
HashMaps 应该得到 GC'd,但前提是之后没有任何东西保留对它们的引用。 -
如果hashmap不共享怎么保留引用?
-
我不知道你的代码。例如,可以将引用与任务的结果一起传递到其他地方。但它可以是完全不同的东西,内存配置文件会告诉你程序用什么填充了内存。
-
20,000 个可运行项 x 2,000 个地图项 x 5 个子图 = 200,000,000 个对象...
-
Igor,200,000,000 bu 每个胎面仅处理 2000*5,完成后应该清理 hashmap
标签: java multithreading memory-management hashmap