什么是 OutOfMemoryError 以及如何调试和修复它

2024-01-07

我的 Java 程序抛出了一个OutOfMemoryError。我该如何调试并解决这个问题?


许多 Java 新手都在努力应对OutOfMemoryError。这是创建一个规范问题的尝试,该问题将回答有关某个问题的最常见问题OutOfMemoryError。我正在创建这个新问题,而不是改编之前关于某个问题的众多问题之一OutOfMemoryError因为这些问题及其答案与特别的一个人遇到的问题。

这个问题不同于关于调试异常的一般建议 https://stackoverflow.com/questions/3988788/what-is-a-stack-trace-and-how-can-i-use-it-to-debug-my-application-errors因为问题的原因并不总是在调用堆栈上,并且需要具体的建议。


An OutOfMemoryError是 Java 虚拟机 (JVM) 抛出的异常,因为它需要为(新)对象分配内存,但可供该对象使用的内存不足。 JVM 将首先尝试释放死对象使用的内存,方法是运行垃圾收集器 https://stackoverflow.com/questions/12298725/is-the-garbage-collector-guaranteed-to-run-before-out-of-memory-error.

As an OutOfMemoryError is a VirtualMachineError,JVM 被允许把它扔到any time https://stackoverflow.com/questions/8913902/when-exactly-is-the-jvm-throwing-an-outofmemoryerror,虽然它必须首先尝试通过垃圾回收来释放内存 https://stackoverflow.com/questions/12298725/is-the-garbage-collector-guaranteed-to-run-before-out-of-memory-error.

然而,在实践中,它很可能会被抛出new尝试创建无法为其分配内存的对象的语句。因此,您应该首先检查与异常相关的堆栈跟踪,以获取有关问题原因的线索,就像对待任何其他例外一样 https://stackoverflow.com/questions/3988788/what-is-a-stack-trace-and-how-can-i-use-it-to-debug-my-application-errors.

  • 如果尝试分配数组时抛出异常(例如int[] values = new int[n]),原因可能是您正在尝试创建一个过大的数组(n太大)。您在计算所需数组的大小时犯了错误吗?
  • 如果尝试在其他人编写的容器类的方法中分配数组而引发异常,则原因可能是您的代码要求容器存储过多的内容。方法如ArrayList.reserve(int) and HashMap(int)必须分配存储空间以供将来使用。您是否在计算所需容器的尺寸时犯了错误?
  • 如果异常是从循环内部引发的,则原因可能是代码循环次数过多。你的循环终止条件正确吗?如果它是一个for循环,你要求它循环正确的次数吗?

如果堆栈跟踪没有提供足够的线索,您可以尝试使用堆分析器。这是一个监视程序,使您能够在程序运行时检查对象使用的内存,或检查堆转储程序退出时写入。它可以提供有关内存中存储的对象的大小、数量和类别的信息。

JVM 有一个有限的内存 https://stackoverflow.com/questions/3358328/why-does-the-sun-jvm-have-a-fixed-upper-limit-for-memory-usage-xmx提供给它。您可能会得出这样的结论:您的程序运行正常,但只是需要比可用内存更多的内存来运行。如果你没有明确告诉 JVM 要使用多少内存,大多数实现都会选择一个合理的默认值 https://stackoverflow.com/questions/4667483/how-is-the-default-java-heap-size-determined数量取决于您的计算机拥有的 RAM 数量,但该数量对于您的程序来说可能太小。 JVM 的命令行选项可以控制可用内存量。对于大多数 JVM 实现,这些选项中最重要的是-Xmx https://stackoverflow.com/questions/1030256/java-app-that-uses-a-lot-of-memory-use-xmx and -Xms.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是 OutOfMemoryError 以及如何调试和修复它 的相关文章

