gpt4 book ai didi

java - 如果所有对象都在使用中,垃圾收集器将如何处理

转载 作者:行者123 更新时间:2023-12-01 20:53:46 24 4
gpt4 key购买 nike

我研究过,GC会使用Mark and Sweep算法来收集未使用的内存引用。

让我们假设这样的情况,

您创建了很多对象并分配给一个变量,并且您正在
中使用这些变量情况1.频繁间隔
情况2.不频繁间隔

让我们假设这些对象类型是

情况 1:仅限所有托管资源。
情况 2:仅限所有非托管资源。
案例 3:托管和非托管资源的混合。

并且我们还假设程序有足够的逻辑供析构函数和 Dispose 来清除非托管资源。

已达到阈值限制,并且没有更多物理内存。

.Net GC 将如何处理这两种情况(区间和对象类型情况)?

我相信无论使用哪种语言(例如:.Net、Java),他们都有办法处理这种情况。

有人可以帮我理解这个吗?

谢谢。

最佳答案

I have studied that, GC will collect the unused memory reference using Mark and Sweep algorithm.

(还有其他算法......Java通常使用某种分代算法而不是标记-清除。)

The threshold limit is reached and it has no more physical memory.

How .Net GC will deal these 2 cases

在 Java 情况下,如果对象仍然(强)可达,那么最终创建对象的请求将抛出 OutOfMemoryError 异常。这通常会导致应用程序崩溃。

并发症:

  • 如果应用程序使用软引用,则 GC 将导致部分或全部引用被破坏,以尝试释放一些堆空间。

  • 应用程序可以捕获堆栈中更上方的 OOME。这可能会导致某些变量超出范围,或者 OOME 处理程序可能会对 null 变量采取措施,等等。如果有足够多的对象变得无法访问,应用程序也许能够继续。

<小时/>

注意:纯 Java 不区分托管资源和非托管资源。在 .NET 意义上,所有 Java 对象都是受管理的。

Java 应用程序可以调用在 native 堆中分配内容的 native 代码库。如果发生这种情况,GC 不会参与分配,并且无法进行清理。清理工作将由图书馆负责。

关于java - 如果所有对象都在使用中,垃圾收集器将如何处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42731548/

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