autocreateDatastoreTxns の設定によっては、メモリ リークが発生し、以下の各クラスの 1 つのインスタンスがクエリ (読み取り) ごとに作成されます。つまり、100 個のクエリは、以下の各クラスの 100 個のインスタンスを作成します (クエリごとに 2 つのインスタンスを取得する DatastoreServiceConfig を除く)。
これは、開発環境で Java VisualVM プロファイラーを使用して見つけました。私がこれを行っている理由は、本番環境では、インスタンスのヒープ サイズが増加し続け (通常、1 万から 2 万のリクエスト後に大きくなりすぎ)、最終的に応答が遅くなり、インスタンスの再起動が発生するためです。これが原因かはわかりませんが、ここまで特定できたリークは初めてです。
// datanucleus.appengine.autoCreateDatastoreTxns=false でリークします
org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager
org.datanucleus.store.appengine.KeyRegistry
org.datanucleus.store.appengine.EmualtedXARResource
org.datanucleus.store.appengine.DatastoreConnectionFactoryImpl$DatastoreManagedConnection
// datanucleus.appengine.autoCreateDatastoreTxns=true でリークします
com.google.appengine.api.datastore.DatastoreServiceConfig // 2 instances per query
org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager
com.google.appengine.api.datastore.AsyncDatastoreServiceImpl
com.google.appengine.api.datastore.DatastoreServiceImpl
org.datanucleus.store.appengine.jdo. DatastoreJDOTransation
com.google.appengine.api.datastore.DatastoreXARResource
com.google.appengine.api.datastore.DatastoreProperty
com.google.appengine.api.datastore.KeyRegistry
com.google.appengine.api.datastore.DatastoreConnectionFactoryImpl$DatastoreManagedConnection
com.google.appengine.api.datastore.TransactionStackImpl$ThreadLocalTransactionStack$StaticMember
com.google.appengine.api.datastore.TransactionStackImpl
org.datanucleus.store.appengine.RuntimeExceptionWrapperingDatastoreService
これが私のコードです:
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
account = pm.detachCopy(pm.getObjectById(Account.class, accountKey));
} catch (javax.jdo.JDOObjectNotFoundException ex) {
account = null;
} finally {
pm.close();
}
アイデア/考えはありますか?これは Google AppEngine の本当のメモリ リークですか、それとも開発環境の単なる事実ですか、それとも私自身のエラーでしょうか?