我有JSF Web应用程序。我使用的是JSF 2.1.9,Hibernate 4.1.4,GlassFish 3.1.2,PrimeFaces 3.4.1。问题是,使用的堆大小缓慢增加,并在2-3天后达到最大堆大小。然后我必须重新启动GlassFish。使用的堆大小不断增加
堆转储:
在开始的时候,我点击应用中的所有网页和使用的堆大小为100 MB:
一压脚提升1-2天,使用的堆大小提高到300 MB(在此期间,使用相同的网页):
我把小号堆中最常用的类的截图。
在char[]
类的实例,也有太多的SQL查询字符串这样的:
也许没有只有一个问题,但我可能会开始从这一解决。在我的网页中,我通常从数据库中选择一些对象并进行渲染。这里有一些豆类: 图像(索引控制器):
@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;
}
}
顺便说一句,我不应该执行干将业务逻辑,但我认为这不是主要我的问题的原因。我需要帮助和一些建议。如果需要,我可以提供更多信息。
感谢您的帮助。
会话超时是5分钟。 5分钟后,这些都必须从堆中释放出来吗?我正在测试这个应用程序,只有1个活跃用户 – Deniz