当前位置: 首页 > 知识库问答 >
问题:

当我要求dotMemory强制垃圾收集[duplicate]时,会发生什么情况

淳于鹏
2023-03-14

我使用dotMemory来分析我的应用程序,我注意到下面的行为:在我的代码中有一些点,我通过使用手动执行垃圾回收机制

GC.Collect();
GC.WaitForPendingFinalizers();

在dotMemory内部,我看到内存实际上在这些点上被释放了,但是如果在那之后我点击“强制气相色谱”,就会收集更多的垃圾。他们这样做的方式是什么,为什么我的代码没有收集内存,是否有可能实现相同级别的收集?

我还尝试执行多个集合,即。

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();

尽管它似乎回收了更多的内存,但它从未接近dotMemory的性能

共有1个答案

叶茂才
2023-03-14

来自JetBrain论坛:

"强制GC"按钮从本机代码调用GC。

当你呼叫GC时。Collect()方法,它将执行以下步骤:

释放可以立即释放的内存查找具有Finize方法的对象,并将其放入队列GC. Collect()只释放托管对象。此外,CLR有几种不同的GC策略,根据情况应用,以最大限度地减少导致GC的延迟,我们不能影响它。如果托管对象没有Finize方法或此方法实现不正确,则永远不会释放托管对象使用的本机内存。

我们建议您使用GC调用WaitForPendingFinalizers方法。收集并重复几次:

for (int i = 0; i < 4; i++)
{
    GC.Collect(2, GCCollectionMode.Forced, true);
    GC.WaitForPendingFinalizers();
}

它可以显示更好的结果,但我们不能保证此代码将导致与从本机代码调用的完整GC相同的结果。

GC。收集方法:https://msdn.microsoft.com/en-us/library/hh138633(v=vs.110)。aspx

 类似资料:
  • 我试图了解垃圾收集是如何工作的。我很清楚以下几点: 当JVM无法将对象分配给年轻一代时,它将触发小型GC 列表项 当堆满时,JVM将触发完整的GC(两个次要的主要GC)。 但是,年轻一代和老一代中不再引用、符合GC条件但没有触发GC的对象如何(即年轻/老一代堆空间未满,因此没有GC发生) 这是否意味着在GC发生之前,这些对象将保留在年轻/老一代堆空间中? 我的阅读材料 > http://www.c

  • 问题内容: 是什么决定了垃圾收集器何时真正收集?它是在一定时间之后还是在一定数量的内存用完之后发生的吗?还是还有其他因素? 问题答案: 它在确定是时候运行时运行。在世代垃圾收集器中,一种常见的策略是在第0代内存分配失败时运行收集器。也就是说,每次你分配一小块内存(大块通常直接放置在“旧”代中)时,系统都会检查gen-0堆中是否有足够的可用空间,如果没有,则运行GC释放空间以使分配成功。然后将旧数据

  • 主要内容:JEP 189 : Shenandoah:一个低暂停时间的垃圾收集器(实验性),JEP 346 : 及时返回未使用的已提交内存,JEP 344:可中止的混合集合Java 12 为其垃圾收集算法引入了多项增强功能。 JEP 189 : Shenandoah:一个低暂停时间的垃圾收集器(实验性) 引入了一个实验性的低暂停时间垃圾收集器 Shenandoah 以减少 GC 暂停时间。它与运行 Java 线程并行工作。这有助于减少 GC 对堆大小的依赖性并使其保持一致。现在垃圾收集暂停时间对于

  • 主要内容:JEP 304 : 垃圾收集器接口,JEP 307 : G1 的并行 Full GCJEP 304 : 垃圾收集器接口 在 Java 10 之前,GC(垃圾收集器)实现组件分散在代码库中,不容易替换。在 Java 10 中,引入了 Garbage-Collector 接口,以便可以插入替代的 GC 实现。它还有助于将代码库与不同的垃圾收集实现隔离。此功能是 JEP 304 的一部分。 JEP 307 : G1 的并行 Full GC Java 9 引入了 G1(垃圾优先)垃圾收集

  • 问题内容: 因此,我正在远程容器上查看带有jmap的堆,并且我想对其进行强制垃圾收集。如何在不弹出jvisualvm或jconsole和朋友的情况下执行此操作? 我知道您不应该进行强制垃圾回收的实践-您应该弄清楚为什么堆很大/越来越大。 我还意识到System.GC()实际上并没有强制垃圾回收-它只是告诉GC您希望它发生。 话虽如此,有没有一种方法可以轻松地做到这一点?我缺少一些命令行应用程序?

  • 问题内容: 我有一段代码可以在内存中加载很大的图像。所以打电话似乎是合理的事情 在加载图像之前。据我所知,它毫无问题。 昨天,我决定使用一个名为FindBugs的非常有用的软件来扫描您的代码并报告可能导致错误或通常不建议使用的策略的问题。问题是我提到的这段代码得到了报告。描述是这样的: …强迫垃圾收集;除了基准测试代码外,都非常可疑 并继续阐述: 代码显式调用垃圾回收。除了基准测试中的特定用途外,