3

我已经在这个网站上搜索并阅读了许多关于限制 Java 应用程序内存的帖子。我知道不建议这样做,但如果我真的需要限制我的应用程序使用的最大 RAM。我该怎么做?

我目前的申请取自Oracle tutorial网站。Knock Knock Server我保持服务器运行,不断从客户端向服务器发送消息,并使用Task Manager. 我注意到每次发送消息时内存都在增加。我也了解了System.gc();andRuntime.gc();我希望它可以减少内存消耗,不幸的是它没有。正如预期的那样。

ServerSocket serverSocket = new ServerSocket(portNumber);
Socket clientSocket = serverSocket.accept();
PrintWriter out =
new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));

这些命令中的任何一个都可以使用该gc()命令吗?我还尝试了-Xmx-Xms希望它也能正常工作。

最后,如果创建一个简单的 java 服务器不是一个好主意。我该怎么办?

编辑:我正在使用-Xms9mand -Xmx10m。我希望让应用程序以 10MB 运行,但在它首次启动时。它可以从 14MB 到 17MB,从那里它可以继续增加超过 20MB。

4

3 回答 3

1

如果要限制 jvm 的内存(而不是堆大小) ulimit -v

要了解 jvm 和堆内存之间的区别,请查看这篇出色的文章进一步了解 Java 进程的大小调整

NativeHeap 可以通过 -XX:MaxDirectMemorySize=256M 增加或减少(默认为 128)

另一个有趣的读物: Java 性能调优

于 2013-11-07T10:17:57.867 回答
0

@Melvin Lai:确保你做 M 而不是 MB。这回答了我的问题并且运作良好。

于 2013-11-07T12:31:02.883 回答
0

首先,不要通过任务管理器监控 VM 内存使用情况。使用 GC 日志记录来获取 VM 的确切内存使用情况。如果您在 GC 日志中看到任何内存消耗的增加,那么您就有问题了。

其次,确保您正确地重用了 Socket/Connection。不关闭连接可能是内存增加的原因 - 如果有的话。

于 2013-11-07T21:41:43.427 回答