2011-05-09 141 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