【问题标题】:Understanding memory usage for Jetty了解 Jetty 的内存使用情况
【发布时间】:2013-01-23 21:47:56
【问题描述】:

我有一个 Jetty 服务器,用于我正在开发的应用程序的 websocket 连接。唯一的问题是 Jetty 消耗了太多的虚拟内存(!2.5GB 的虚拟内存)和大约 650RES。

我的问题是,如上所述,大部分内存(大约 12gb)不是堆大小,因此分析它并了解正在发生的事情更加困难。

对于如何了解 12gb 消耗的来源以及如何找出内存泄漏或服务器的任何其他问题,您有什么建议吗?

我想澄清虚拟内存的含义(因为我的理解可能是错误的)。当我运行顶部时,虚拟内存是“VIRT”。这是我得到的:

PID USER PR  NI  VIRT  RES  SHR S   %CPU %MEM  TIME+  COMMAND                                        
-------------------------------------------------------------                                        
9442 root 20 0   12.6g 603m  10m S   0    1.3   1:50.06 java

谢谢!

【问题讨论】:

  • Joakim,我使用的是 8.1.7.v20120910
  • 用 long totalMemory = Runtime.getRuntime().totalMemory() 检查内存消耗; long freeMemory = Runtime.getRuntime().freeMemory(); return (totalMemory - freeMemory);
  • JVM 会占用你给它的任何内存。如果您指定一个较大的-Xmx 值,那么您将看到分配的内存。如果您没有指定那么大的堆,那么是时候查看 pmap 以了解内存的去向了。
  • 使用分析器看看
  • 在上面添加了更多详细信息,如果这为你们提供了更多信息,请告诉我

标签: java memory jetty


【解决方案1】:

请粘贴您在启动时使用的 JVM 选项。如前所述,您可以使用 -Xmx 选项调整 JVM 使用的最大内存。

您的应用程序只使用了 603MB 的保留内存。所以看起来它不应该关心你。您可以通过使用“jmap”、启用 jmx 并通过 jconsole 连接或使用分析器来获取有关内存使用情况的一些详细信息。如果您想留在 *nix 领域,如果您的操作系统支持,您也可以尝试“免费”。

在您的情况下,Jetty 不占用 12.5 gig 的内存。它占用603MB。例如,谷歌搜索“virtual memory linux”,你应该得到大量关于虚拟内存和保留内存之间区别的信息。

【讨论】:

    【解决方案2】:

    虚拟内存在 64 位环境中几乎没有成本,所以我不确定问题是什么。常驻内存为 650 MB 或仅 MEM 的 1.3%。不清楚它是否占用了太多内存。

    默认的最大堆大小是 64 位 JVM 的主内存的 1/4。如果您有 48 GB 的内存,您可能会发现默认堆大小为 12 GB,并且对于一些共享库、线程等,这可能导致虚拟内存大小为 12.5 GB。这并不意味着您有内存泄漏,或者您甚至有问题,但如果您愿意,您可以减少最大堆大小。

    顺便说一句:您可以花不到 200 美元购买 32 GB。如果你的内存不足,我会再买一些。

    【讨论】:

    • 嗯,这不是要购买更多内存,而是要在客户端计算机上消耗太多内存。当我的应用程序安装在某人的机器上时,Jetty 消耗 12 GB 内存不是太多了吗? :)
    • 要明确的是,不是 jetty 占用了这个内存,但是无论发生什么部署到 jetty 中,jetty 本身的占用空间都很小
    • 您声明常驻内存为 650 MB。这是它使用的实际内存总量,包括共享内存和线程。 12 GB 是它可以使用的最大堆内存。
    • 您还可以看到 MEM 为 1.3%。这对我来说听起来并不过分。
    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 2019-04-18
    • 2018-10-11
    • 2012-09-04
    • 1970-01-01
    • 2020-12-10
    • 2015-01-13
    • 2016-07-25
    相关资源
    最近更新 更多