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

时间:2017-03-11 05:01:20

标签: java .net garbage-collection heap-memory

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

让我们假设一个像

这样的案例

您已创建了许多对象并已分配给变量,并且您正在使用这些变量 案例1.频繁间隔
案例2.不频繁的间隔

让我们采取这些对象类型

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

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

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

.Net GC如何处理这2个案例(对象案例的间隔和类型)?

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

有人可以帮我理解这个。

感谢。

2 个答案:

答案 0 :(得分:2)

  

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

(还有其他算法...... Java通常使用某种代数算法而不是标记扫描。)

  

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

     

.Net GC如何处理这两起案件

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

并发症:

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

  • 应用程序可以在堆栈中进一步捕获OOME。这可能导致某些变量超出范围,或者OOME处理程序可以采取步骤null变量等。如果有足够的对象无法访问,则应用程序可能会继续。

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

Java应用程序可以调用在本机堆中分配内容的本机代码库。如果发生这种情况,GC不会参与分配,也无法清理。清理将是图书馆的责任。

答案 1 :(得分:1)

垃圾收集器无法释放正在使用的对象。如果内存不足,则内存不足;如果有无限的内存,则Java中的OutOfMemoryError(以及.NET中的System.OutOfMemoryException)将不存在,memory leaks不会使程序崩溃。