我研究过,GC会使用Mark and Sweep算法收集未使用的内存参考。
让我们假设一个像
这样的案例您已创建了许多对象并已分配给变量,并且您正在使用这些变量
案例1.频繁间隔
案例2.不频繁的间隔
让我们采取这些对象类型
案例1:仅限所有托管资源。
案例2:仅限所有非托管资源。
案例3:托管和非托管资源的混合。
并且让我们假设程序有足够的逻辑让析构函数和Dispose清除非托管资源。
达到阈值限制且没有更多物理内存。
.Net GC如何处理这2个案例(对象案例的间隔和类型)?
我相信无论语言如何(例如:.Net,Java),他们都有办法处理这种情况。
有人可以帮我理解这个。
感谢。
答案 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不会使程序崩溃。