我有一个Java微服务,它在生产中的内存每天都在增加,我刚刚继承了它。它目前使用了一个4GB堆的80%,并且每天增加几个百分点。
JVM选项中的-xms和-xmx值都设置为4GB。
这是否意味着垃圾收集器在JVM达到其堆限制之前不会激活?
这是否意味着垃圾收集器在JVM达到其堆限制之前不会激活?
不,垃圾收集器将在GC算法通知它时激活其收集周期--通常是频繁的增量收集,偶尔是完全收集。堆用完会迫使它更频繁地执行完整的集合,并且更加积极进取,但肯定不是这样的(对于我所知道的所有GC实现)说它在堆空间用完或几乎用完之前不会做任何事情。
可能会发生的情况(取决于GC算法)是,增量收集是定期执行的&正如预期的那样,但无法正确地清除所有内容,并且只有在空间较小的情况下才会执行较慢的完全收集。这是完全有效的行为--您给了VM 4GB堆,它将以自己认为合适的方式使用这些堆。如果是这种情况,那么当它接近4GB限制并执行完全收集时,您会看到它突然下降。
或者,也有可能在应用程序的某个地方存在内存泄漏,它最终将耗尽内存,无法释放任何空间,然后抛出OutOfMemoryError
。
如果是我,我会在测试环境下对应用程序进行配置和压力测试,设置相同的堆和GC选项来检查行为--这确实是确定的唯一方法。
我有以下代码: 您可以看到每个操作分配5M。当我设置时,它无一例外地成功运行,而当时,它会引发异常。有人能解释一下为什么吗?我在Windows 7、64bit、Eclipse 4.3下。以下代码是相同的结果:
问题内容: 现在,我在ini文件中对这些设置是: -Xms768M -Xmx1024M 当将它们设置得更高时,eclipse就不会再开始了……有没有办法增加这些值而又不会使eclipse崩溃? 问题答案: 最大值不取决于Eclipse,而是取决于您的OS(显然取决于可用的物理内存)。 您可能想看一下这个问题:Windows中每个Java进程的最大内存量?
问题内容: 请说明JVM 中Xms和Xmx参数的使用。它们的默认值是多少? 问题答案: 该标志指定Java虚拟机(JVM)的最大内存分配池,而Xms指定初始内存分配池。 这意味着你的JVM将以一定数量的内存启动,并且将能够使用最大数量的内存。例如,启动如下所示的JVM将以256 MB的内存启动它,并将允许该进程使用最多2048 MB的内存: 也可以以不同的大小(例如千字节,兆字节等)指定内存标志。
我编写的java应用程序遇到了一个问题,导致硬件性能问题。问题(我很确定)是,我运行应用程序的一些机器只有1GB的内存。当我启动java应用程序时,我将堆大小设置为-xms512m-xmx1024m。 我的第一个问题是,我的假设是否正确,因为我将机器的所有内存分配给java堆,这显然会导致性能问题?
问题内容: 给定这两个命令 A: B: 我有两个问题: 由于命令A保留了更多的参数存储空间,因此A的运行速度会比B快吗? 如何-Xmx和-Xms影响正在运行的进程,我的程序的输出? 问题答案: 该参数定义堆可以为JVM达到的最大内存大小。您必须非常了解您的程序,并查看其在负载下的性能,并相应地设置此参数。如果程序的堆内存达到最大堆大小,则较低的值可能会导致OutOfMemoryExceptions
通常我设置Xms512m和Xmx1g,这样当JVM启动时,它会分配512MB,并根据需要逐渐将堆增加到1GB。但我看到,在专用服务器实例中,这些值设置为相同的值,例如1g。将两者设置为相同的值有什么好处吗?