带有Spring Boot + H2 + JPA和批处理的Docker中的OOM

阿德里安:

Java应用程序正在docker容器中运行。

休息控制器和其他微服务接收到的文档临时存储在内部H2数据库中(在内存中)。然后在tika的帮助下进行处理并将其发送到下一个微服务。最后,在内部数据库中删除了文档。

这一切都按预期工作。在处理期间,数据库中的文档大小正在增加和减少(借助于H2 Web控制台进行控制)。

永久凭证的类别如下:

@Entity
@Table(name = "Document")
public class Document {
@Id
@GeneratedValue
Long id = 0L;
@Lob
private String content;
@Lob
private String contentHtml = "";
@ElementCollection
@MapKeyColumn(name = "name")
@Column(length=1000, name = "value")
@CollectionTable(name = "meta_attributes", joinColumns = @JoinColumn(name = "meta_id"))
@LazyCollection(LazyCollectionOption.FALSE)
private Map<String, String> metadata;
@Enumerated(EnumType.STRING)
private DocStatus status;

public Document() {
}

但是问题是增加了Docker容器的内存消耗。我们尝试使用3GB和6GB的MEMORY_MAX。在这两种情况下,内存使用缓慢增加,直到容器退出并显示状态137(已杀死)。

处理大约5万个文件后,表的状态如下:

在此处输入图片说明

借助jmap进行的有关容器内部jvm的转储显示,大多数内存已被MVMap(PageReferences)占用,似乎从H2用于存储数据:

在此处输入图片说明

在此处输入图片说明

我的问题:

这是否更可能是H2内部的一种内存泄漏,还是更有可能是配置问题?我试图将使用过的JPARepository方法从.save()更改为.saveAndFlush(),但没有任何改变。我无法想象这与实体管理器有关,因为它们全部由Spring Boot管理。

阿德里安:

更新:原因不是在H2或JPA中,而是在错误的docker-compose配置中。我们确实为运行在容器内的JVM(-Xmx $ MEMORY_MAX)和docker本身(mem_limit)分配了相同数量的内存。

将JVM的MEMORY_MAX设置为最大mem_limit的80%后,一切正常。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spring Boot和Hibernate:带有本地h2和Flyway的MySQL TEXT

带有JPA和H2的Spring Boot:创建了DB文件,但是没有任何持久化

Spring Boot默认的H2 jdbc连接(和H2控制台)

Spring Boot + H2 + JPA项目的问题

使用 H2 和 Spring Boot 迁移 Liquibase

Spring boot - h2 和 mysql 的配置文件

表未在 Spring Boot H2 中创建

从带有十进制列和十进制JPA属性的csv文件插入H2数据库Spring Boot

Spring Boot 2.2.1 H2失败?

在Spring Boot下执行H2

Spring Boot H2数据转换

不存在Spring Boot JPA和H2记录

使用 Spring Boot JPA 在 H2 数据库中插入数据

Spring Boot App + H2(在内存中)不适用于Docker容器

JPA 和 Spring Boot:DB (H2) 中的整数未按预期映射到布尔值

带有Spring Boot和OAuth 2的Spring Security

在 Spring Boot + Kotlin 中使用 JPA + H2 - 启动错误

使用JPA进行Spring Boot-无法从h2数据库返回对象

Google Cloud App Engine + H2永久性+ Spring boot JPA

Spring Boot JPA H2控制台未运行,application.properties文件被忽略

图像从数据库H2上传和显示错误spring boot thymleaf

使用Spring Boot和H2读取数据库对象

在Spring Boot H2中通过一个元素在arraylist中查询

Spring Boot中的外键问题-H2数据库

在Spring Boot中创建外键-H2数据库

如何在H2数据库中存储文件-Spring Boot

Spring Boot应用程序中的H2模式为空

如何从H2数据库中的用户预加载Spring Boot集成测试?

尝试从Java Spring Boot中的H2数据库获取相关实体