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