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)对我来说似乎很多.我肯定错过了什么.
谢谢.
有许多因素会导致堆规范之外的内存使用.
在你的情况下,主要的一个是永久性的一代.它用于加载运行应用程序所需的所有依赖项的类以及其他一些东西.由于必要的类,给定的应用程序没有太多的约束.您可能需要大约64M(可能更多)才能在Jetty上运行Solr.
您可以指定最大大小以防止永久生成为其他事物增长,例如添加-XX:MaxPermSize=64M到命令行.虽然它不太可能有所帮助,如果需要更多,它甚至可能会破坏它.通常它几乎都被您需要的类所使用.
堆之外的内存使用的另一个贡献因素是每个线程的堆栈大小.你的案例中的每个线程将消耗512K.您可以安全地指定256K,尽管您可能没有足够的线程运行太重要.