假设我正在使用 -Xms256m -Xmx1024m 运行 tomcat,但想增加我的堆使用量。
我可以分配的最大安全堆大小是多少?
就这个问题而言,请假设系统有 5GB RAM 并且是 z/Linux 系统。但是,如果可能的话,我希望得到一个更广泛的经验法则答案。
另外,如果这是重复的,抱歉。我很惊讶我没有找到有关此类事情的更多信息。
不重复:我在看这里但是,他的回答似乎只是猜测,没有备份。该问题中的其他答案不是很清楚和/或针对我的问题。1) 我不是在 Windows 32 位系统上,2) 我不是在问 PermGen,尽管它可能在一个好的答案中提到,3) 第三个答案确实说“最后,您还必须考虑服务器上正在运行的其他东西,它们也需要 RAM”,但这不是一个精确的答案。我现在只是担心操作系统对内存的使用。
编辑: 这是专用系统,所以我最担心的是操作系统内存使用情况。我不担心其他程序。
GC
答案1
您要分配的最大堆大小将取决于系统对自身资源的利用率、您正在运行的其他服务等。您需要分配一个堆大小,以便为操作系统留出足够的内存,以防止不必要的内存分页。这在 Windows 中是一个更大的问题,但在 Linux 中也会出现这个问题(我更擅长 Windows 而不是 Linux,对此深表歉意)。
首先,您需要检查系统的资源利用率:http://www.cyberciti.biz/faq/linux-check-memory-usage/
接下来,您要查看页面文件的配置方式:http://www.cyberciti.biz/faq/linux-check-the-size-of-pagesize/
然后,您将必须根据之前收集的信息尝试不同的配置,并观察页面文件的利用率:http://www.cyberciti.biz/faq/linux-check-swap-usage-command/
如果您的页面文件使用率很高,则表明您的堆大小太大。如果堆使用率很低或根本没有使用,您可以尝试增加堆大小来提高性能(实际性能结果会因不同的 Java 应用程序而异,并且由于编程方式的原因,增加堆大小可能会使某些应用程序的性能变差)。
您需要确保分配了适当的内存量,以便您的操作系统有足够的可用 RAM 来轻松维护页面文件,并且您的应用程序有足够的内存分配给它。在 Windows 中,我尝试在负载下保持至少 25% 的可用 RAM。我会尝试不同的配置并观察您的系统性能。
不过还有一个重要注意事项:在 Java 8 中,您根本不需要定义这些项目,Java 8 似乎更擅长自行维护这些值,而不是静态分配它们。