【发布时间】:2017-04-12 17:34:31
【问题描述】:
我有一个包含 3,244,977 个寄存器和 154.70 MB 大小的表(来自 phpmyadmin 的数据)
我正在运行一个独立的 Java 应用程序并尝试通过休眠加载所有这些数据。我的域类是:
@Entity
public class Register {
@Id
@Column(nullable = false, unique = true, updatable = false)
private Long userId;
private Date checked;
@Column(nullable = false)
private RegisterType tipo;
private boolean preLiked = false;
private boolean preCommented = false;
}
RegisterType 是一个枚举,它在休眠中转换为 int。
如您所见,我的域类并没有那么复杂,考虑到 java 会增加存储在数据库中的数据大小的一些开销,我将堆空间设置为 4GB,然后运行我的应用程序:
java -Xmx4G -cp '....classpath.....' com.tomatechines.bot.Starter
因此,即使对象变大 10 倍,它也应该可以放入堆中。
但我得到 java.lang.OutOfMemoryError: Java heap space
我担心这是其他负载以及大量数据,然后我进行了测试...创建了一个独立的 jar,它只是尝试在没有任何其他变量的情况下加载该表中的所有数据...但是我'我仍然得到异常。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.resize(HashMap.java:703)
at java.util.HashMap.putVal(HashMap.java:662)
at java.util.HashMap.put(HashMap.java:611)
at org.hibernate.internal.util.collections.IdentityMap.put(IdentityMap.java:94)
at org.hibernate.engine.internal.StatefulPersistenceContext.addCollection(StatefulPersistenceContext.java:846)
at org.hibernate.engine.internal.StatefulPersistenceContext.addUninitializedCollection(StatefulPersistenceContext.java:817)
at org.hibernate.type.CollectionType.getCollection(CollectionType.java:739)
at org.hibernate.type.CollectionType.resolveKey(CollectionType.java:436)
at org.hibernate.type.CollectionType.resolve(CollectionType.java:429)
at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:151)
at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:125)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1132)
at org.hibernate.loader.Loader.processResultSet(Loader.java:992)
at org.hibernate.loader.Loader.doQuery(Loader.java:930)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336)
at org.hibernate.loader.Loader.doList(Loader.java:2610)
at org.hibernate.loader.Loader.doList(Loader.java:2593)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2422)
at org.hibernate.loader.Loader.list(Loader.java:2417)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:109)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1787)
at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:363)
at com.tomatechines.utils.hibernate.GenericDAO.find(GenericDAO.java:183)
同样的查询在不到一秒的时间内在 phpmyadmin 上运行。
在java中运行时它应该变得更大吗? hibernate 使数据库中的事物增长到正常大小的 30 倍?如何在不增大堆空间的情况下处理这个问题?
【问题讨论】:
-
您正在运行 64 位 jvm?
-
phymyadmin 中的相同命令在一秒钟内从数据库加载 150+mb?也许这只是他们的数量?
-
@Gray 除非您
needuserId 有时为空。我穿着这双鞋。但除此之外是的,完全同意 -
我是
nullable = false@Eugene。 -
@Gray 傻我。谢谢
标签: java mysql hibernate out-of-memory heap-memory