我有一个 VPS,装有 ubuntu 18.04.4,2gb 和 512mb 交换空间。经常使用 600-800mb 和 100mb 交换空间,一切正常。
2 周前我更新了 WAR(tomcat),内存跃升至 1.2gb,交换空间为 400-500mb。起初我以为这是正常的,因为我确实更改了一些应该会消耗更多内存的东西。
我需要重启服务器(出于其他原因)。直到那时我才意识到内存又降到了 600-800mb,交换空间为 300mb,这种情况持续了一段时间。这意味着之前有什么东西占用了内存,重启后就释放了。
两周后,内存消耗保持不变,我更新了 WAR,再次注意到重新部署后,内存跃升至 1.2gb,交换空间为 400mb。这次我只重新启动了 tomcat 服务,内存消耗降至 600mb,交换空间为 100mb。
htop 显示 Java 是消耗内存的程序,但是我如何才能知道在取消部署/部署后究竟是什么占用了内存,只有重新启动服务才能释放它?
谢谢
答案1
https://www.linuxatemyram.com/
操作系统使用所有可用内存,甚至少量使用交换空间,都是正常的。
不要花太多精力将其强制恢复到 50% 以下。那只是会再次使用。当利用率徘徊在听起来不错的 60% 时,不太可能会有什么值得担心的事情。例如,如果需要其他内存,应用程序文件的任何副本的任何文件系统缓存都会很快被回收。
相反,要注意应用程序本身是否运行缓慢。设置目标用户响应时间或类似时间,并监控如何实现服务目标。用户体验比您认为的内存利用率更重要。
对于操作系统内存指标,在 Linux 上观察页面进出费率内存不足的系统将执行大量页面加载,因为它需要将内存移回以继续工作。这会导致系统运行缓慢,因为交换空间比 DRAM 慢得多。
显然,内存完全耗尽是一件很糟糕的事情,可能会导致 OOM 终止或恐慌。但这发生在接近 0 页可用时。您没有显示严重内存压力的证据。
Java 有自己的内存调优方法,包括堆度量收集、调优和避免垃圾收集暂停。这个问题留到下次再回答,也许在您研究了此应用程序的堆模式并估算出此 2 GB 实例上实际有多少内存预算之后再回答。