2012-02-12 212 views
9

只是关于Play框架的内存使用情况的一个简短问题。 我有一个生产实例,它似乎使用680768 kB的内存。它大部分位于交换区。Playframework的内存使用情况

(虚拟)服务器大约有750 MB,但也运行MySQL服务器和12个Apache虚拟服务器。有时在短时间内变成暂时无应答(或非常缓慢)。 我想这是因为交换(它不是CPU)。

该框架是否需要那么多内存? 我可以通过JVM参数-Xmx256m左右限制内存使用量,但是要放入什么值,以及它使用如此多内存的原因是什么?

这是Play的用法!之前和开始后:

的Java:~~~~~版本:1.6.0_26主页: /usr/lib/jvm/java-6-sun-1.6.0.26/jre 最大内存:194641920免费 内存:11813896 总内存:30588928个 个可用的处理器:2

重启后:Java的:~~~~~版本:1.6.0_26主页: /usr/lib/jvm/java-6-sun-1.6 .0.26/jre 最大内存:194641920免费 内存:9893688 总内存:21946368 可用处理器:2

+0

回答这样的问题是极其困难的。这取决于很多因素(复杂性,缓存等) - 玩!鼓励一种无状态设计,这样内存利用率似乎有点高(尽管对于Java来说并不奇怪)。您是否尝试重新启动服务器并查看内存占用是否降低?此外,内存转储可能会给您提示分配内存的提示。 – 2012-02-12 19:46:20

+0

您可以发送播放状态给您的内存输出(在状态开始时)。就我而言,我正在使用-Xmx64Mo运行应用程序,没有任何问题。如果你需要更多的内存,你的代码中可能会有一些内存泄漏 – 2012-02-13 08:56:05

+0

我会将其添加到问题中。活动内存中只有71 MB的当前665 MB(顶部)。 665似乎是一个足够稳定的数字。玩过反击之后!应用程序(和至少一个请求)顶部报告的内存是524米。 (把Play!在问题中报告的内存使用情况) – 2012-02-13 14:36:38

回答

5

它取决于很多东西,但是是java需要一些内存用于本机分配,堆和非堆内存空间。

播放状态表示您的堆只消耗30588928字节,但在启动时为java分配堆194641920。您可以尝试从-Xmx64M开始限制堆分配。

然后你可以节约大约128M的内存,但是,java也为jvm分配内存,所以这个进程的占用空间将超过64Mo,这取决于你的平台,但它至少是200/250 Mo.

尝试将你的堆限制为64Mo,但750Mo可能不足以运行jvm和mysql。

请记住,您不能与java交换,因为内存分配在一个块中,因此您可以交换/交换整个堆。

+0

对不起,由于反应缓慢,我没有机会设置适当的测试来查看差异。什么是最好的,甚至是正义的方式来运行Play!与-Xmx64M? – 2012-02-25 17:17:08

+4

在您的application.conf文件中,添加一行“jvm.memory = -Xmx64M” – 2012-02-27 09:11:26

+0

我这样做了,而且看到了一个下降。 最大内存:249364480 可用内存:20543688 总内存:59219968个 个可用的处理器:2 顶部给出: 最大内存:(的Virt)627米(残)185米 变更后本次变动前64880640 可用内存:2793576 总内存:53366784个 个可用的处理器:2 顶给了(灰尘)470米(RES)199米 所以会采取-Xmx64M是把在不损害框架正确的价值?这对我来说有点不清楚究竟是什么原因以这种或那种方式来做(我知道我应该阅读!) – 2012-03-05 14:31:45

6

我假设您正在报告的680768 kB内存来自像ps或任务管理器这样的OS工具。 JVM使用的内存总量不会导致应用程序暂时冻结。暂停的可能原因是JVM垃圾收集器正在运行一个完整的GC,它将暂停整个GC正在运行的JVM中的所有线程(除非已配置并发gc)。

您应该使用-verbosegc -XX:+ PrintGCDetails运行运行playframework的JVM以查看GC正在执行的操作。

您的问题“Play Framework是否需要大量内存”无法回答,因为所使用的内存量取决于应用程序在预先请求的基础上所做的操作。此外,JVM会让堆运行,然后执行GC周期来清理堆。一个表现良好的JVM应用程序应该在GC图上显示锯齿图案。

如果您正在使用热点VM,则不知道您使用的是哪个JVM,请阅读JVM调整指南。 http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html在阅读本指南的JVM优化指南以了解之前,您通常需要了解以下GC概念。

  • 标记和清扫垃圾收集
  • 马克,扫描和紧凑型垃圾收集
  • 复制收集
  • 代垃圾回收
  • 并行垃圾收集
  • 并发垃圾回收

http://www.amazon.com/Garbage-Collection-Handbook-Management-Algorithms/dp/1420082795/是亲在这个问题上可以成为一本好书

一些免费的工具,可以使用包含jconsole和jvisualvm的热点JVM。 jvisualvm有一个叫VisualGC的好插件,它非常适合学习热点虚拟机如何管理内存。