6

我有一个 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

谢谢!

4

2 回答 2

5

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

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

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

于 2013-01-25T12:44:51.507 回答
1

虚拟内存在 64 位环境中几乎没有成本,所以我不确定问题是什么。常驻内存为 650 MB 或仅 MEM 的 1.3%。目前尚不清楚它正在使用大量内存。

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

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

于 2013-01-23T22:20:04.003 回答