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

Java 如果所有对象都在使用中,垃圾收集器将如何处理,java,.net,garbage-collection,heap-memory,Java,.net,Garbage Collection,Heap Memory,我已经研究过,GC将使用标记和扫描算法收集未使用的内存引用 让我们假设这样一个例子 您已经创建了许多对象并分配给一个变量,您正在 案例1。频繁间隔 案例2。罕见间隔 让我们假设这些对象类型是 案例1:仅限所有托管资源 案例2:仅限所有非托管资源 案例3:托管和非托管资源的混合 另外,我们假设程序有足够的逻辑用于析构函数和Dispose清除非托管资源 已达到阈值限制,并且它没有更多的物理内存 Net GC将如何处理这两种情况(对象的时间间隔和类型) 我相信,不管使用何种语言(例如:.Net、Jav

我已经研究过,GC将使用标记和扫描算法收集未使用的内存引用

让我们假设这样一个例子

您已经创建了许多对象并分配给一个变量,您正在
案例1。频繁间隔
案例2。罕见间隔

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

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

另外,我们假设程序有足够的逻辑用于析构函数和Dispose清除非托管资源

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

Net GC将如何处理这两种情况(对象的时间间隔和类型)

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

有人能帮我理解这个吗


谢谢。

垃圾收集器无法释放正在使用的对象。如果你的内存用完了,你的内存也用完了;如果无限内存是可能的,那么Java(和.NET)中就不存在,也不会使程序崩溃。

垃圾收集器无法释放正在使用的对象。如果你的内存用完了,你的内存也用完了;如果无限内存是可能的,那么Java(和.NET)中就不存在,也不会使程序崩溃

我已经研究过,GC将使用标记和扫描算法收集未使用的内存引用

(还有其他算法……Java通常使用某种生成算法,而不是标记扫描。)

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

Net GC将如何处理这两种情况

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

并发症:

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

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


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

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

我已经研究过,GC将使用标记和扫描算法收集未使用的内存引用

(还有其他算法……Java通常使用某种生成算法,而不是标记扫描。)

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

Net GC将如何处理这两种情况

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

并发症:

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

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


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


Java应用程序可以调用在本机堆中分配内容的本机代码库。如果发生这种情况,GC将不参与分配,并且无法清理。清理将由库负责。

这不是“不考虑语言”,因为您使用的术语,如“托管资源”、“非托管资源”、“析构函数和Dispose”在Java中没有任何意义。这不是“不考虑语言”,因为您使用的术语,如“托管资源”,“非托管资源”、“析构函数和Dispose”在Java中没有任何意义。