Java JVM速度极慢不是由内存泄漏引起的吗?

Java JVM速度极慢不是由内存泄漏引起的吗?,java,eclipse,memory-leaks,jvm,Java,Eclipse,Memory Leaks,Jvm,我正在使用eclipse用Java编程,在运行JVM几个小时后,我的程序会慢慢变慢。通常在几秒钟内打印(或执行)的内容需要几分钟或几个小时 我知道这通常是由程序内存泄漏引起的。然而,我的印象是内存泄漏会减慢PC的速度,因为它会使用大部分CPU功率进行垃圾收集。当我查看task manager时,我只看到目前使用了22-25%的CPU(在过去几个小时内保持稳定),我的机器上大约有35%的内存可用 我的程序是否会因内存泄漏以外的原因而变慢,或者它确实是内存泄漏(这意味着我现在需要仔细查找泄漏源…),

我正在使用eclipse用Java编程,在运行JVM几个小时后,我的程序会慢慢变慢。通常在几秒钟内打印(或执行)的内容需要几分钟或几个小时

我知道这通常是由程序内存泄漏引起的。然而,我的印象是内存泄漏会减慢PC的速度,因为它会使用大部分CPU功率进行垃圾收集。当我查看task manager时,我只看到目前使用了22-25%的CPU(在过去几个小时内保持稳定),我的机器上大约有35%的内存可用

我的程序是否会因内存泄漏以外的原因而变慢,或者它确实是内存泄漏(这意味着我现在需要仔细查找泄漏源…),如果是,为什么CPU使用率相对较低


谢谢

首先,内存泄漏/任何其他故障都不会影响您的电脑或电脑的任何其他部分,除非您引用了一些阻塞的外部资源。为了回答您的问题,一般来说,虽然有可能是CPU导致程序变慢,但在您的情况下,由于您的程序/进程正在逐渐变慢,因此代码中很可能存在内存泄漏


您可以使用任何探查器/jVIsualVM来监视mermoy使用情况/对象状态,以确定问题。

您可能知道现代计算机系统有多个CPU核心。单线程程序将只使用一个内核,这与task manager报告的总体cpu使用率为25%一致(1个内核满载,3个内核空闲=总cpu使用容量的25%)

垃圾收集可能会导致速度减慢,但通常只有在JVM内存受限的情况下才会这样做。要验证它是否是垃圾收集,可以使用jconsole或jvisualvm(JDK的一部分)查看执行垃圾收集花费了多少CPU时间


为了调查程序运行缓慢的原因,使用探查器通常是最有效的方法。

我认为我们无法直接回答这个问题。您需要使用jconsole或jvisualvm检查程序的行为,jconsole或jvisualvm是JDK的一部分。

有时,当对象或实体上存在循环关系时,会发生这种情况。JVM试图通过同一组对象读取数据或绑定数据循环,这会严重影响JVM的性能;大多数情况下,应用程序甚至会崩溃。和前面的答案一样,您可以使用jconsole检查这一情况发生的时间并采取行动。希望你明白这个想法;也许不是这样,这是我读到你的问题时想到的


干杯

可能有很多东西。可能是一个数据结构,其规模不断增长,但扩展性不好?你看过如何运行Java分析器了吗?这应该是你的第一步。查看jdk附带的visualvm。@yshavit是的,我过去确实使用过一些分析器。但我很难用一种有意义的方式来解释我所看到的。我的意思是,我看到了这些对象所使用的对象和内存的数量,但它并没有为我提供一个关于代码的哪一部分负责创建这些对象的线索。。无论如何,如果我所描述的实际上是内存泄漏,这不会导致极高的CPU使用率吗?如果有足够的CPU可用,为什么打印或执行操作需要这么长时间?不幸的是,没有细节很难说谢谢。高GC会占用CPU,但不会在探查器中报告。实际上,我会在VisualVM中查看CPU配置文件,而不是对象/内存配置文件--请确保使用示例模式,而不是跟踪,因为跟踪非常慢。希望这能让你感觉到代码中的减速在哪里。如果没有罪魁祸首,那可能是GC——但我会从一个更简单的假设开始,即代码中只有一些缓慢的函数。但正如所写的,这个问题太广泛了,以这个网站的形式无法很好地回答。