在Java中处理内存不足的最佳方式是什么?【JAVA教程】

!
也想出现在这里? 联系我们
信息

在Java中处理内存不足的最佳方式是什么?,第1张

概述在Java中处理内存不足的最佳方式是什么?

我们有一个应用程序,它产生新的JVM并代表我们的用户执行代码。 有时那些内存不足,在这种情况下,行为方式非常不同。 有时他们抛出一个OutOfMemoryError,有时会冻结。 我可以通过一个非常轻量级的后台线程来检测后者,在内存不足时发送心跳信号。 在这种情况下,我们杀死了JVM,但是我们永远无法确定没有收到心跳的真正原因是什么。 (这也可能是networking问题或分段错误。)

在JVM中可靠地检测到内存不足的最佳方法是什么?

从理论上讲,-XX:OnOutOfMemoryError选项看上去很有希望,但是由于这个BUG,它是无效的: https ://BUGs.openjdk.java.net/browse/JDK-8027434

捕捉OutOfMemoryError实际上不是一个很好的select,因为众所周知的原因(例如,你永远不知道它发生在哪里),虽然它在许多情况下工作。

当OOM杀手杀死进程时返回代码

充满10M +日志文件的文件夹,我无法删除它们

JVM OutOfMemory – 为Chunk :: new请求8589934608字节。 交换空间不足?

如何解决Matlab中的内存不足错误?

处理,如果没有足够的内存可用来启动这个线程c#

剩下的情况是那些JVM冻结并且不会抛出OutOfMemoryError的情况。 我仍然确定内存是这个问题的原因。

有任何替代scheme或解决方法? 垃圾收集设置使JVM自行终止而不是冻结?

编辑:我完全控制分叉和分叉的JVM以及在那些内部执行的代码,两者都在linux上运行,如果有帮助,可以使用特定于 *** 作系统的实用程序。

Python多处理 – deBUGgingOSError:无法分配内存

java的OutOfMemory问题 – 堆转储800 MB比configuration的最大堆小

如何检测内存不足段错误?

如何在Matlab 2009b中增加数组块并解决内存不足错误?

如何解决这个内存不足的问题在Matlab中的一个小variables?

唯一真正的选择是(不幸地)尽快终止虚拟机。

既然你可能不能改变你的代码来捕捉错误和回应。 如果你不信任OnOutOfMemoryError(我不知道为什么它不应该使用由Java 8使用的vfork,而且它可以在windows上运行),那么至少可以触发一个heapdump并监视这些文件的外部:

java …. -XX:+HeapDumpOnOutOfMemoryError \”-XX:OnOutOfMemeoryError=kill %p\”

经过相当长时间的实验之后,这是对我们有用的解决方案:

在产生的JVM中,捕获一个OutOfMemoryError并立即退出,用退出代码向控制器JVM发出内存不足的情况。

在产生的JVM中,定期检查当前Runtime所消耗的内存量。 当使用的内存量接近关键时,创建一个标志文件,将内存不足情况通知给控制器JVM。 如果我们从这个条件恢复并正常退出,在我们退出之前删除该文件。

控制JVM加入分叉的JVM后,检查步骤(1)中生成的退出代码和步骤(2)中生成的标志文件。 除此之外,它还检查文件hs_err_pIDXXX.log是否存在并包含“Out of Memory Error”行。 (这个文件是由java生成的,如果它崩溃的话)

只有在执行所有这些检查之后,我们才能够处理所有分叉的JVM耗尽内存的情况。 我们相信从那时起,我们并没有错过发生这种情况的情况。

没有使用java标志-XX:OnOutOfMemoryError ,因为fork问题,并且没有使用-XX:+HeapDumpOnOutOfMemoryError ,因为堆转储比我们需要的多。

这个解决方案当然不是最优雅的代码,但为我们做了这个工作。

如果您对应用程序和配置都有控制权,最好的解决方案是找到引发OutOfMemoryError的根本原因并解决此问题,而不是通过捕获错误或仅重新启动JVM来隐藏症状。

从你所描述的看,无论是运行在JVM上的应用程序泄漏内存,只是运行使用资源不足(内存在你的情况下),或偶尔处理需要异常大堆的事务。 这些案例的解决方案将会不同:

在内存泄漏的情况下,找到潜在的原因,并让工程师修复它。 这方面的工具包括堆转储分析仪,剖析仪或泄漏检测器

在资源不足的情况下,您需要监视应用程序内存消耗,例如通过垃圾收集日志,并根据您所面对的情况调整不同内存池的大小。

在用户交易过程中浪涌分配的情况下,您需要追踪引起浪涌的代码并让工程师修复它 – 通过禁用某些用户输入或以较小批量加载和处理数据。 无论是线程转储还是进程堆转储都可以引导您进入解决方案。

总结

以上是内存溢出为你收集整理的在Java中处理内存不足的最佳方式是什么?全部内容,希望文章能够帮你解决在Java中处理内存不足的最佳方式是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

© 版权声明
THE END
喜欢就支持一下吧
点赞151 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容