Java Game Server占用了太多内存!

时间:2011-02-05 04:11:55

标签: java java-server

我有一个基于Java的命令行服务器运行,托管我在我的网站上制作的游戏的高分。它工作效率高,速度快。但是,它需要大约200MB的RAM!我已经尝试了从手动将所有内容归零到调用System.gc()的所有内容

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

编辑:在我的一个课程中,我在3个不同的ArrayLists中保存所有名称,分数和时间戳。然而,使用jhat和jmap的彻底检查显示,他们只使用大约5MB的RAM。

如果这对任何人来说都太模糊了,请问,我很乐意提供源代码。

2 个答案:

答案 0 :(得分:3)

您可能因超出使用寿命而保留对象的引用而导致泄漏。

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

分析器是一个单独的程序,可以附加到JVM或为程序托管JVM并监视程序的执行。它可以统计地或通过“检测”执行代码来跟踪对象分配和代码执行。它将向您显示是否正在分配和未释放对象,并且可以显示它们是什么对象以及分配它们的位置(以及许多其他有用的东西)。

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

答案 1 :(得分:0)

尝试使用jmap和jhat之类的内容来查看你的内存实际使用情况。

Sun的(甲骨文)JVM永远不会将内存释放回操作系统,所以你看到内存使用量单调增加并不奇怪。