【发布时间】:2020-12-07 18:39:09
【问题描述】:
我正在监控一个长时间运行的java进程,该进程使用G1垃圾收集器。
这些是我的 java 选项(在服务器模式下运行):
-Xmx2048m -XX:+UseG1GC -XX:+UseStringDeduplication -XX:G1HeapRegionSize=32M -XX:MetaspaceSize=100m -XX:CompressedClassSpaceSize=400m
该进程是一个 java websocket 服务器,它涉及大量 I/O,并在其前面嵌入了 tomcat。
根据 java 任务控制,顶部堆使用量达到 1.7GB,并且在每个 GC 周期后它会减少到 ~900MB。
该进程在具有 3.8GB 内存限制的 docker 容器中运行。
使用top -o %MEM 时,显示总 RES 为 2.6GB,永远不会更多。
我注意到在大量 websocket 连接/断开连接后,该过程变得非常缓慢且无响应。
当我尝试在 6-7 小时后再次加载此进程时,当它处于空闲状态且连接“干净”时,它会在 6-7 秒后响应,而在第一次加载时,响应时间要低得多 ~2-3 秒.
我认为它与文件描述符有关,但在检查时:
ls /proc/1/fd | wc -l
从 docker 内部,它显示所有已释放的文件描述符。
java 版本:8u131 tomcat 版本:8.5.60
这是我的堆在加载 6 小时且服务器上没有连接后的样子: 这是来自江铃:
我该如何进一步调查?
【问题讨论】:
标签: java performance memory jvm file-descriptor