问题标签 [out-of-memory]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - JVM 在 gc 期间抛出 OutOfMemory,尽管还有足够的内存
我将我的 java 应用程序配置为使用 5G 内存。我突然出现了 OutOfMemory。我查看了 gc 日志,发现还有很多内存:young generation 占用了 4% 的分配空间,tenure generation 占用率为 5%,perm generation 为 43%。我很困惑为什么 JVM 在 gc 时会抛出 OutOfMemory。有谁知道为什么会这样?非常感谢您的帮助。
JVM内存和gc设置:
gc日志
我在 64 位 Linux 和 JRE 1.6.0_10 上:
debugging - ERROR_NOT_ENOUGH_MEMORY 故障排除
我们的应用程序在一个特定用户的计算机上失败了ERROR_NOT_ENOUGH_MEMORY
(“没有足够的存储空间来处理这个命令”)。
该错误显然是在我们正在使用的 Delphi VCL 框架的某个深处提出的,所以我不确定哪个 Windows API 函数负责。
内存有问题吗? 调用GlobalMemoryStatus
提供以下信息:
- dwTotalPhys - 1063150000 (~1 GB)
- dwAvailPhys - 26735000 (~27 MB)
- dwAvailPage - 1489000000 (~1.4 GB)
对我来说,当页面文件中有这么多可用空间时,Windows 会让可用物理内存变得如此之低,这对我来说似乎很奇怪,但我对 Windows 的虚拟内存管理知之甚少,无法知道这是否正常。是吗?
如果不是内存,那么会达到哪个资源限制?从我在网上阅读的内容来看,ERROR_NOT_ENOUGH_MEMORY
可能是应用程序达到了几个限制(GDI 对象、USER 对象、句柄等)中的任何一个,而不一定是内存。是否有 Windows 强制执行的限制的完整列表?有什么方法可以找出正在达到的限制吗?我尝试了谷歌,但我找不到任何系统的概述。
java - 单独的 Java 线程中的 OutOfMemoryError
考虑到我有一个主线程,它在一个新线程中执行一个新的 Runnable。现在,当新线程正在执行时,Java VM 内存不足并抛出 OutOfMemoryError。
发生什么了?目标线程是否停止?主线会继续吗?当新的 Thread 崩溃时,VM 会从中回收内存并让执行继续吗?
.net - OutOfMemory,但许多对象没有 gcroots
我们正在开发一个相当大的 Windows 窗体应用程序。在几个客户的计算机中,它经常因 OutOfMemory 异常而崩溃。在异常发生后(从 UnhandledException 处理程序调用 clrdump)获得应用程序的完整内存转储后,我使用“.NET Memory Profiler”和 windbg 对其进行了分析。
Memory Profiler 在活动对象实例中仅显示 130MB。有趣的是,对于许多对象类型来说,已经显示了非常多的无法访问的实例(例如 22000 个无法访问的 Byte[] 实例)。在本机内存统计中,所有数据堆中的数据总计为 127MB(没问题),但表示第 2 代堆中的 133MB 和大堆中的 640MB(不好!)。
使用 windbg 分析转储时,确认了上述统计信息:
应用程序在运行时确实使用了大量的短缓冲区,但不会泄漏它们。使用 !gcroot 测试许多 Byte[] 实例最终没有根。显然,如内存分析器所示,这些数组中的大多数都是不可访问的。
只是为了确保一切正常,!finalizequeue 显示没有对象正在等待完成
并且还检查本机终结器线程堆栈跟踪是否显示它没有被阻止。
目前我不知道如何诊断 GC 不收集数据的原因(我相信它会很乐意,因为进程内存不足..)
编辑:根据下面的输入,我阅读了更多关于大型对象堆碎片的信息,似乎情况可能如此。
我已经看到一些建议为这种数据分配更大的内存块(在我的情况下是各种字节 [])并自己管理该区域的内存,但这似乎是一个相当老套的解决方案,而不是我所期望的解决不那么特殊的桌面应用程序的问题。
碎片问题是由于 LOH 上的对象在存在期间没有重新定位这一事实(至少这是许多 Microsoft 的博客中所说的)造成的,这是可以理解的,但一旦达到一定的内存压力似乎是合乎逻辑的,例如面临 OOM 的威胁,应执行重定位。
在完全相信碎片是原因之前,唯一让我担心的是,LOH 上的这么多对象没有 gcroot 引用 - 这是因为即使对于 LOH 垃圾收集也只是部分执行?
我会很高兴为我指出任何有趣的解决方案,因为目前我所知道的唯一一个是一些预分配内存块的自定义管理。
欢迎任何想法。谢谢。
c++ - CComBSTR 内存分配
我有一个带有很长字符串的“const char* str”。我需要将它从 cpp 客户端传递给需要 BSTR 类型的 .Net COM 方法。目前我使用:
这有以下问题:
- 有时这条线会因内存不足消息而失败
- 当我将 bstr 传递给 COM 类时,它会占用大量内存(远远超过字符串大小),因此它可能会因内存不足而失败
问题:
- 我是否明智地转换为 CComBSTR?例如有没有办法使用堆或其他东西
- 改用 BSTR 会更好吗?
也欢迎任何其他建议...
java - java.lang.OutOfMemoryError:Java 堆空间
我在执行多线程程序时收到以下错误
上述错误发生在其中一个线程中。
据我所知,堆空间仅由实例变量占用。如果这是正确的,那么为什么在运行良好一段时间后会发生此错误,因为在创建对象时分配了实例变量的空间。
有没有办法增加堆空间?
我应该对我的程序进行哪些更改,以便它占用更少的堆空间?
c# - WCF Web 服务上的 System.OutOfMemoryException
在执行创建大量对象的导入过程时,我遇到了 System.OutOfMemoryException。
效果是 ASPNET_WP.EXE 炸到 1.4 GB 并且会抛出异常。
我已经尝试在该负责的函数中实现 IDisposable 并调用垃圾收集器 (GC.Collect()),但没有效果。
服务器是具有 4 GB RAM 的 QuadCore (C2Q)。即使有超过 1.4 GB 的可用 RAM,当 aspnet_wp.exe 达到 1.4 GB 时,总是会引发异常。
我可以做些什么来避免这些 OutOfMemory 问题?
确切的异常消息是:
c# - OutOfMemory 异常
OutofMemory
异常的可能原因是什么。内存分配应该由 GC 处理。
为正常的 .NET/C# 应用程序分配/可用的内存量
在我们的应用程序中,它出现在不同的地方,例如Stream.ReadToEnd()
和DataTable.WriteXml(Memory stream)
功能。
环境是.Net C#
java - Java内存泄漏
有没有人使用 Eclipse 内存管理器来检测 java 代码中的内存泄漏?任何人都可以推荐一个寻找有关使用内存管理器信息的好地方吗?我在网上阅读了一些东西,它表明我需要让程序运行直到它崩溃(发生内存不足错误),这将生成一个崩溃报告。然后使用内存管理器打开此报告以检查可能发生内存泄漏的位置。这是每个人都使用内存管理器的方式吗?
c++ - Linux乐观malloc:内存不足时new总是会抛出吗?
我一直在阅读 Linux 上的内存不足情况,手册页中的以下段落让我思考:
默认情况下,Linux 遵循乐观的内存分配策略。这意味着当 malloc() 返回非 NULL 时,不能保证内存确实可用。这是一个非常糟糕的错误。如果发现系统内存不足,一个或多个进程将被臭名昭著的 OOM 杀手杀死。[...]
考虑到 operator new 实现最终会在某个时候调用 malloc,是否有任何保证 new 会在 Linux 上实际抛出?如果没有,如何处理这种明显无法检测到的错误情况?