我们有一个 Java 应用程序,它有点大并且需要太多内存,虽然我使用 Xm
标志设置了初始和最大内存,但有时它会卡住,我们会得到一个 OutOfMemoryError
1-2 分钟后(如果幸运的话)。
如果发生这种情况,我们需要重新启动应用程序。
我们通过仅运行命令行的 native c 应用程序运行该程序。
问题
- 如果我不设置
Xmx
标志会怎样? - 这是否意味着无限的内存使用量?
- 我如何知道应用程序是用 C 还是 Java 卡住的?
最佳答案
What if I don't set the Xmx flag?
然后 JVM 默认为应用程序提供一个(通常适中的)内存大小。
Does it mean unlimited memory usage?
没有。
How can I realize if the application is frozen in either C or Java?
修复内存泄漏1。
请注意,我回答的问题使用的是“发布”而不是“实现”。经过深思熟虑,我觉得答案应该是一样的。 “释放(内存)”或“意识到(存在问题)”都不会真正解决问题。最好是解决实际问题(内存泄漏)。
顺便说一句。我不认为问题出在 C 代码中,但一个简单的测试(从命令行启动应用程序)应该可以揭示任何一种方式。 原因 我认为问题是 Java 代码是 OutOfMemoryError
被(大概)功能齐全的 JVM 检测到。
如果 C 应用程序。已使用内存空间 JVM 为自身或应用保留的内存空间。我想错误会非常不同,可能是这样的:JVM internal error..
1。修复内存泄漏
其他贡献者提供了一系列好的建议,我将在这里重新讨论。
- @ChristianKullmann 通过强调 the importance of memory profiling 开始了它.
- @KlasLindbäck 在评论中链接了一些优秀的资源。
- Java Heap Dump .
“查找内存泄漏的一种方法是分析堆转储。有几种方法可以获取堆转储(不包括第 3 方工具)。” - Tips and tricks for analyzing Java virtual machine heap memory dumps .
“内存转储是 JVM 的一项非常有用的功能,可以在任何给定时间分析内存的内容,但使用它们需要一些经验,在这篇文章中,我将与您分享一些技巧和我多年来学到的技巧,希望它们对你也有用。”
- Java Heap Dump .
- @mKorbel 用一些典型的问题来解决它:
*“如果有close()
,请在代码中搜索:- JDBC,
- 文件输入输出,
- 套接字,
- 等 在 finally block 中,那么你会非常喜欢 re_engeneering"*
关于Java Swing 应用程序卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23382619/