【问题标题】:Finding Memory Requirements of Java Application查找 Java 应用程序的内存需求
【发布时间】:2016-06-03 23:08:56
【问题描述】:

我们有一个桌面 Java Swing 应用程序。为了发布它,我们需要指定部署此应用程序的最低内存要求。在 JVM 参数中,我们指定 2GB 作为最大堆大小。

是否有任何基于 Windows 的机器可以量化需求的工具?

另外,作为后续问题,我想知道:如果我们没有在 Java 7 中指定最大堆大小,JVM 是否仍然会在抛出 OutOfMemoryError 之前自动调整堆大小?

【问题讨论】:

  • 也许 eclipse 内存分析器能帮上忙??

标签: java jvm heap-memory


【解决方案1】:

可能的方法:

如果您指定自己的产品最多可以使用。 2GB的堆,还得考虑内存的其他部分,分配在Java virtual machine内:

要了解您的内存消耗情况,我建议您使用MemoryMXBean 测试您的应用程序。这包括getHeapMemoryUsage()getNonHeapMemoryUsage()等方法。

然后对您的应用程序进行压力测试并定期检查这些属性。通过这种方式,您应该可以了解您的应用程序消耗了多少内存。

除此之外,Windows specifies 2GB as minimum RAM for Windows 10

所以,您的最终最低要求应该是Minimum = MaximumHeap (2GB) + StressTestNonHeap (?) + WindowsMinimum (2GB) + SomeSecurityThreshold (~1GB)

进一步的方法:

您也可以使用VisualVM 来检查您的内存消耗。

另一种可能性是使用Java HotSpot Native Memory Tracking (NMT),我为此发布了an example on Stack Overflow

任何能告知您非堆内存使用情况的信息都适用。

最大堆限制:

关于你的问题

另外,我想知道如果我们不指定 Java 7 的最大堆限制,JVM 是否会在内存不足之前自动分配堆以进行调整。

如果您没有指定 最大堆大小,JVM 将根据使用的 GC(在 Java 7 中应该是 UseParallelOldGC)和您的系统自动设置它。要对此进行测试,请运行 java -XX:+PrintVMOptions -XX:+AggressiveOpts -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsFinal -version 并检查为 MaxHeapSizeUseParallelOldGC 设置的值。

GC注意事项:

另外:您可能想考虑使用 garbage first (G1) GC,这将是 Java 9 中的默认 GC。In this question 我表明 G1 GC 也重新缩小了heap 如果它认为它是实用的。如果您的应用程序具有内存密集型和非内存密集型部分,这可能很有用。这样,堆可能会在非内存密集型部分收缩,而 ParallelOldGC 很可能不会发生这种情况。

【讨论】:

  • 我不得不承认它不是我自己的,而是来自WikiMedia,链接在 JVM 的维基百科页面上。但我真的很喜欢它,因为它在简短的概述中很好地解释了 JVM 内存。
  • 感谢您提供详细信息,我将使用此信息和此处提到的公式得出一个数字。
  • @user3526364:太好了,我能帮上忙。 :) 由于此信息对您有用,因此您最好支持它/接受它作为答案。谢谢:)
【解决方案2】:

当您在没有服务器 JVM 的最大堆大小的情况下运行 JVM 时,它使用 1/4 的主内存,最多 32 GB。如果您使用 32 位 windows 客户端 VM,它使用 64MB 或 128MB。

确定所需内存消耗的最佳方法是使用不同内存大小测试您的应用程序。最小内存是您愿意支持的最低内存大小。只有您自己知道自己喜欢支持什么。

【讨论】:

    猜你喜欢
    • 2019-08-21
    • 2018-11-15
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多