Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
垃圾回收时,多个线程之间共享的java对象?_Java_Multithreading_Garbage Collection - Fatal编程技术网

垃圾回收时,多个线程之间共享的java对象?

垃圾回收时,多个线程之间共享的java对象?,java,multithreading,garbage-collection,Java,Multithreading,Garbage Collection,在一个有巨大内存问题的程序上工作。 该程序由两个线程组成。线程1从队列中提取数据,对其进行处理,创建各种对象并将其传递给线程2,以便在db中进行处理和存储。 在发生和OutOfMemory错误之前,使用的堆大小一直在上升 我通过只使用一个线程解决了内存问题,因为据我所知,对象最终仍然是活动的,因此没有被GC调用,因为对它们的引用在线程2和数据库存储过程中一直存在 我仍然有一个问题:在线程1中创建的对象什么时候会被GC调用?线程1何时退出?线程2(将使用它们进行进一步处理)何时退出 在线程1中创建

在一个有巨大内存问题的程序上工作。 该程序由两个线程组成。线程1从队列中提取数据,对其进行处理,创建各种对象并将其传递给线程2,以便在db中进行处理和存储。 在发生和OutOfMemory错误之前,使用的堆大小一直在上升

我通过只使用一个线程解决了内存问题,因为据我所知,对象最终仍然是活动的,因此没有被GC调用,因为对它们的引用在线程2和数据库存储过程中一直存在

我仍然有一个问题:在线程1中创建的对象什么时候会被GC调用?线程1何时退出?线程2(将使用它们进行进一步处理)何时退出

在线程1中创建的对象预计将在何时被GC删除

只要GC喜欢,就可以收集。也许永远不会

线程1何时退出?线程2(将使用它们进行进一步处理)何时退出

以上都没有。当它们不可访问时,即当对它们的所有引用都超出范围,或包含的对象变得不可访问时,它们将成为可收集的。线程在执行时始终是可访问的

在线程1中创建的对象预计将在何时被GC删除

只要GC喜欢,就可以收集。也许永远不会

线程1何时退出?线程2(将使用它们进行进一步处理)何时退出


以上都没有。当它们不可访问时,即当对它们的所有引用都超出范围,或包含的对象变得不可访问时,它们将成为可收集的。线程在执行时总是可以访问的。

这里没有足够的信息,但我冒昧地猜测,您正在使用队列将对象从线程1“传递”到线程2,并且内存正在耗尽,因为线程1生成的“对象”比线程2能够使用的“对象”快(将它们写入数据库)


如果这是真的,您可以自己限制队列的大小,或者使用具有预定义容量的LinkedBlockingQueue之类的东西。您还可以通过创建更多线程2的实例来加快速度(前提是它们可以并行执行),尽管如果瓶颈是数据库,您可能无能为力。

这里没有足够的信息,但我大胆猜测您正在“通过”对象使用队列从线程1到线程2,并且内存不足,因为线程1生成“对象”的速度快于线程2使用它们的速度(将它们写入数据库)


如果这是真的,您可以自己限制队列的大小,或者使用具有预定义容量的LinkedBlockingQueue之类的东西。您还可以通过创建更多线程2的实例来加快速度(前提是它们可以并行执行),但如果瓶颈是数据库,则您可能无能为力。

因此,有两件事有助于使程序非常占用内存(除了创建大对象之外),1)负责db持久性的线程2速度较慢,并且长时间保持对这些对象的引用;2)包含的对象(即线程)始终是可访问的,在中创建的对象也是可访问的it@user2163389问题是为什么任何线程在处理对象之后仍然可以引用它,当然不应该是这种情况,因此可能有两个因素导致程序内存非常密集(除了创建大对象),1)负责db持久性的线程2速度慢,并且长时间保留对这些对象的引用,2)包含的对象,即线程,始终是可访问的,在中创建的对象也是可访问的it@user2163389问题是为什么任何线程在处理对象之后仍然可以引用它,当然不应该是这样的。谢谢你的回答。是的,你的猜测是正确的,这正是正在发生的事情。但我的问题是,当线程2完成将在线程1中创建并在线程2中使用的对象保存到DB时,它们是否会被GC删除。或者这些对象是否完全依赖于线程1感谢您的回答。是的,你的猜测是正确的,这正是正在发生的事情。但我的问题是,当线程2完成将在线程1中创建并在线程2中使用的对象保存到DB时,它们是否会被GC删除。或者这些对象是否完全依赖于线程1