请问有人能解释一下吗?
我有一个应用程序,它有很大的内存占用(和内存波动)。没有内存泄漏,垃圾收集器(GC)通常很好地释放资源。
然而,偶尔会出现GC不及时的情况,导致内存不足异常。我想知道这是为什么?
我使用了非常好的REDGate分析工具,应用程序呈典型的“锯齿状”图案 - OOMs发生在锯齿的顶部。不幸的是,分析工具不能用于识别内存波动的来源。
是否可以设置一种内存“软限制”,在该限制下强制进行GC? 目前,只有当内存达到其绝对限制时才执行GC,导致OOM。
请问有人能解释一下吗?
我有一个应用程序,它有很大的内存占用(和内存波动)。没有内存泄漏,垃圾收集器(GC)通常很好地释放资源。
然而,偶尔会出现GC不及时的情况,导致内存不足异常。我想知道这是为什么?
我使用了非常好的REDGate分析工具,应用程序呈典型的“锯齿状”图案 - OOMs发生在锯齿的顶部。不幸的是,分析工具不能用于识别内存波动的来源。
是否可以设置一种内存“软限制”,在该限制下强制进行GC? 目前,只有当内存达到其绝对限制时才执行GC,导致OOM。
垃圾回收“没有及时发生”实际上是不可能的。它们发生在新内存分配将Gen-0推向一定限制之前。因此,它们总是在内存分配将内存推向其限制之前发生。这种情况在全球每天发生多次,如果有任何错误都不为人所知,我会感到惊讶。
您是否考虑过实际上分配的内存超过了可用内存?在大多数32位机器上,操作系统只允许您访问2GB。
还有其他一些可能性:
你可以使用GC.collect()来强制垃圾回收器执行其工作。但这并不是首选方法。
使用内存分析工具(如memprofiler)来检测泄漏。几乎所有的代码都会在某些时候出现泄漏。