2011-05-09 137 views
0

为什么Groovy(1.8.0版)在64位模式下使用更多的内存?据我所知,是的,64位使用更大的指针,有时可能会占用两倍的内存,但是与64位模式相比,Groovy可以占用多达2000%的内存,而32位则是多了。Groovy 64位内存消耗

只是一个简单的测试,我下面可能会解释一些东西。这个测试(下面的代码)并不是作为速度基准测试,而仅仅是为了在不同的JVM设置中得到一个Groovy中内存使用的例子。

运行下面的代码时,编译并运行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}" 
    } 
} 
+1

你如何测量程序使用的内存量? – 2011-05-09 10:55:19

+0

在Windows 7中同时使用Java VisualVM和任务管理器 – pieterk 2011-05-09 11:31:21

+2

两者都不会告诉你是否实际使用了所有内存,或者垃圾收集器是否只是懒惰。如果您使用-Xmx 64m运行程序,该程序实际上是否会产生OutOfMemoryError? – 2011-05-09 11:46:54

回答

0

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