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