【发布时间】:2020-04-28 21:38:20
【问题描述】:
使用 WildFly 18.0.1 创建多个 @Dependent 实例来测试内存泄漏
@Dependent
public class Book {
@Inject
protected GlobalService globalService;
protected byte[] data;
protected String id;
public Book() {
}
public Book(GlobalService globalService) {
this.globalService = globalService;
init();
}
@PostConstruct
public void init() {
this.data = new byte[1024];
Arrays.fill(data, (byte) 7);
this.id = globalService.getId();
}
}
@ApplicationScoped
public class GlobalFactory {
@Inject
protected GlobalService globalService;
@Inject
private Instance<Book> bookInstance;
public Book createBook() {
return bookInstance.get();
}
public Book createBook2() {
Book b = bookInstance.get()
bookInstance.destroy(b);
return b;
}
public Book createBook3() {
return new Book(globalService);
}
}
@Singleton
@Startup
@ConcurrencyManagement(value = ConcurrencyManagementType.BEAN)
public class GlobalSingleton {
protected static final int ADD_COUNT = 8192;
protected static final AtomicLong counter = new AtomicLong(0);
@Inject
protected GlobalFactory books;
@Schedule(second = "*/1", minute = "*", hour = "*", persistent = false)
public void schedule() {
for (int i = 0; i < ADD_COUNT; i++) {
books.createBook();
}
counter.addAndGet(ADD_COUNT);
System.out.println("Total created: " + counter);
}
}
创建 200k 本书后,我得到 OutOfMemoryError。 我很清楚,因为它写在这里
CDI Application and Dependent scopes can conspire to impact garbage collection?
但我还有一个问题:
为什么 OutOfMemoryError 仅在 Book 中的 GlobalService 是无状态 EJB 时发生,但在 @ApplicationScoped 时不会发生。我认为 GlobalFactory 的 @ApplicationScoped 足以得到 OutOfMemoryError。
createBook2() 或 createBook3() 哪种方法更好?两者都解决了 OutOfMemoryError 的问题
- 还有其他的 createBook() 变体吗?
【问题讨论】:
标签: jakarta-ee memory-leaks ejb cdi weld