【发布时间】:2020-12-29 06:50:28
【问题描述】:
我们使用 1 GB 作为我们应用程序的 Java 内存 (-Xmx) 大小。但它运行缓慢,因为它正在处理大量消息。内存使用情况是这样的:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
34536 javarunner 20 0 5724m 970m 13m S 6.3 0.3 22:48.69 java
即虚拟内存为5724m,驻留集大小为970m。
在虚拟内存是驻留集大小的 5 倍的情况下,这样的内存利用率被认为可以吗? 对于这个比率,我们应该保持任何公式或准则吗?
【问题讨论】:
-
为什么在不解释原因的情况下对真正的问题给出负分。我不是要求别人在这里做我的功课。只是询问有关此方面的任何可用指南或良好做法。
-
更多信息会很好。你实际上有多少物理内存?你有gc日志吗?您选择了什么收集器或正在运行默认收集器?你运行的是什么JDK版本?一般来说,在已被分页到 vm 的堆上运行 gc 会产生可怕的性能。
-
Erik... 答案应该与我使用的编程语言无关。因为这可能是一个通用问题,即我们应该在 windows、linux 机器中保持虚拟内存和剩余内存的比例。
-
zimmer 为什么会这样?不同的语言和运行时有不同的行为并且对例如换出内存的反应不同。 JVM gc 进程对换出的堆反应很糟糕。看你的帖子,我猜你收到了大量的消息,而 gc 是你性能问题的罪魁祸首。
-
Erik .. 我们有 300 GB 的内存。但我不会将 5gb 分配给一个进程,这可能会偶尔出现峰值。 1gb 总体来说还是不错的。我已经进一步检查了我的问题,即使在使用 1gb 的 -Xmx 重新启动进程时,操作系统(redhat)正在分配 5724 mb 的虚拟内存。所以缓慢不是由于虚拟内存。后来我发现我们的数据库(sybase ASE,15.7)间歇性地运行缓慢,这导致了这个问题。但我要求提供关于虚拟到 REs 内存的指南,我在下面得到了这些指南。因此,感谢您的时间和关注。赞赏。
标签: java performance memory