随机推荐

  • Rails 模型回调(创建/更新后)attribute_was 不起作用

    我正在将 Rails 5 1 应用程序迁移到 Rails 5 2 1 在我的模型中 我在创建或更新模型后使用回调来创建活动日志 很遗憾todo name and todo name was始终相同 当前值 这适用于每个属性和每个模型 还ch
  • 如何为 JMenu 子菜单设置加速器?

    我有一个用户请求将加速器添加到子菜单 JMenu 这将允许用户按下快捷键并使相应的子菜单 折叠 显示其包含的菜单项 我不记得每个人都见过这样的东西 无论是在 Java 还是任何其他语言中 我们的应用程序是使用 Swing 用 Ja va 编
  • 了解 TypeError:获得关键字参数的多个值

    我尝试了不同的方法来使用 args 调用该方法 下面是我的代码片段 def total name args if args print s has total money of Rs d name sum args else print s
  • 如何使用 Linq 的聚合函数 C# 添加到列表

    我有一个类型的对象集合 我想将其转换为不同类型 这可以使用 foreach 轻松完成 但我想弄清楚如何使用 Linq 的聚合函数来完成此操作 问题是所有聚合示例都使用行字符串或 int 类型 它们支持 运算符 我希望累加器类型是一个列表 它
  • 如何从 Java 向 sudo 提供 root 密码?

    我正在尝试编写一个小型 Java 应用程序来覆盖我的 etc resolv conf文件 我使用的是 Ubuntu 12 04 为此 我需要提供我的root密码 myUser myMachine sudo vim etc resolv co
  • Android:如何测量ListView的总高度[重复]

    这个问题在这里已经有答案了 我需要测量 ListView 的总高度 但似乎我不断得到错误的值 我正在使用这段代码 public static void setListViewHeightBasedOnChildren ListView li
  • 如何配置 karma-runner(也称为睾丸)与closure-library 一起使用

    我正在尝试将 karma runner 与 mocha 测试框架结合使用来测试使用closure library 和 angularjs 构建的应用程序 我总是得到namespace Application is not defined 提
  • 如何将动画视图捕获为视频

    我正在使用反应本机图像来显示网络上某些网址的一些图像 现在 根据某些条件 我以不同的时间间隔更新图像网址 我想将整个过渡捕获到视频文件中 但是 我找不到合适的 android API 用于本机端 或react native 包来实现这一点
  • 如何测量函数运行的时间?

    我想查看一个函数运行了多长时间 所以我在表单上添加了一个计时器对象 并得到了以下代码 private int counter 0 Inside button click I have timer new Timer timer Tick n
  • AWS S3 ACL 公共读写:安全问题

    我想要一些关于 AWS S3 ACL 公共读写的解释 来自docs http docs aws amazon com AmazonS3 latest dev acl overview html 所有者获得 FULL CONTROL AllU
  • R 图 - 具有颜色渐变的正态曲线

    How can I make curves with a color gradient in R Take a look at this flame 它应该看起来像那样 我尝试制作一条法线曲线 然后制作另一条法线曲线 但从技术上讲 你无法用
  • 等待文件上传

    我遇到了困难 我正在尝试使用 WatiN 上传文件 我可以加载上传框 但它很快就消失了 目前我的代码的最后一行是 ie FileUpload Find ById profile file Click 它加载对话框以选择图片但消失 是否可以自
  • Fiware-Orion:订阅所有实体

    在 Orion 1 4 0 中我使用以下 JSON 来订阅对于所有实体 description Update average rating subject entities idPattern type condition attrs no
  • 在 notepad.exe 中挂钩 CreateFile 不会捕获 API 调用

    我的最终目标是通过在 kernel32 dll 中挂钩文件 api 来跟踪 explorer exe 完成的文件操作 但是我尚未实现该操作 explorer exe 没有调用 API 或者我这边出了问题 为了弄清楚发生了什么 我设置了一个目
  • 有趣的错误?在操作系统中预装了 Ruby (1.8.7)

    2 2 gt 4 2 63 gt 9223372036854775808 2 63 2 63 gt 18446744073709551616 64以及它返回后的一切0 2 64 gt 0 2 65 gt 0 2 100 gt 0 2 100
  • 删除 List 中的替代元素

    删除替换 奇数索引或偶数索引 元素的最有效方法是什么List
  • 如何在 openssl 1.0.1 中加载 CRL 路径?

    自从我更新到 openssl 1 0 1 以来 我的应用程序中的吊销检查功能已损坏 在 apps verfiy c 的帮助下 我发现 CRL 文件的加载发生了变化 到目前为止我已经完成了以下操作 X509 LOOKUP lookup con
  • Autoconf——包括静态库(新手)

    我正在尝试将我的应用程序从手动构建迁移到 autoconf 到目前为止 它运行得很好 但我有一个静态库 我不知道如何集成 该库不会位于通常的库位置 二进制文件 a 文件 和头文件 h 文件 的位置将作为配置参数给出 值得注意的是 即使我将
  • jquery如何克隆引导行

    我正在尝试克隆引导行 但每次我得到多行 1 2 4 8 等 clone click function cloned row first clone insertAfter cloned row HTML div class cloned r
  • 什么是 OutOfMemoryError 以及如何调试和修复它

    我的 Java 程序抛出了一个OutOfMemoryError 我该如何调试并解决这个问题 许多 Java 新手都在努力应对OutOfMemoryError 这是创建一个规范问题的尝试 该问题将回答有关某个问题的最常见问题OutOfMemo