gpt4 book ai didi

Java Spring : ReRun died thread after OutOfMemoryError

转载 作者:行者123 更新时间:2023-11-29 08:09:21 25 4
gpt4 key购买 nike

我用 Spring 开发了一个应用程序。我有一个创建线程的 bean,但在执行此线程期间,在运行时,JVM 抛出 OutOfMemoryError - Java 堆空间。
我想问的是以下解决方案是否适合解决问题:一旦抛出线程死亡并释放线程先前占用的内存,然后我通过另一个线程(我称之为 RestartThread),我意识到线程已经死亡(没有捕获错误),然后:
1) 调用垃圾收集器,有效释放死线程的内存;
2) 死线程的回调函数run(),重新启动死线程的前一个实例(包括死线程使用的私有(private)变量,即使在'OutOfMemoryError'产生后仍然保留在内存中)。

你怎么看这件事,它会产生问题吗?重新启动已死线程的先前状态是否是正确的解决方案?

提前致谢,
--阿鲁卡多

最佳答案

OutOfMemoryError 中恢复,尤其是在多线程环境中,是非常困难的,通常甚至是不可能的。您可能应该找出内存不足的原因(例如泄漏引用或您的应用程序只是需要比您提供的内存更多的内存)并尝试修复它,而不是尝试从中恢复。

即使您可以让抛出错误的线程死掉并重新启动它,重新启动的线程也可能会在一开始就再次死掉。在更糟糕的情况下,根本原因可能在程序的其他部分。这意味着您的应用程序中的其他线程将开始抛出相同的错误,因为它们会尝试分配新对象,导致错误在您的应用程序中级联,最终整个事情会崩溃。

内存不是您唯一的问题。如果由 OOME 终止的线程正在处理并触及其他线程也使用的某些共享对象的状态,则您的应用程序状态几乎可以是任何状态(即不一致)。此外,如果另一个线程正在等待某个监视器(互斥锁),终止的线程正在持有,或类似的(等待/通知等),另一个线程可能会死锁。在大多数情况下,编写恢复逻辑并检查恢复是否成功将非常困难,因为在您确定应用程序真正恢复之前,要检查的变量和事情太多了。

关于Java Spring : ReRun died thread after OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9243102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com