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
}
}
そして、メモリリークを引き起こすコントローラーのアクションがあります:
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() にあります。バグですか?