【发布时间】:2022-01-27 09:19:56
【问题描述】:
所以我仍在学习一般的内存管理,而不仅仅是 Java。我读过这个Baeldung article。
文章展示了以下代码的示例:
public class StaticTest {
public static List<Double> list = new ArrayList<>();
public void populateList() {
for (int i = 0; i < 10000000; i++) {
list.add(Math.random());
}
Log.info("Debug Point 2");
}
public static void main(String[] args) {
Log.info("Debug Point 1");
new StaticTest().populateList();
Log.info("Debug Point 3");
}
}
如果list 是静态的,我在示例中得到了这一点,Java 仍然保留对象而不是垃圾收集它。但是如果我们删除 static 关键字,在我们离开 populateList 方法后,它将被垃圾回收。
但是如果场景是一个 Bean 怎么办。考虑一下 Spring Boot 项目中的这个例子:
@RestController
public class UserController {
@Autowired
private UserService userService;
private List<User> userList = new ArrayList<>();
@GetMapping("/users")
public ResponseEntity<List<User>> getAllUser() {
List<User> userList = userService.findAll();
for(User u: userList) {
this.userList.add(u);
}
return ResponseEntity.ok(userList);
}
}
由于使用@RestController 注释,将创建一个bean,但在我自己的测试中,这不会导致内存泄漏,或者至少堆内存不会像static list 一样大如果对象计数相同。在我对 Bean 的理解中,userList 应该仍然在内存中并且不应该被垃圾收集,那么有什么区别呢?
【问题讨论】:
标签: java spring-boot memory-management static javabeans