我们正在使用 Red Hat Enterprise Linux Server 7.4 (Maipo) 和 tomcat 8.5.30。访问网站时,java 进程的进程数迅速增加,达到最大用户进程限制的程度,并且我们收到 fork: 资源暂时不可用错误
另一个问题是,进程数的增加并没有随着时间的推移而减少,而是不断增加。以下是 tomcat 的 systemd 服务文件
# Systemd unit file for tomcat
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target
[Service]
Type=forking
LimitNOFILE=65535
Environment=JAVA_HOME=/usr/java/jdk1.8.0_161/jre
Environment=CATALINA_PID=/u01/tomcat-lb1/temp/tomcat.pid
Environment=CATALINA_HOME=/u01/tomcat
Environment=CATALINA_BASE=/u01/tomcat-lb1
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom -Dconnector.ip=10.40.5.22 -Dconnector.port=901'
ExecStart=/u01/tomcat/bin/startup.sh
ExecStop=/bin/kill -15 $MAINPID
User=ipMonitor
Group=kcAlerts
UMask=0007
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
答案1
看起来你的 Tomcat 服务器的有效负载代码可能存在线程泄漏。
线程泄漏是一种资源泄漏:如果对线程对象的引用没有被正确释放,旧的执行线程可能不会被垃圾收集。
您(或您的应用程序开发人员)还应确保正确处理所有异常,并在线程关闭之前正确释放临时线程中使用的任何资源(连接、文件等),以避免线程泄漏。
向进程发送 SIGQUIT 信号java
将导致其生成线程转储到标准输出:其所有执行线程的完整列表以及每个线程当前正在执行的操作。向应用程序开发人员提供线程转储应该有助于开发人员确定哪些线程未得到正确清理,并有望解决根本原因。
java---1896*[{java}]
这里输出中的{花括号}pstree
表示子线程,而不是大量同名的子进程。