查找Java应用程序的内存要求

时间:2016-02-22 13:35:32

标签: java jvm heap-memory

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

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

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

2 个答案:

答案 0 :(得分:1)

可能的方法:

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

JVM memory

要了解您的内存消耗情况,建议您使用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注意事项:

另外:您可能要考虑使用垃圾优先(G1)GC ,这将是Java 9中的默认GC。In this question我表明G1 GC也重新如果它认为它是实用的,则会缩小堆。如果您的应用程序具有内存密集型和非内存密集型部件,这可能很有用。这样,堆可能会在非内存密集型部分中缩小,这很可能在ParallelOldGC中不会发生。

答案 1 :(得分:0)

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

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