关于play框架的内存使用情况的一个简单问题。 我有一个生产实例,它似乎使用了680768 kB的内存。其中大部分位于交换中。
(虚拟)服务器大约有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 :(得分:6)
我假设您报告的680768 kB内存来自ps或任务管理器等操作系统工具。 JVM使用的内存总量不会导致应用程序暂时冻结。暂停的可能原因是JVM Garbage收集器正在运行一个完整的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/可能是关于这个主题的好书
您可以使用的热点JVM附带的一些免费工具包括jconsole和jvisualvm。 jvisualvm有一个很好的插件叫做VisualGC,非常适合学习热点vm如何管理内存。
答案 1 :(得分:5)
这取决于很多东西,但是java需要一些内存用于本机分配,堆和非堆内存空间。
播放状态表示您的堆仅消耗30588928个字节,但在启动时,java为堆分配194641920。您可以尝试从-Xmx64M开始以限制堆分配。
然后你可以保存大约128 Mo的RAM但是,java也为jvm分配了内存,所以这个过程的占用空间将超过64 Mo,这取决于你的平台但它至少会是200/250 Mo
尝试将堆限制为64Mo,但750 Mo可能不足以运行jvm和mysql。
请记住,您不能使用swap与java,因为内存分配在一个块中,因此您可以交换/交换整个堆。