当在具有更大ram的机器上运行时,java将使用更多内存

时间:2014-01-27 07:39:38

标签: java memory memory-management garbage-collection out-of-memory

如果我有一个较小的ram机器和一个较大的ram机器。我在它们上运行相同的java代码。 jvm会在更大的ram机器上更懒惰地进行垃圾收集吗?

我想解决的问题是内存不足问题。人们报告他们在小型ram机器上有内存不足的问题。我想测试一下,但我现在唯一拥有的机器比他们的机器大得多。我想知道我是否在这个更大的ram机器上进行测试并跟踪内存使用情况,在小型ram机器上的内存使用量是否相同,或者它将使用更少的内存?

谢谢! 埃尔本

3 个答案:

答案 0 :(得分:6)

您需要查看JVM内存参数。实际上,您可以根据需要为JVM设置尽可能多的内存:

-Xmx2048m -> this param to set the max memory that the JVM can allocate
-Xms1024m -> the init memory that JVM will allocate on the start up
-XX:MaxPermSize=512M -> this for the max Permanent Generation memory

所以在你的情况下,你可以设置与另一台机器一样多的内存。所以你的机器不会占用比Xmx值更多的RAM

您可能也想检查这些参数。

-XX:MaxNewSize=  -> this need to be 40% from your Xmx value
-XX:NewSize=614m -> this need to be 40% from your Xmx value

你也可以告诉你JVM使用什么类型的GC:

-XX:+UseConcMarkSweepGC

因此,如果您在两台计算机中设置此参数,您将获得相同的结果和最可能的GC活动。

答案 1 :(得分:3)

是的,它会。这取决于默认的最大堆大小。您可以使用以下命令检查当前的最大堆大小:

java -XshowSettings:vm

在我妻子的笔记本电脑上(Windows 8.1,4 GB RAM,32位Java运行时)它是247.5 MB,而在我的笔记本电脑上(Windows 7,8 GB RAM,64位Java运行时)它是903.12 MB。

这由Java决定(参见https://stackoverflow.com/a/4667635/3236102,虽然这里显示的值适用于服务器级机器,但它们可能与普通机器不同)。

如果您希望您的虚拟机模拟低RAM机器,只需使用-Xmx标志将您的机器限制为更少的RAM(例如-Xmx128m用于128 MB RAM分配)。

最好的办法可能是要求遇到Out Of Memory-issues的用户检查其最大堆大小(使用上面的命令)并将机器设置为相同的最大堆大小,因此您具有相同的条件他们有。

答案 2 :(得分:2)

可以使用更大的RAM重现该问题。

首先,您需要从报告问题的人那里获取堆大小配置。 使用相同的堆大小来重现该问题。

使用以下jvm参数进行堆设置。

-Xmx512m   Max heap memory that is used to store objects
-XX:MaxPermSize=64m   Max perm gen size. This space is used to store meta info like loaded classes etc