限制Jetty上Solr的内存使用量

Rug*_*man 3 java memory solr jetty

我有一个内存有限的环境,我使用以下命令在Jetty上运行Solr:

java -jar -Xmx64M -Xmn32M -Xss512K start.jar

但是Solr实例(或Jetty)的总内存消耗似乎远高于我提供的堆限制.ps的输出是:

ps -u buradayiz -o rss,etime,pid,command

155164 01:37:40 21989 java -jar -Xmx64M -Xmn32M -Xss512K start.jar

如你所见,RSS超过150M.我该如何避免这种情况?我只是想在Solr/Jetty使用的内存比我让它们多的时候得到一个简单的OutOfMemory异常.

我知道我提供的堆限制与实际内存使用量之间可能存在差异,但差异因子为2(实际为2.5)对我来说似乎很多.我肯定错过了什么.

谢谢.

Whi*_*g34 5

有许多因素会导致堆规范之外的内存使用.

在你的情况下,主要的一个是永久性的一代.它用于加载运行应用程序所需的所有依赖项的类以及其他一些东西.由于必要的类,给定的应用程序没有太多的约束.您可能需要大约64M(可能更多)才能在Jetty上运行Solr.

您可以指定最大大小以防止永久生成为其他事物增长,例如添加-XX:MaxPermSize=64M到命令行.虽然它不太可能有所帮助,如果需要更多,它甚至可能会破坏它.通常它几乎都被您需要的类所使用.

堆之外的内存使用的另一个贡献因素是每个线程的堆栈大小.你的案例中的每个线程将消耗512K.您可以安全地指定256K,尽管您可能没有足够的线程运行太重要.