Executors创建的线程池是否会释放内存?

时间:2017-09-02 16:30:27

标签: java multithreading

考虑基本的$.get('Bios.html', function(html){ var t_name = $('<div />', {html: html}).find('.t_name'); var t_creds = $('<div />', {html: html}).find('.t_creds'); var t_title = $('<div />', {html: html}).find('.t_title'); var t_bio = $('<div />', {html: html}).find('.t_bio'); var t_img = $('<img />', {html: html}).find('.t_img'); var t_imgTn = $('<img />', {html: html}).find('.t_imgTn'); var arrayLength = t_name.length; for (var i = 0; i < arrayLength; i++) { $('#name'+[i]).html(t_name[i]); $('#creds'+[i]).html(t_creds[i]); $('#title'+[i]).html(t_title[i]); $('#bio'+[i]).html(t_bio[i]); $('#bioImg'+[i]).html(t_img[i]); $('#bioTn'+[i]).html(t_imgTn[i]); } }).fail(console.log); }); 线程池:

fixed

我打算不断提交新任务 - 以响应传入的tcp套接字服务请求。

然而,似乎当每个任务中的Executors.newFixedThreadPool(MaxListeners) 代码完成时 - 他们消耗的内存是发布的?我看到不断增长的jvm内存使用量。

应用程序倾向于以组的形式处理一组任务。我们可以看到阶梯式内存使用模式:在每组任务之后,内存高出数十兆字节。等待几十分钟(到几小时)不会导致回收内存。

所以有两个问题:

  • 是否可以在不关闭游戏池的情况下回收Runnable线程池 的内存
  • 如果没有,那么如何使用现有的Executors包设计长期运行的线程池?

2 个答案:

答案 0 :(得分:1)

在没有对这些对象的引用之前,Java中的对象不会被垃圾收集。不要将此视为线程问题,而是将其视为对象引用问题。也就是说,找出哪些生物仍在引用该数据。

幸运的是,有一些工具可以帮助您解决这个问题。您可以使用分析器检查哪些对象仍然存在,甚至可以获取有关这些对象的数据。附件是Netbeans IDE中默认探查器的示例。它正在分析我的应用程序并显示所有生活时间轴对象(这就是我所关注的内容)。但它可以很容易地向我显示所有对象。这是一种快速查看哪些对象导致内存泄漏或只是保持活动太久的方法。

enter image description here

编辑:请注意,@ JBNIzet指出。

  

即使仍有对象,也可以对对象进行GC。重要的是,如果GC根目录(线程堆栈或静态变量)中存在对该对象的强引用链。

这一点非常重要,因为如果需要消除对该对象的所有引用,大多数事情都将永远不会被清除。

答案 1 :(得分:0)

ThreadPoolExecutor在每次执行任务后自动执行所有必要的清理工作。但它只能清理自己的记忆。在任务执行期间创建的对象是程序员的责任。如果在执行任务后内存增加,则意味着在程序中的任何地方都会引用任务创建或任务本身。