如果我有一个较小的ram机器和一个较大的ram机器。我在它们上运行相同的java代码。 jvm会在更大的ram机器上更懒惰地进行垃圾收集吗?
我想解决的问题是内存不足问题。人们报告他们在小型ram机器上有内存不足的问题。我想测试一下,但我现在唯一拥有的机器比他们的机器大得多。我想知道我是否在这个更大的ram机器上进行测试并跟踪内存使用情况,在小型ram机器上的内存使用量是否相同,或者它将使用更少的内存?
谢谢! 埃尔本
答案 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