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() 我们做错了什么?这是一个错误吗?
你检查返回值从保存,看看是否有验证问题?怎么样加入'.save(flush:true)'呢? – nickdos
是的,我用flush:true和failOnError:true测试了相同的结果。该值正在数据库中更新。 – kNo
什么是你的缓存层?你在使用任何休眠级别的缓存吗? – ikumen