为什么Groovy(版本1.8.0)在64位模式下使用了更多的内存?据我所知,64位使用较大的指针并且有时可能占用两倍的内存,但与32位相比,Groovy在64位模式下可以占用多达2000%的内存。
我在下面进行的简单测试可能会解释一些问题。此测试(下面的代码)不是作为速度基准测试,而只是为了获得Groovy中不同JVM设置的内存使用示例。
运行以下代码时,编译并运行java.exe而不是groovy.exe,它使用17MB内存。在64位JVM上运行完全相同的代码时,它会消耗430MB的内存,即使使用CompressedOops,它也会使用超过300MB的内存。
只是与Java快速比较,但我仍然希望Groovy使用比本机Java更多的内存。刚修改为纯Java的相同代码在64位模式下占用8MB内存,在32位模式下占用4MB。
Groovy中有错误吗?或者我错过了什么?
class MemoryTest {
static main(args) {
double result = 0.00
long startTime = System.currentTimeMillis()
long endTime = System.currentTimeMillis()
for (warmup in 1..5) {
result = 0.00
startTime = System.currentTimeMillis()
for (i in 1..1000000) {
result += (34.673*i)/(Math.sqrt(31.92**42.42))
}
endTime = System.currentTimeMillis()
}
println "Result: ${result}"
println "Time taken: ${(endTime-startTime)/1000}"
}
}
答案 0 :(得分:0)
在执行大量GC工作之前,64位JVM看起来只是倾向于使用允许的最大堆。这可能是因为直到最近大多数64位系统都是服务器,这种行为更适合服务器系统。默认的最大堆大小也是larger on 64 bit systems。