我们正在使用 mongodb 开发 Grails (2.2.1) 应用程序,在压力测试期间,我们发现有一个域类即使在垃圾收集完成之前也可以保持大量实例处于活动状态。
我们使用 jmeter 对服务器进行了 5000 多次查询,并使用 jvisualvm 来跟踪内存。
在 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() 我们做错了吗?它是一个错误吗?