2011-02-05 36 views
1

我有一个基于Java的命令行服务器运行,它托管我在我的网站上制作的游戏的高分。它工作高效快速。但是,它占用了大约200MB的RAM!我曾尝试一切从手动归零了一切调用System.gc() Java游戏服务器占用太多内存!

我开始怀疑,这可能是与输入流和输出流对象,我从Socket连接使用。我注意到当我第一次运行程序时,它占用了正常数量的RAM。然后一旦获得连接,它就会跳到100MB,并且每个连接都会变得更高。

编辑:在我的班级之一,我认为所有的名字,成绩,并在3周不同的ArrayList时间戳。但是,使用jhat和jmap进行的彻底检查表明,它们仅使用大约5MB的RAM。

如果这太过于模糊,任何人都不能回答,请问我会很乐意给出源代码。

+2

如果您发现它随着每个连接而上升并且在客户端断开连接时不下降,那么您可能会保留对已关闭套接字的引用。 – ide 2011-02-05 04:15:43

+0

如果JVM与.NET类似,那么即使有没有引用它们的未使用对象,“强制”垃圾收集也不能保证实际收集任何东西。另外,200M是花生,当你可以购买300GB的24GB内存。这真的是一个问题吗? – 2011-02-05 04:42:29

+0

@ide它随着每个连接的增加而增加很多,然后随着它们的断开而下降一点,因为我试图在它们的生命结束之前手动将所有对象的每个引用归零。 – ra4king 2011-02-05 04:59:56

回答

3

由于保留对超出其使用寿命的对象的引用,可能会导致泄漏。

我建议你得到一个分析器并用它来调查。一个好的和免费的地方开始是与Java 6分发的VisualVM程序。

探查器是一个单独的程序,可以附加到JVM或为您的程序托管JVM并监视程序的执行。它可以跟踪对象分配和代码执行,无论是统计学还是通过“检测”执行代码。它会告诉你,如果对象被分配而不被释放,并且可以显示它们是什么对象以及它们被分配的位置(在许多其他有用的事情中)。

我使用jProfiler,这是商业(但很值得专业)。上次我搜索的时候,有几个质量好的分析器可以免费使用(至少是供个人使用)。 VisualVM具有基本但有用的性能分析功能,我将从那里开始(在Windows上,您可以在JDK bin目录中找到它;我认为Linux和Mac也是如此)。

0

尝试使用类似于jmap的内容,然后使用jhat查看您的内存实际上是如何使用的。 Sun的Oracle(Oracle)JVM永远不会将内存释放回操作系统,因此您看到内存使用量单调增加就不足为奇了。