java.lang.OutOfMemoryError:Java堆空间 – 如何保存内存?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java.lang.OutOfMemoryError:Java堆空间 – 如何保存内存?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3077字,纯文字阅读大概需要5分钟。
内容图文
![java.lang.OutOfMemoryError:Java堆空间 – 如何保存内存?](/upload/InfoBanner/zyjiaocheng/961/db161709455a4422af18d4e4b2b080ac.jpg)
我试图通过设置JVM参数来调整我的JSF应用程序内存消耗,因为我出现内存不足错误.
我能够增加内存堆并每天重启服务器两次,但这不是解决方案……
JVM参数:
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSClassUnloadingEnabled
-XX:+CMSParallelRemarkEnabled
-XX:CMSInitiatingOccupancyFraction=30
-XX:+CMSIncrementalMode
-XX:+CMSIncrementalPacing
-XX:ParallelCMSThreads=2
-XX:+UseCMSCompactAtFullCollection
-XX:+DisableExplicitGC
-XX:MaxHeapFreeRatio=70
-XX:MinHeapFreeRatio=40
-XX:MaxTenuringThreshold=30
-XX:NewSize=512m
-XX:MaxNewSize=512m
-XX:SurvivorRatio=2
-XX:PermSize=150m
-Xms1024m
-Xmx1024m
一切似乎工作正常,终身空间为0 MB,伊甸园空间持续清理但幸存者空间仍在增长,当它达到极限时,物体被移动到终身空间并且从未被释放.经过半天的运行应用程序后,我得到了内存不足的错误.所以我必须安排自动重启tomcat服务器.
所以我认为,我的应用程序中肯定存在一些问题,因为它的内存消耗对于如此小的应用程序来说太高了(每天大约有数千个数据库移动).
我的部分代码是:
Bean.java
/* save datalist */
public void save()
{
session = DaoSF.getSessionFactory.openSession();
try
{
Dao.save(dataList);
}
catch (Exception e) {...}
finally
{
session.close();
}
}
Dao.java
public static void save(List<? extends Object> dataList)
{
for (Object dataItem : dataList)
{
save(dataItem);
}
}
public static void save(Object dataItem)
{
try
{
Transaction tx = session.beginTransaction();
session.save(dataItem);
tx.commit();
}
catch(Exception e) {....}
}
DaoSF.java
public class DaoSF implements Serializable
{
private static final long serialVersionUID = 1L;
private static SessionFactory sessionFactory;
private static Session hibSession;
private static synchronized void initSessionFactory
{
Configuration config = new Configuration();
config.configure("hibernate.cfg.xml");
sessionFactory = config.buildSessionFactory();
hibSession = sessionFactory.getCurrentSession();
}
public static SessionFactory getSessionFactory
{
initSessionFactory;
return sessionFactory;
}
public static Session getSession()
{
return hibSession;
}
}
你能告诉我,将对象保存(更新,删除)到数据库的最佳做法是什么,以便保存的对象不会留在内存中?
解决方法:
试试这个.它还不完美,但我认为你必须摆脱Dao中的静态会话属性.请参阅hibernate docs:http://docs.jboss.org/hibernate/envers/3.5/javadocs/org/hibernate/Session.html:
并不意味着实现者是线程安全的.相反,每个线程/事务应从SessionFactory获取自己的实例.
您也可以在Dao内部获取会话,以便Bean不了解底层持久性机制,但我不想改变那么多.
Bean.java
/* save datalist */
public void save() {
Session session = nlul;
try {
session = DaoSF.getSessionFactory.openSession();
/* one instance per call,
* ready for garbage collection after leaving this method
*/
Dao mydao = new Dao(session);
mydao.save(dataList);
} catch (Exception e) {...
} finally {
if (sessioN != null)
session.close();
}
}
Dao.java
private Session mysession = null;
public Dao(Session mysession) {
this.mysession = mysession;
}
public void save(List<? extends Object> dataList) {
for (Object dataItem : dataList) {
save(dataItem);
}
}
public void save(Object dataItem) {
try {
Transaction tx = session.beginTransaction();
this.mysession.save(dataItem);
tx.commit();
}
catch(Exception e) {....}
}
内容总结
以上是互联网集市为您收集整理的java.lang.OutOfMemoryError:Java堆空间 – 如何保存内存?全部内容,希望文章能够帮你解决java.lang.OutOfMemoryError:Java堆空间 – 如何保存内存?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。