在 Debian 上运行 Tomcat 时“内存占用高”是一个常见问题,通常不是 Debian 本身造成的,而是 JVM、Tomcat 配置、应用代码或系统环境 共同导致的。下面按常见原因逐条说明,并给出排查与优化建议。
Tomcat 本质是 Java 进程,内存主要由 JVM 堆内存 决定。
top / htop 中 RES 很大(如 2G、4G)-Xms / -Xmx-Xms2g -Xmx4g
ps -ef | grep tomcat
jmap -heap <pid>
编辑 Tomcat 启动配置(Debian 常见位置):
/etc/default/tomcattomcat9
# 或
/opt/tomcat/bin/setenv.sh
示例:
JAVA_OPTS="-Xms512m -Xmx1024m"
Java 内存 ≠ 只有堆
jstat -gc <pid>
jstack <pid> | grep "java.lang.Thread" | wc -l
-XX:MaxMetaspaceSize=256m
-XX:ThreadStackSize=256k
jmap -histo:live <pid> | head
jvisualvmmat(Memory Analyzer)<Connector
maxThreads="500"
acceptCount="1000" />
→ 大量空闲线程也会占内存
maxThreads="200"
minSpareThreads="20"
systemd 显示的 memory 可能包括:
cat /proc/<pid>/status | grep VmRSS
| 原因 | 说明 |
|---|---|
| 日志级别过低 | DEBUG 大量对象 |
| 缓存框架 | Ehcache / Redis 客户端缓存 |
| 上传大文件 | 临时内存缓冲 |
| 定时任务 | 批量加载数据到内存 |
top 看 RESjmap -heap 看堆jstack 看线程数setenv.sh / JAVA_OPTS如果你愿意,可以贴出:
JAVA_OPTStop 内存截图或数值我可以帮你精准判断是哪一类内存高。