我最近创建了一个应用程序,它将远程服务器上的值与本地HashMap
同步。它的工作原理是每隔x毫秒循环一次HashMap
并从服务器获取一个新值。
一切都运行良好但是当我查看它使用的内存量时,我注意到垃圾收集器不是非常有效,并且很快就使用了几千兆字节的内存。增加它工作的线程数或减少它要获取的值数似乎可以解决这个问题,但我仍然不确定是什么导致它,这促使我看看内存是如何被使用的。
我注意到有大量的FieldGetTask
个对象(我提供给一个线程池的对象被执行获取一个字段的新值)并且执行垃圾收集对这些几乎没有任何影响号。
我假设这些对象存储在某个队列的某个队列中,当没有足够的线程来处理它们时,它们就会生成。我是否正确地思考这个?如果是这样,有没有办法做到这一点,如果池在当前时间无法执行任务,execute
方法会阻塞,直到它可以?
答案 0 :(得分:0)
您可以添加自己的队列实施。一个简单的人会在大小太大时睡觉,或者它可以等待任务被消耗。
更常见的解决方案是对队列大小设置限制,并让调用者在队列已满时执行任务。请参阅RejectionHandler。