如何为 tomcat 应用程序增加 Java 堆空间
Posted
技术标签:
【中文标题】如何为 tomcat 应用程序增加 Java 堆空间【英文标题】:How to increase Java heap space for a tomcat app 【发布时间】:2011-02-12 17:03:36 【问题描述】:有很多问题会问这个或类似的问题。
他们都给出了必须执行的命令,我不明白我在哪里写这个命令。我想永久增加我的 tomcat 应用程序的堆空间。
我读了这个页面http://javahowto.blogspot.com/2006/06/6-common-errors-in-setting-java-heap.html,它在Tomcat部分下写着
停止Tomcat服务器,设置环境变量CATALINA_OPTS,然后重启Tomcat。查看文件 tomcat-install/bin/catalina.sh 或 catalina.bat 了解如何使用此变量。例如,
设置 CATALINA_OPTS=-Xms512m -Xmx512m(Windows,值周围没有“”) export CATALINA_OPTS="-Xms512m -Xmx512m" (ksh/bash, "" 围绕值) setenv CATALINA_OPTS "-Xms512m -Xmx512m" (tcsh/csh, "" 围绕值)
所以我换了行
设置 CATALINA_OPTS=
与
设置 CATALINA_OPTS=-Xms512m -Xmx512m
但我仍然得到错误。
javax.servlet.ServletException: Servlet 执行抛出异常
根本原因
java.lang.OutOfMemoryError:Java 堆空间 java.lang.reflect.Array.multiNewArray(本机方法) java.lang.reflect.Array.newInstance(Array.java:90) nom.tam.util.ArrayFuncs.newInstance(ArrayFuncs.java:1028) nom.tam.fits.ImageData.read(ImageData.java:259) nom.tam.fits.Fits.readHDU(Fits.java:573) controller.UploadServlet.retreiveFITSFileFields(UploadServlet.java:206) 控制器.ScanServerFiles.doPost(ScanServerFiles.java:39) javax.servlet.http.HttpServlet.service(HttpServlet.java:637) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
【问题讨论】:
@laz - 我已经添加了堆栈跟踪 【参考方案1】:最简单的做法是:(在 Linux/Ububuntu 等)
进入tomcat bin目录:
cd /opt/tomcat8.5/bin
在 bin 目录 "setenv.sh" 下创建新文件,并将以下提及的条目保存在其中。
export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx2048m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxPermSize=256m"
并发出命令:
./catalina.sh run
在您的 catalina 日志文件中,您可以看到如下条目:
INFO [main] VersionLoggerListener.log Command line argument: -Xms512m
INFO [main] VersionLoggerListener.log Command line argument: -Xmx2048m
INFO [main] VersionLoggerListener.log Command line argument: -XX:MaxPermSize=256m
这证实发生了上述变化。
另外,“Xms512m”和“-Xmx2048m”的值可以在setenv.sh文件中进行相应的修改。
tomcat 的启动也可以分两步完成。 cd /opt/tomcat8.5/bin
Step #1
run ./setenv.sh
Step #2
./startup.sh
如果您使用的是 systemd 编辑:
/usr/lib/systemd/system/tomcat8.service
并设置
Environment=CATALINA_OPTS="-Xms512M -Xmx2048M -XX:MaxPermSize=256m"
【讨论】:
【参考方案2】:对于 Windows 服务,您需要根据您的 tomcat 版本运行 tomcat9w.exe(或 6w/7w/8w)。 首先,确保 Tomcat 已停止。然后双击tomcat9w.exe。导航到 Java 选项卡。如果您知道您有 64 位 Windows、64 位 Java 和 64 位 Tomcat,那么请随意将内存设置为高于 512。您需要进行一些任务管理器监控以确定将其设置多高。对于 2019 年开发的大多数应用程序...我建议初始内存池为 1024,最大内存池为 2048。当然,如果您的计算机有大量 RAM...请随意调高。 另外,请参阅此答案:How to increase Maximum Memory Pool Size? Apache Tomcat 9
【讨论】:
【参考方案3】:只需在catalina.bat
文件中设置这一额外的行
绕行:143
set "CATALINA_OPTS=-Xms512m -Xmx512m"
并重启Tomcat服务
【讨论】:
【参考方案4】:您需要在catalina.sh
文件中添加以下行。
export CATALINA_OPTS="-Xms512M -Xmx1024M"
更新:catalina.sh
内容清楚地表明 -
不要在此脚本中设置变量。而是将它们放入 CATALINA_BASE/bin 中的脚本 setenv.sh 中,以保持您的自定义独立。
因此您可以在 setenv.sh 中添加上述内容(如果文件不存在,则创建一个文件)。
【讨论】:
建议你把它放在一个单独的文件中:bin/setenv.sh +1 将其放入 setenv.sh,例如在 ubuntu 上,您可能有 /usr/share/tomcat7/bin/catalina.sh,您可以将 CATALINA_OPTS 的单行放入/usr/share/tomcat7/bin/setenv.sh【参考方案5】:您可以在 catalina.sh 中将其设置为 CATALINA_OPTS=-Xms512m -Xmx512m
打开你的 tomcat-dir/bin/catalina.sh 文件并在任何地方添加以下行 -
CATALINA_OPTS="$CATALINA_OPTS -Xms1024m -Xmx3024m"
然后重启你的tomcat
【讨论】:
【参考方案6】:如果您使用的是 Windows,则非常简单。只需转到系统环境变量(右键单击计算机 > 属性 > 高级系统参数 > 环境变量);创建一个名称 = CATALINA_OPTS 且值 = -Xms512m -Xmx1024m 的新系统变量。重启 Tomcat 即可享受!
【讨论】:
【参考方案7】: 在 Eclipse 中打开服务器选项卡 右键打开 点击打开lauch配置 转到参数这里你可以在认可后添加VM参数
-Xms64m -Xmx256m
【讨论】:
【参考方案8】:有一种机制可以在不修改分发中的任何文件的情况下执行此操作。您可以创建一个单独的文件 %CATALINA_HOME%\bin\setenv.bat
或 $CATALINA_HOME/bin/setenv.sh
并将您的环境变量放在那里。此外,内存设置适用于 JVM,而不是 Tomcat,因此我将设置 JAVA_OPTS
变量:
set JAVA_OPTS=-Xmx512m
【讨论】:
我无法在 tomcat8 的 bin 文件夹中找到 setenv.bat 文件【参考方案9】:您的更改可能会奏效。您的应用程序是否需要大量内存 - 堆栈跟踪显示了一些与图像相关的功能。
我猜这个错误要么立即发生,有一个大文件,要么在几个请求之后发生。
如果错误立即发生,那么您可以进一步增加内存,或者调查找出为什么一个文件需要这么多内存。
如果错误发生在多个请求之后,那么您可能会发生内存泄漏 - 垃圾收集器没有回收对象。使用像 JProfiler 这样的工具 可以帮助您监控 VM 正在使用多少内存,并可以帮助您查看正在使用该内存的内容以及垃圾收集器未回收对象的原因。
【讨论】:
这个答案实际上并没有回答 OP 关于 如何 增加 Tomcat 应用程序的 java 堆空间的问题?【参考方案10】:首先,您不能仅更改 tomcat 应用程序的内存设置,而是更改所有 tomcat 实例的内存设置。
如果您从控制台运行tomcat(使用startup.bat),您需要编辑catalina.bat 并使用CATALINA_OPTS。例如:
set CATALINA_OPTS=-Xms512m -Xmx512m
重新启动 tomcat 将应用新设置。
如果您仍然收到 OutOfMemoryError,您需要知道您的应用程序在特定时刻需要多少内存 (nom.tam.util.ArrayFuncs...)。您要么必须优化应用程序,要么只是增加提供给 tomcat 的内存。
【讨论】:
我在 Windows 上运行 tomcat,我只是抓取 tomcat 文件并解压缩它们。我没有安装任何服务。以上是关于如何为 tomcat 应用程序增加 Java 堆空间的主要内容,如果未能解决你的问题,请参考以下文章
如何为我在 Java 上编写的硒测试增加 travis-ci 的超时时间?
如何为启动应用程序的 java 命令提供参数 -Xshare:off
如何为 NetBeans 设置 Tomcat 管理器应用程序用户名和密码?
如何为 Elastic Beanstalk 的 Tomcat 实例提供自定义日志附加程序?