私たちのプロジェクトの 1 つで、ユーザーは自分のアカウントにファイルを添付できます。これらのファイルは 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
で発生した を取得しました。java.lang.OutOfMemoryError: Java heap space
uploadFile()
ヒープダンプを作成し、VisualVM で確認しました。
の 400+ MBchar[]
および 100+ MB のbyte[]
. を含む私たちのアプリケーションは、開始時JBoss
に約 60 ~ 65 MB のヒープを使用していました。では、問題は、なぜEntityManager
ヒープ メモリを狂ったように消費するのかということです。