2013-07-30 103 views
3

我們正在用mongodb開發一個Grails(2.2.1)應用程序,並且在壓力測試期間,我們發現有一個域類可以在垃圾收集完成之前保持大量實例激活。Grails內存泄露

我們使用jmeter對服務器和jvisualvm進行了超過5000個查詢來跟蹤內存。

在jvisualvm中,我們可以看到其他領域類如何在實例中增長,但是當GC完成時,這些實例被清除,但是這個領域類總是保留實例。

我們使用了app-info插件,並注意到會話中沒有保留任何信息。

有域類的代碼:

class User { 
    ObjectId id 
    String nickName 
    String email 
    String image 
    String password 
    String passwordBis 
    String token 

    static transients = ["passwordBis"] 

    static constraints = { 
     image nullable:true, blank:true 
     nickName nullable:false,blank:false,maxSize:100 
     email nullable:false,blank:false,email:true/*,unique:"company"*/ 
     password nullable:true, blank:true 
    } 
} 

並且有withch使存儲器泄漏控制器的動作:

def doLogin(String privateKey, String id){ 
    try { 
     siteService.findPrivateSite(privateKey) 
     User user = User.get(id) 
     if (!user){ 
      render text:"User does not exist for the given id",status:404 
     } else { 
      String token = UUID.randomUUID().toString() 
      user.token = token 
      user.save() 
      render token 
     } 
    } catch (InvalidRequestException e){ 
     render text:e.getMessage(),status:404 
    } 
} 

內存泄漏是在user.save() 我們做錯了什麼?這是一個錯誤嗎?

+0

你檢查返回值從保存,看看是否有驗證問題?怎麼樣加入'.save(flush:true)'呢? – nickdos

+0

是的,我用flush:true和failOnError:true測試了相同的結果。該值正在數據庫中更新。 – kNo

+0

什麼是你的緩存層?你在使用任何休眠級別的緩存嗎? – ikumen

回答