我们有一个桌面Java Swing应用程序。为了运送它,我们需要指定部署此应用程序的最低内存要求。在JVM参数中,我们指定2GB作为最大堆大小。
基于Windows的机器是否有可以量化要求的工具?
另外,作为后续问题,我想知道:如果我们没有在Java 7中指定最大堆大小,那么在抛出OutOfMemoryError之前,JVM是否仍会自动调整堆大小?
答案 0 :(得分: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
并检查为MaxHeapSize
和UseParallelOldGC
设置的值。
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。
确定所需内存消耗的最佳方法是测试具有不同内存大小的应用程序。最小内存是您愿意支持的最低内存大小。只有你知道你支持的是什么。