私はJSF Webアプリケーションを持っています。私は JSF 2.1.9、Hibernate 4.1.4、GlassFish 3.1.2、PrimeFaces 3.4.1 を使用しています。問題は、使用されているヒープ サイズがゆっくりと増加し、2 ~ 3 日後に最大ヒープ サイズに達することです。次に、GlassFish を再起動する必要があります。
ヒープ ダンプ:
最初に、アプリケーション内のすべての Web ページをクリックし、使用したヒープ サイズは 100 MB でした。
1 ~ 2 日後、使用されるヒープ サイズは 300 MB に増加します (この間に使用された同じ Web ページ)。
ヒープで最も使用されているクラスのスクリーンショットを撮りました。
クラス インスタンスではchar[]
、次のような SQL クエリ文字列が多すぎます。
問題は一つだけではなく、ここから解決できるかもしれません。私の Web ページでは、通常、データベースからいくつかのオブジェクトを選択してレンダリングします。ここにいくつかの豆があります: 画像 (インデックスコントローラ):
@Named("indexController")
@SessionScoped
public class IndexController implements Serializable {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("imagePU");
public List<Image> getImages() {
EntityManager em = emf.createEntityManager();
List<Image> result;
try {
EntityTransaction entr = em.getTransaction();
boolean committed = false;
entr.begin();
try {
Query query = em.createQuery("SELECT i FROM Image i ORDER BY i.imageId DESC").setMaxResults(12);
result = query.getResultList();
entr.commit();
committed = true;
} finally {
if (!committed) {
entr.rollback();
}
}
} finally {
em.close();
}
return result;
}
}
タグ付き画像:
@Named("galleryBean")
@SessionScoped
public class GalleryBean implements Serializable {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("imagePU");
public List<TaggedImage> getTaggedImages() {
EntityManager em = emf.createEntityManager();
List<TaggedImage> result;
try {
EntityTransaction entr = em.getTransaction();
boolean committed = false;
entr.begin();
try {
Query query = em.createQuery("SELECT ti FROM TaggedImage ti GROUP BY ti.tag ORDER BY ti.taggedImagesId DESC");
result = query.getResultList();
entr.commit();
committed = true;
} finally {
if (!committed) {
entr.rollback();
}
}
} finally {
em.close();
}
return result;
}
}
ちなみに、ゲッターでビジネスロジックを実行するべきではありませんが、それが私の問題の主な理由ではないと思います。助けとアドバイスが必要です。必要に応じて、さらに情報を提供できます。
ご協力いただきありがとうございます。