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