Java 了解Jetty的内存使用情况

Java 了解Jetty的内存使用情况,java,memory,jetty,Java,Memory,Jetty,我有一个Jetty服务器,用于我正在开发的应用程序的websocket连接。唯一的问题是Jetty消耗了太多的虚拟内存(!2.5GB的虚拟内存)和大约650RES 我的问题是,如上所述,大部分内存(约12gb)不是堆大小,因此分析它并了解发生了什么比较困难 关于如何理解12gb的消耗来自何处,以及如何找出内存泄漏或服务器的任何其他问题,您有什么建议吗 我想明确我所说的虚拟内存(因为我的理解可能是错误的)。当我运行top时,虚拟内存是“VIRT”。以下是我得到的: PID USER PR NI

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

我的问题是,如上所述,大部分内存(约12gb)不是堆大小,因此分析它并了解发生了什么比较困难

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

我想明确我所说的虚拟内存(因为我的理解可能是错误的)。当我运行top时,虚拟内存是“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

谢谢

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

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


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

请粘贴启动时使用的JVM选项。您可以使用前面提到的-Xmx选项调整JVM使用的最大内存

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


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

Joakim,我使用的是8.1.7.V20120910检查长totalMemory=Runtime.getRuntime().totalMemory()的内存消耗;long freemory=Runtime.getRuntime().freemory();返回(totalMemory-freeMemory);JVM将获取您给它的任何内存。如果您指定了一个大的
-Xmx
值,那么您将看到分配的内存。如果你没有指定那么大的堆,那么是时候查看pmap来查看内存的去向了。使用探查器并查看一下上面添加的更多详细信息,让我知道这是否为你提供了更多信息。guysWell,这不是购买更多内存,而是在客户端机器上消耗了太多内存。当我的应用程序安装在某人的机器上时,Jetty消耗12GB内存不是太多了吗很明显,jetty并没有占用这个内存,但是不管发生什么事情部署到jetty中,jetty本身都有一个很小的内存占用空间—您声明驻留内存是650 MB。这是它实际使用的内存总量,包括共享内存和线程。12GB是它可以使用的最大堆内存。您还可以看到MEM为1.3%。对我来说这听起来不算太多。