Spring Boot 3(Hibernate 6)加载大量JPA实体时启动出现OutOfMemoryError问题求助
Spring Boot 3(Hibernate 6)加载大量JPA实体时启动出现OutOfMemoryError问题求助
各位好,我遇到了一个棘手的问题,想请教下大家:
我维护着一个仅包含JPA实体定义的Spring Boot项目,它作为依赖被多个其他Spring Boot项目引用。之前这个项目一直基于Spring Boot 2.x(对应Hibernate 5.x)运行,启动速度一直很正常。但最近切换到Spring Boot 3(也就是Hibernate 6.x)之后,问题来了——引用这个实体依赖的项目启动时会卡住,最终因为堆内存耗尽报错。
我已经尝试过以下操作,但都没解决问题:
- 增大堆内存到
-Xmx5g,但没有任何改善 - 观察系统资源:启动时CPU占用会飙升到很高,直到最终失败
- 测试加载部分实体:只引入这个jar里的20个实体时,启动完全正常,但引入全部121个实体就会出问题
- 已经在主应用类上添加了
@EntityScan("com.xxx.entities")注解,确保实体能被扫描到
下面是报错的堆栈信息:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Java heap space at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1770) ~[spring-beans-6.0.13.jar:6.0.13] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:598) ~[spring-beans-6.0.13.jar:6.0.13] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520) ~[spring-beans-6.0.13.jar:6.0.13] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) ~[spring-beans-6.0.13.jar:6.0.13] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.13.jar:6.0.13] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) ~[spring-beans-6.0.13.jar:6.0.13] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-6.0.13.jar:6.0.13] at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1166) ~[spring-context-6.0.13.jar:6.0.13] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:940) ~[spring-context-6.0.13.jar:6.0.13] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:616) ~[spring-context-6.0.13.jar:6.0.13] at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:66) ~[spring-boot-3.1.5.jar:3.1.5] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:738) ~[spring-boot-3.1.5.jar:3.1.5] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:440) ~[spring-boot-3.1.5.jar:3.1.5] at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) ~[spring-boot-3.1.5.jar:3.1.5] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-3.1.5.jar:3.1.5] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-3.1.5.jar:3.1.5] at com.chiralcloud.ApigatewayApplication.main(ApigatewayApplication.java:14) ~[classes/:na] Caused by: java.lang.OutOfMemoryError: Java heap space at java.base/java.util.HashMap.resize(HashMap.java:702) ~[na:na] at java.base/java.util.HashMap.putVal(HashMap.java:661) ~[na:na] at java.base/java.util.HashMap.put(HashMap.java:610) ~[na:na] at org.hibernate.query.sqm.sql.internal.SqlAstProcessingStateImpl.resolveSqlExpression(SqlAstProcessingStateImpl.java:98) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.sql.ast.spi.SqlExpressionResolver.resolveSqlExpression(SqlExpressionResolver.java:95) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.metamodel.mapping.internal.BasicAttributeMapping.resolveSqlSelection(BasicAttributeMapping.java:340) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.metamodel.mapping.internal.BasicAttributeMapping.generateFetch(BasicAttributeMapping.java:393) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.sql.results.graph.FetchParent.generateFetchableFetch(FetchParent.java:108) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.loader.ast.internal.LoaderSelectBuilder.lambda$createFetchableConsumer$3(LoaderSelectBuilder.java:986) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.loader.ast.internal.LoaderSelectBuilder$$Lambda$1000/0x00007fc214927718.accept(Unknown Source) ~[na:na] at org.hibernate.loader.ast.internal.LoaderSelectBuilder.visitFetches(LoaderSelectBuilder.java:805) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.loader.ast.internal.LoaderSelectBuilder$$Lambda$993/0x00007fc214921528.visitFetches(Unknown Source) ~[na:na] at org.hibernate.loader.ast.internal.LoaderSqlAstCreationState.visitFetches(LoaderSqlAstCreationState.java:150) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.sql.results.graph.AbstractFetchParent.afterInitialize(AbstractFetchParent.java:30) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.sql.results.graph.entity.AbstractEntityResultGraphNode.afterInitialize(AbstractEntityResultGraphNode.java:68) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.sql.results.graph.entity.internal.EntityFetchJoinedImpl.<init>(EntityFetchJoinedImpl.java:58) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.buildEntityFetchJoined(ToOneAttributeMapping.java:1383) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.lambda$generateFetch$0(ToOneAttributeMapping.java:1542) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping$$Lambda$1004/0x00007fc21492a000.get(Unknown Source) ~[na:na] at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.withRegisteredAssociationKeys(ToOneAttributeMapping.java:1790) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.generateFetch(ToOneAttributeMapping.java:1517) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.generateFetch(ToOneAttributeMapping.java:108) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.sql.results.graph.FetchParent.generateFetchableFetch(FetchParent.java:108) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.loader.ast.internal.LoaderSelectBuilder.lambda$createFetchableConsumer$3(LoaderSelectBuilder.java:986) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.loader.ast.internal.LoaderSelectBuilder$$Lambda$1000/0x00007fc214927718.accept(Unknown Source) ~[na:na] at org.hibernate.loader.ast.internal.LoaderSelectBuilder.visitFetches(LoaderSelectBuilder.java:805) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.loader.ast.internal.LoaderSelectBuilder$$Lambda$993/0x00007fc214921528.visitFetches(Unknown Source) ~[na:na] at org.hibernate.loader.ast.internal.LoaderSqlAstCreationState.visitFetches(LoaderSqlAstCreationState.java:150) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.sql.results.graph.AbstractFetchParent.afterInitialize(AbstractFetchParent.java:30) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.sql.results.graph.entity.AbstractEntityResultGraphNode.afterInitialize(AbstractEntityResultGraphNode.java:68) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.sql.results.graph.entity.internal.EntityFetchJoinedImpl.<init>(EntityFetchJoinedImpl.java:58) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.buildEntityFetchJoined(ToOneAttributeMapping.java:1383) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
有没有朋友遇到过类似的问题?或者能给我一些排查方向的建议?非常感谢!
备注:内容来源于stack exchange,提问作者Chiral Systems
相关产品推荐
相关产品推荐

