关于 play 框架的内存使用的简单问题。 我有一个生产实例,它似乎使用了 680768 kB 的内存。其中大部分位于交换中。
(虚拟)服务器大约有 750 MB,但也运行 MySQL 服务器和 12 个 Apache 虚拟服务器。有时会在短时间内暂时没有回应(或非常缓慢)。 我想这是因为交换(不是 CPU)。
框架需要那么多内存吗?
我可以通过 JVM 参数 -Xmx256m
左右来限制内存使用,但是要输入什么值,它使用这么多内存的原因是什么?
这是 Play 的用法!开始前后:
Java: ~~~~~ Version: 1.6.0_26 Home: /usr/lib/jvm/java-6-sun-1.6.0.26/jre Max memory: 194641920 Free memory: 11813896 Total memory: 30588928 Available processors: 2
After restart: Java: ~~~~~ Version: 1.6.0_26 Home: /usr/lib/jvm/java-6-sun-1.6.0.26/jre Max memory: 194641920 Free memory: 9893688 Total memory: 21946368 Available processors: 2
最佳答案
我假设您报告的 680768 kB 内存来自 ps 或任务管理器等操作系统工具。 JVM 使用的内存总量不会导致应用程序暂时卡住。暂停的可能原因是 JVM 垃圾收集器正在运行完整 GC,这将暂停 JVM 中正在运行完整 GC 的所有线程(除非您配置了并发 gc)。
您应该使用 -verbosegc -XX:+PrintGCDetails 运行运行 playframework 的 JVM 以查看 GC 正在做什么。
您的问题“Play Framework 需要那么多内存吗”无法回答,因为使用的内存量取决于您的应用程序在预先请求的基础上执行的操作。 JVM 也会让堆耗尽,然后执行 GC 循环来清理堆。表现良好的 JVM 应用程序应该在 GC 图上显示锯齿模式。
如果您使用的是热点虚拟机,我不知道您使用的是哪个 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 如何管理内存。
关于java - Playframework 的内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9251994/