繁体   English   中英

Java Swing应用程序冻结

[英]Java Swing application freezes out

我们有一个Java应用程序,它很大,需要太多内存,尽管我使用Xm标志设置了初始和最大内存,但有时会冻结,并且在1-2分钟后会出现OutOfMemoryError (如果幸运的话)。

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

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

问题

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

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

然后,JVM默认将应​​用程序的内存大小设置为(通常为适度)。

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

没有。

我如何知道应用程序是用C还是Java冻结的?

修复内存泄漏1

请注意,我回答的问题使用的是“发布”,而不是“实现”。 经过仔细考虑,我认为答案应该完全相同。 “释放(内存)”或“意识到(存在问题)”都无法真正解决问题。 解决实际问题(内存泄漏)的任何一种方法都更好。


作为旁白。 我不认为问题出在C代码中,但是一个简单的测试(从命令行启动应用程序)应该可以揭示这两种方法。 我认为这个问题是Java代码的原因OutOfMemoryError是由(大概)全功能的JVM检测。

如果是C app。 使用了JVM为其本身或应用程序保留的内存空间 我猜想错误可能会大不相同,可能是由于以下原因: JVM internal error..

1.修复内存泄漏

其他贡献者还提供了一系列好的建议,我将在这里重新讨论。

  • @ChristianKullmann通过强调内存分析的重要性开始了它。
  • @KlasLindbäck随后在评论中提供了一些出色的资源。
    • Java堆转储
      “发现内存泄漏的一种方法是分析堆转储。有多种方法来获得堆转储(不包括第三方工具)。”
    • 分析Java虚拟机堆内存转储的提示和技巧
      “内存转储是JVM在任何给定时间分析内存内容的非常有用的功能,但是内存转储的使用需要一定的经验,在这篇文章中,我将与您分享一些我从中学到的技巧和窍门。年,所以希望它们对您也有用。”
  • @mKorbel解决了一些典型的问题:
    *“如果有close()全部,则在代码中搜索:
    • JDBC,
    • FileIO,
    • 插座,
    • 等等,在最后的方块中,那么您可能会想过多地进行工程改造” *

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM