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

查找Java应用程序的内存需求,java,jvm,heap-memory,Java,Jvm,Heap Memory,我们有一个桌面Java Swing应用程序。为了发布它,我们需要指定部署此应用程序的最低内存要求。在JVM参数中,我们指定2GB作为最大堆大小 是否有任何基于Windows的机器工具可以量化需求 另外,作为后续问题,我想知道:如果我们没有在Java 7中指定最大堆大小,JVM是否仍会在抛出OutOfMemoryError之前动态地自动调整堆大小?可能的方法: 如果您指定自己的产品在最大.2GB堆中工作,您还必须考虑在中分配的内存的其他部分。 要了解内存消耗情况,我建议您使用测试应用程序。这包括

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

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


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

可能的方法:

如果您指定自己的产品在最大.2GB堆中工作,您还必须考虑在

中分配的内存的其他部分。

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

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

除此之外

因此,您的最终最低要求应该是
minimum=MaximumHeap(2GB)+StressTestNonHeap(?)+windowsmimum(2GB)+SomeSecurityThreshold(~1GB)

进一步的方法:

您还可以使用
VisualVM
检查内存消耗

另一种可能是使用
JavaHotSpot本机内存跟踪(NMT)
,我为此发布了文章

任何通知您非堆内存使用情况的信息都是适用的

最大堆限制:

关于你的问题

另一方面,我只是想知道,如果我们没有用Java7指定最大堆限制,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。我表明,如果G1 GC认为堆是实用的,它也会重新收缩堆。如果应用程序具有内存密集型和非内存密集型部分,这可能会很有用。这样,堆可能会在非内存密集型部分收缩,这在ParallelOldGC中很可能不会发生。

当运行JVM时,服务器JVM的最大堆大小为它使用的主内存的1/4,最高可达32 GB。如果使用32位windows客户端虚拟机,它将使用64MB或128MB


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

也许eclipse内存分析器可以帮助您??我必须承认,它不是我自己的,而是来自JVM维基百科页面上的链接。但是我非常喜欢它,因为它在一个简短的概述中很好地解释了JVM的内存。感谢您提供的详细信息,我将使用这些信息和本文提到的公式得出一个数字。@user3526364:很好,我可以帮上忙。:)既然这些信息对你很有用,你最好把它投赞成票/接受它作为答案。谢谢:)