2013-07-30 104 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

回答