Java Swing应用程序冻结了

时间:2014-04-30 07:57:18

标签: java c swing out-of-memory

我们有一个Java应用程序有点庞大,需要太多内存,虽然我使用Xm标志设置了初始和最大内存,但有时会冻结,我们在1之后得到OutOfMemoryError -2分钟(如果我们很幸运的话)。

如果发生这种情况,我们需要重启应用程序。

我们通过一个只运行命令行的本机c应用程序运行该程序。

问题

  1. 如果我没有设置Xmx标志怎么办?
  2. 这是否意味着无限的内存使用?
  3. 如何在C或Java中冻结应用程序?

2 个答案:

答案 0 :(得分:7)

  

如果我没有设置Xmx标志怎么办?

然后JVM默认为应用程序的(通常是适度的)内存大小。

  

这是否意味着无限的内存使用?

没有

  

如何在C或Java中冻结应用程序?

修复内存泄漏 1

请注意,我回答的问题使用'release'而不是'realize'。仔细考虑之后,我觉得答案应该保持完全相同。 “释放(内存)”或“实现(存在问题)”不会实际上修复问题。最好的方法是修复实际问题(内存泄漏)


暂且不说。我不认为问题出在C代码中,但是一个简单的测试(从命令行启动应用程序)应该显示出任何一种方式。 原因我认为问题是Java代码是(假设)全功能JVM检测到OutOfMemoryError

如果是C app。有使用的内存空间,JVM为自己或应用程序保留。我猜这个错误会有很大不同,可能是:JVM internal error..

1。修复内存泄漏

其他贡献者提供了一系列好的建议,我将在此重新审视。

  • @ChristianKullmann强调the importance of memory profiling
  • 开始了
  • @KlasLindbäck随后在评论中提供了一些优秀的资源。
    • Java Heap Dump
      “找到内存泄漏的一种方法是分析堆转储。有几种方法可以获得堆转储(不包括第三方工具)。”
    • Tips and tricks for analyzing Java virtual machine heap memory dumps
      “内存转储是JVM在任何给定时间分析内存内容的一个非常有用的功能,但它们的使用需要一些经验,并且在这篇文章中我将与您分享我多年来学到的一些技巧和窍门,希望它们对您也有用。“
  • @mKorbel将其解决了一些典型问题:
    *“如果close()全部存在,请在代码中搜索:
    • JDBC,
    • FileIO,
    • 插座,
    • 等 在最后的阻止中,你会爱得太多“*

答案 1 :(得分:2)

使用C本机代码运行应用程序并不意味着您可以通过JVM参数控制整个内存使用情况。 尝试为您的系统运行内存监控(例如Linux上的TOP,使用shift + m进行内存使用排序)或者更好地为应用程序配置内存。

尝试在运行应用程序后获取内存转储(有一些分析工具,大多数IDE也提供了一些功能)来检查java对象。