通过-Xmx和-Xms参数指定最大堆内存是不好的做法?它可以修复系统挂起吗?

时间:2016-01-13 10:38:28

标签: java

我在JavaFX中开发了一个销售点应用程序。有些客户指出系统在一天中的特定时间开始挂起,而且经常使用它。

我做了一些测试,将我的应用程序的最大堆内存限制到一个非常小的数量(-Xmx30m),我确实注意到系统挂起,一些缓慢的操作,通常需要不到一秒钟,窗口打开只是一个白色没有内容等的背景......所以我认为这也可能是我客户的问题。

所以我认为在我收到这些错误的客户端上,默认情况下使用的最大内存可能会低于应有的值,并且通过添加参数来指定最大内存并通过-Xmx1512m和-Xms1512m启动内存也许这可以解决问题,但这样做是一个好习惯吗?我可以有不良副作用吗?

2 个答案:

答案 0 :(得分:4)

如果您的应用程序需要 1.5gb的内存,那么这就是解决问题的方法。但如果问题是由程序中的“内存泄漏”引起的,更改设置可能只会隐藏问题的根源。

您应该尝试分析应用程序的内存使用情况,以验证:

  • 缓慢是由于内存使用和
  • 内存使用情况是“正常”,即不是由于编程设计问题,通过识别正在使用内存的内容。

例如,我有一个内存饥饿的JavaFX应用程序,并意识到JavaFX属性对象使用了大量内存,因为JavaFX对象(表等)保留了对这些属性的引用而无法收集垃圾。我改变了设计以重用现有属性而不是创建新属性,并解决了内存问题。

答案 1 :(得分:1)

堆大小应根据您系统所需的内存来确定。 -Xmx1512m和-Xms1512m没有问题,你的机器有足够的内存,如4GB或更多。虽然为您调整应用程序提供了选项,但这并不是一种糟糕的做法。当GC呼叫时你可能面临的唯一副作用,它将比以前花费更长的时间,但我认为它不会被注意到。