我正在使用一个ThreadPoolExecutor
有 5 个活动线程的任务,任务数量是 20,000 个。
队列几乎立即pool.execute(new WorkingThreadTask())
被任务实例填满( ) 。Runnable
每个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