3

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() にあります。バグですか?

4

0 に答える 0