Java 为什么此代码不会导致我的计算机';谁的内存用完了?

Java 为什么此代码不会导致我的计算机';谁的内存用完了?,java,windows-7,garbage-collection,Java,Windows 7,Garbage Collection,在玩东西的时候,我遇到了这样的事情。这段代码不会导致我的内存耗尽 while(true) { Person p=new Person(); } 除非垃圾收集每隔几秒钟运行一次,否则我不知道为什么我的内存使用率(在任务管理器中)没有上升 那么java中的垃圾收集经常运行吗?或者windows中的任务管理器在显示内存使用情况方面做得不好 更新: 我用Java Visual VM监视它。垃圾收集器在我运行的几分钟内从未被激活 GC知道什么时候运行,什么时候需要运行,Person

在玩东西的时候,我遇到了这样的事情。这段代码不会导致我的内存耗尽

while(true)
{
    Person p=new Person();       
}
除非垃圾收集每隔几秒钟运行一次,否则我不知道为什么我的内存使用率(在任务管理器中)没有上升

那么java中的垃圾收集经常运行吗?或者windows中的任务管理器在显示内存使用情况方面做得不好

更新
我用Java Visual VM监视它。垃圾收集器在我运行的几分钟内从未被激活

GC知道什么时候运行,什么时候需要运行,
Person
的作用域(生命期)太短,GC会在伊甸园空间扫描它,甚至不会升级到老一代。

GC知道什么时候运行,什么时候需要运行,作用域(生命期)“of
Person
太短,GC将在其位于Eden空间时对其进行扫描,甚至不会升级到较老的一代。

Java中的垃圾收集基本上会根据需要经常运行。每当堆被填满时,就会发生GC。如果不进行分配,GC将不会运行;如果只进行分配,GC将经常运行。更重要的是,如果不首先尝试运行GC,Java将永远不会出现OfMemoryError


在某些情况下,JIT还可以识别对象何时明显超出范围或仅在本地需要,并且在这种情况下可以进行堆栈分配,根本不需要任何GC。

Java中的垃圾收集基本上会根据需要经常运行。每当堆被填满时,就会发生GC。如果不进行分配,GC将不会运行;如果只进行分配,GC将经常运行。更重要的是,如果不首先尝试运行GC,Java将永远不会出现OfMemoryError



在某些情况下,JIT还可以识别对象是否明显超出范围或仅在本地需要,并在这种情况下进行堆栈分配,而不需要任何GC。

在每个循环中,您创建对象并销毁它。垃圾仅在必要时释放内存。如果只想产生内存错误,则必须在while中创建ArrayList,并在while中向ArrayList添加person。

在每个循环中创建对象并销毁它。垃圾仅在必要时释放内存。如果只想产生内存错误,则必须在while中创建一个ArrayList,并在while中向ArrayList中添加person。

我想GC很擅长做它的工作?如果确实想耗尽内存,制作一个列表并将每个人都推到其中…因为你的代码没有做任何有用的事情,你的
person
对象可能会被放在堆栈上或一起丢弃。如果内存不足,为什么不希望GC运行,以返回一些内存?i、 这毕竟是它的工作。我用Java Visual VM监控它。垃圾收集器在我运行它的几分钟内从未被激活。我想GC很擅长做它的工作?如果你真的想耗尽内存,请列出一个列表并将每个人都放入其中…因为你的代码没有做任何有用的事情,你的
person
对象可能会被放在堆栈上或一起丢弃。如果内存不足,为什么不希望GC运行,以返回一些内存?i、 这毕竟是它的工作。我用Java Visual VM监控它。垃圾回收器在我运行它的几分钟内从未被激活。若要查看垃圾回收的运行情况,请尝试使用以下命令行参数运行代码:
-verbose:gc-Xmx16m
。这将可用内存减少到16MB,并打印GC运行。使用更大的内存池,GC运行的频率更低。它没有打印任何gc运行。若要查看垃圾收集运行,请尝试使用以下命令行参数运行代码:
-verbose:gc-Xmx16m
。这将可用内存减少到16MB,并打印GC运行。使用更大的内存池,GC运行的频率更低。它没有打印任何gc运行。堆是指空间吗?因为小GC发生在堆变满之前,所以我假设堆中至少有一代已满以触发GC,即使是小Eden代。堆是指空间吗?因为小GC发生在堆变满之前,所以我假设堆中至少有一些代变满以触发GC,即使是小Eden代。