【发布时间】:2011-05-09 20:09:41
【问题描述】:
为什么 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}"
}
}
【问题讨论】:
-
你如何测量程序使用的内存量?
-
在 Windows 7 中同时使用 Java VisualVM 和任务管理器
-
两者都不会告诉您是否所有内存都已实际使用,或者垃圾收集器是否只是懒惰。如果您使用 -Xmx 64m 运行程序,程序是否真的会产生 OutOfMemoryError?
-
似乎 GC 在我的机器上很懒惰。谢谢
标签: groovy jvm 32bit-64bit