【问题标题】:Java Memory OcupationJava 内存占用
【发布时间】:2011-06-15 18:45:44
【问题描述】:

我做了一个服务器端应用程序,它使用 18mb 的非堆和大约 6mbs 的头部,最大 30mbs。我用 -Xms 和 Xmx 设置了堆的最大值,问题是当我在 ubuntu 服务器上运行程序时,它需要大约 170mbs 而不是 18+30 或至少 100Mbs。有人知道如何让虚拟机只获得 100MB?

【问题讨论】:

  • 你的用例是什么?您的目标是在同一台服务器上运行 100 台虚拟机吗?通常在服务器上运行 java 进程时,您不会真正关心使用 100MB 还是 30MB,因为内存很便宜。
  • 您为 Xms 和 Xmx 设置的值在这里会有所帮助。您认为您的应用程序应该/必须只占用 48 MB (18+30) 内存的原因是什么?
  • 我用 Jconsole 和 VMvisual 做了一些测试。 Xmx 40mbs Xms 25. 问题是因为它是 VPS,所以 iam 限制为 512mbs,我现在无法支付。另一件事是,每个 100mbs 我可以让至少 3 个进程运行...
  • 28114 meu 22 0 161m 20m 5744 S 0 3.9 0:05.22 java here is top print

标签: java performance memory


【解决方案1】:

JVM 使用堆、线程堆栈和共享库等其他内存。共享库可能相对较大,但它们不使用实际内存,除非它们被实际使用。如果您运行 JVM,它们会在它们之间共享,但您无法在进程信息中看到这一点。

在现代 PC 中,1 GB 内存的成本约为 100 美元,因此减少每一个 MB 内存已不再像过去那样重要。

【讨论】:

  • 它是一个 VPS,它限制为 512Ram。它是一个服务器应用程序
  • 在这种情况下,提供商可能会有一些建议,或者为他们提供一个论坛。 JVM会消耗大量的虚拟内存并不会变成真正的内存,你必须注意驻留大小。
  • 28114 meu 22 0 161m 20m 5744 S 0 3.9 0:05.22 java here is top print
  • 如果我没看错的话,它使用了 161m 的虚拟内存和 20m 的常驻内存(即主内存) (只要安装相同的 Java)您需要运行应用程序一段时间,因为共享库可能会引入更多。注意:如果内存不足,它们可以再次被推出。
  • 找出应用程序可以运行的最小值的一个简单技巧是创建一个与内存一样大的大文件,然后将其删除。这会推出所有未使用的页面,您将看到有多少应用程序必须保留在内存中。
【解决方案2】:

回应您的评论

我用 Jconsole 做了一些测试 和 VMvisual。 Xmx 40mbs Xms 25. 问题是我仅限于 512mbs,因为它是一个 VPS,我付不起 现在为它。另一件事是 每个100mbs我至少可以放3个 进程正在运行。

问题是,你走错了路。不要试图让你的虚拟机变得超级小,这样你就可以运行 3 个虚拟机。将所有内容合并到 1 个虚拟机中。如果你有 512 内存,那么用 256MB 的堆创建 1 个虚拟机,让它做所有的事情。您可以在单个 VM 中拥有 10 或 100 个线程。在大多数情况下,与尝试运行许多小型 VM 相比,这会更好地执行并且使用更少的总内存。

【讨论】:

  • 是的,当程序相同时,我通常会这样做,但问题是这是不同的东西,我无法将它们结合起来:S
  • 你总是可以联合它们......但你是对的,将 3 个随机程序粘在一起并不理想......
  • 我认为您在这里遇到了权衡问题。您必须围绕成本和可维护性做出权衡决策。是否值得在您的环境中花费额外的 RAM,以避免将不同应用程序塞入同一运行时的复杂性,或者不是吗?如果答案是你不能接受,那么你需要开始考虑在 VM 中运行的成本,并权衡使用 C 编写你的东西,在那里你可以密切控制使用的内存(权衡有重写您的应用程序的费用,以及在非 VM 环境中)。
猜你喜欢
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 2022-10-30
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 2023-04-03
  • 2016-03-10
相关资源
最近更新 更多