启用@Autowrid
后,使用Spring 4的Maven项目大约:800个ManegedBeans Spring、900个Services、1000个@Component
和1000个@Repository
,启动应用程序发生 OutOfMemoryError
。
我在Tomcat和Wildfly中增加了参数-Xms1024m -Xmx4g
,在应用程序中我在applicationContext.xml中添加了
并且以巨大的成本应用程序正在启动。我想知道删除是否有任何好处default-lazy-init = "false"
参数
@Autowired
private AnyService anyService;
来自所有类并使用
public void execute() {
AnyService anyService = (AnyService)applicationContext.getBean(AnyService.class);
anyService.execute();
}
在方法中。 使用局部变量代替实例是否可以优化启动?给GC带来一些好处?调用 applicationContext.getBean(AnyService.class) 可能会降低方法的性能?
最佳答案
OutOfMemoryError 和缓慢启动是两个不同的问题。我认为您不必删除 @Autowired 注释。
首先要确定是哪个bean导致加载缓慢(例如db连接),并在该类上添加@Lazy,可以引用这篇文章spring-lazy-annotation-use-cases 。一些bean应该首先加载Make sure a particular bean gets initialized first
其次,使用 Spring XML 配置而不是组件扫描或限制组件扫描范围可能会有所帮助。确保仅使用应用程序所需的最低组件
关于java - Tomcat 8.5 Wildfly 15 Java 8 OutOfMemoryError 和启动速度非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55209127/