gpt4 book ai didi

java.lang.OutOfMemoryError : Java heap space - how to save memory? 错误

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:01:10 27 4
gpt4 key购买 nike

我试图通过设置 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,eden 空间不断被清除,但幸存者空间仍在增长,当它达到极限时,对象被移动到永久空间并且从未被释放。在运行应用程序半天后,我得到了内存不足的错误。所以我必须安排 tomcat 服务器的自动重启。

enter image description here

所以我想,我的应用程序一定有问题,因为它的内存消耗对于这么小的应用程序来说太高了(每天大约数千次数据库移动)。

这是我的部分代码:

Bean.java

/* save datalist */
public void save()
{
session = DaoSF.getSessionFactory.openSession();
try
{
Dao.save(dataList);
}
catch (Exception e) {...}
finally
{
session.close();
}
}

道.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;
}
}

您能告诉我,将对象保存(更新、删除)到数据库的最佳做法是什么,这样保存的对象就不会留在内存中吗?

最佳答案

您的内存问题极不可能与您在数据库中保存/删除/更新对象方面所做的任何事情直接相关。 PermGen 空间通常不用于任何用户级对象。它用于那些注定永远 被释放的事物,例如类定义、JVM 状态的内部位等。

如果您管理数据对象的方式存在问题,您会看到 OutOfMemoryError 提示没有剩余的堆空间。但是要回答你的问题,一般来说,你的数据对象将在它们离开范围后运行的下一个垃圾收集过程中被垃圾收集(这意味着你不再在任何地方引用它们)。我怀疑您已经很好地处理了这个问题,因为您没有遇到 OutOfMemoryError 问题。

如果您的 PermGen 空间不足,可能是因为您的应用程序使用了大量库。遗憾的是,解决这个问题的唯一方法是增加 PermGen 的大小,例如:

-XX:PermSize=256m

请注意,这实际上会减少您的应用程序可用的堆空间量,因此通常明智的做法是将您的总 JVM 内存分配量增加相应的量,例如:

-Xmx1130m

试一试,看看它是否更适合您。

关于java.lang.OutOfMemoryError : Java heap space - how to save memory? 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6722411/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com