【问题标题】:Groovy 64bit Memory ConsumptionGroovy 64 位内存消耗
【发布时间】: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


【解决方案1】:

看起来 64 位 JVM 只是倾向于在执行大量 GC 工作之前使用最大允许堆。这可能是因为直到最近大多数 64 位系统都是服务器,而这种行为更适合服务器系统。默认的最大堆大小也是larger on 64 bit systems

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 2014-09-24
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2011-10-03
    • 2012-11-24
    • 2013-10-08
    相关资源
    最近更新 更多