Java无法及时收集垃圾

Java无法及时收集垃圾,java,performance,garbage-collection,Java,Performance,Garbage Collection,我有这样的问题,jvm不能及时执行gc,应用程序冻结。这方面的“解决方案”是使用jconsole连接到应用程序,并建议jvm进行垃圾收集。我不必说这是非常糟糕的应用程序行为。jvm是否有一些选项建议它更快/更频繁地执行gc?也许这个问题还有其他真正的解决办法 问题似乎不是内存不足,而是gc无法在新数据发送到应用程序之前及时进行收集。这是因为gc似乎很晚才开始收集数据。若jconsole的System.gc()按钮足够早地建议了,那个么问题就不会发生 年轻一代由并行收集器“PS清道夫”收集。 旧一

我有这样的问题,jvm不能及时执行gc,应用程序冻结。这方面的“解决方案”是使用jconsole连接到应用程序,并建议jvm进行垃圾收集。我不必说这是非常糟糕的应用程序行为。jvm是否有一些选项建议它更快/更频繁地执行gc?也许这个问题还有其他真正的解决办法


问题似乎不是内存不足,而是gc无法在新数据发送到应用程序之前及时进行收集。这是因为gc似乎很晚才开始收集数据。若jconsole的System.gc()按钮足够早地建议了,那个么问题就不会发生

年轻一代由并行收集器“PS清道夫”收集。 旧一代由“PS MarkSweep”收集,它是并行标记和扫描收集器。

有一个
System.gc()
,它完全按照您所描述的那样执行:它向JVM建议应该进行垃圾收集。(JVM还有一些命令行参数,可以作为内存管理器的指令。)

但是,如果在分配过程中内存不足,通常意味着JVM确实首先尝试了垃圾收集,但未能释放必要的内存。在这种情况下,您可能存在内存泄漏(在保留不必要引用的意义上),您应该使用内存分析器来检查这一点。这一点很重要,因为如果您有内存泄漏,那么更频繁的垃圾收集将无法解决您的问题——除非它们可能会推迟其表现,给您一种错误的安全感


从:

OutOfMemoryError
:Java虚拟机实现已用完 虚拟内存或物理内存,以及自动存储 管理器无法回收足够的内存来满足对象的要求 创建请求


您可以使用更多内存启动jvm

java -Xms512M -Xmx1024M

将使用512Mb内存启动jvm,使其增长到1GB

您可以在服务器上部署并添加应用程序,它将为您提供有关内存泄漏和内存使用情况的详细报告。有了它,您将能够正确地优化系统和代码。

您应该检查内存泄漏。
我敢肯定,除非没有要释放的内存和更多的可用内存,否则您将无法退出MemoryException。

您可以使用
System.gc()
建议VM运行垃圾收集器。无法保证它会立即运行

我怀疑这是否有帮助,但它可能会起作用。您可以看到的另一件事是增加JVM的最大内存大小。您可以通过提供命令行参数
-Xmx512m
来实现这一点。这将提供512兆字节的堆大小,而不是默认的128兆字节


您可以使用JConsole查看应用程序的内存使用情况。这有助于了解内存使用情况如何发展,这有助于检测内存泄漏

我想,或者您的应用程序需要更多内存才能高效运行,请尝试通过设置
-Xms512M-Xmx1024M
等参数来调优JVM。 或 内存泄漏正在耗尽内存

您应该检查应用程序的内存消耗模式。e、 g.当处理更多vs时,它占用的内存保持空闲

如果您观察到内存峰值持续激增,则可能是内存泄漏。 内存泄漏问题上最好的线程之一是

另一个好的是

另外

如果加载了很多类(比如rt.jar中的所有类),可能会收到OOME。由于加载的类驻留在PermGen而不是堆内存中,所以您可能还希望使用-XX:MaxPermSize开关来增加PermGen大小

当然,您可以自由选择垃圾收集器–ParallelGC、ConcMarkSweepGC(CMS)或G1GC(G1)


请注意,Java中的一些API本身可能会导致内存泄漏(没有任何程序员的错误)。Gjava.lang.String#substring()(请参见)

如果应用程序冻结,但被强制GC解冻,那么问题很可能不是内存,而是其他一些资源泄漏,通过在死对象上运行终结器可以缓解。正确编写的代码决不能依赖终结器进行清理,因此请尝试在应用程序中查找任何未关闭的资源。

您可以调整GC-您应该详细介绍您的环境。堆大小是多少?预期负载是多少?。问题可能出在您的代码中,也可能出在您的环境中。可能您使用的内存太多。您的老一代使用的是哪种收集器?您是否尝试过使用
-verbose:gc
运行代码来监视垃圾收集?内存泄漏的意思是保留引用的时间比您需要的时间长。在javaYes中,真正的内存泄漏几乎是不可能的。当然,我指的不是经典的内存泄漏。java中内存泄漏的一个例子是在集合中添加对象,而没有代码删除它们(例如,存储特定类型的事件)。这样的集合可以无限增长,占据你所有的堆。@strikerbs我继承的web应用程序存在严重的软件老化问题。一切都在一个框架后面运行,所以弄清楚它可能发生在哪里是一场噩梦。调用
System.gc()
几乎总是一个非解决方案。实际上,它通常会降低应用程序的响应速度,但对OOME毫无帮助。事实上,我相信许多JVM实现只是忽略了System.gc()调用。问题似乎不是内存不足,而是gc无法在新数据发送到应用程序之前及时收集。这是因为gc似乎很晚才开始收集数据。如果建议使用e