在玩某些东西时,我遇到了类似的东西。这段代码不会导致我的记忆耗尽。
while(true)
{
Person p=new Person();
}
除非垃圾收集每隔几秒钟运行一次,否则我无法分清为什么我的内存使用量(在任务管理器中)没有上升。
java中的垃圾收集经常运行吗?或者Windows中的任务管理器是否在显示内存使用情况方面做得不好?
更新: 我用Java Visual VM监视它。垃圾收集器在我运行它的几分钟内从未激活过。
答案 0 :(得分:6)
GC知道何时运行,它在需要时运行,Person
的范围(生命周期)太短,GC将在伊甸园空间中扫描它,它不会甚至被提升为老一辈。
答案 1 :(得分:1)
Java中的垃圾收集基本上会根据需要运行。每当堆被填满时,GC就会发生。如果你没有分配,GC将无法运行,如果你什么也不做,除了分配,GC将经常运行。更重要的是,如果不首先尝试运行GC,Java将永远不会出现OutOfMemoryError。
在某些情况下,JIT还可以识别对象何时明显超出范围或仅在本地需要,并且在这种情况下可以进行堆栈分配,而根本不需要任何GC。
答案 2 :(得分:0)
在每个循环中创建对象并销毁它。垃圾只在必要时释放内存。如果你只想做一个内存错误,你必须在while和while添加人员的同时创建一个ArrayList。