我们正在使用mongodb开发Grails(2.2.1)应用程序,并且在压力测试期间,我们发现有一个域类,即使在垃圾收集完成之前也会使大量实例保持活动状态。
我们使用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()中 我们做错了吗?这是一个错误吗?