试图将内存限制为应用程序

时间:2013-11-07 10:11:17

标签: java memory-management garbage-collection java-server

我搜索并阅读了很多关于限制本网站上java应用程序记忆的帖子。我知道不推荐,但如果我真的需要限制我的应用程序使用的最大RAM。我该怎么办?

我目前的申请来自Oracle tutorial网站。 Knock Knock Server我保持服务器运行,不断从客户端向服务器发送消息,并使用Task Manager监视内存使用情况。我注意到每次发送消息时内存都会不断增加。 我也了解了System.gc();Runtime.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服务器不是一个好主意。我该怎么办?

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

3 个答案:

答案 0 :(得分:1)

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

要了解jvm和堆内存之间的区别,请看一下这篇优秀文章Taking a Closer Look at Sizing the Java Process

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

另一个有趣的读物: Java Performance Tuning

答案 1 :(得分:0)

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

答案 2 :(得分:0)

首先,不监控任务管理器的虚拟机内存使用情况。使用GC日志记录可以获得VM的确切内存使用情况。 如果您在GC日志中看到内存消耗增加,则表示您遇到问题。

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