【发布时间】:2012-11-24 05:12:00
【问题描述】:
在我们的一个项目中,用户可以将文件附加到他的帐户。我们将这些文件存储在 MS-SQL 数据库中。所以,我们有以下代码:
@Entity
public class File extends AbstractEntity {
@Lob
@Basic
private byte[] data;
@Nullable
public byte[] getData() {
return data;
}
public void setData(byte[] data) {
this.data = data;
}
public File() {
}
public File(byte[] data) {
this.data = data;
}
}
public class SomeBean {
@PersistenceContext
protected EntityManager em;
public Long uploadFile(@NotNull byte[] data) {
final PhysicalFile physicalFile = new PhysicalFile();
physicalFile.setData(data);
em.persist(physicalFile);
return physicalFile.getId();
}
}
一切都很好,在我们尝试上传 40 MB 文件之前,得到了java.lang.RuntimeException: javax.transaction.RollbackException: [com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] [com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] Can't commit because the transaction is in aborted state,这是由 uploadFile() 方法中的 java.lang.OutOfMemoryError: Java heap space 引起的。
我做了一个堆转储并在 VisualVM 中查看。
char[] 的 400+ MB 和 byte[] 的 100+ MB。在开始时,我们的应用程序(包括JBoss)使用了大约 60-65 MB 的堆空间。那么问题来了,为什么EntityManager 会疯狂的消耗堆内存呢?
【问题讨论】:
标签: java sql-server-2005 jpa out-of-memory entitymanager