Tomcat项目部署spring mvc项目,压测出现的问题
项目部署:docker部署时候设置的内存是80G,JVM堆内存的初始堆和最大堆设置的内存都是64G
1、压测的时候,并发1000,循环1次
日志显示:堆内存溢出
2、排查出现堆内存溢出的原因
执行命令
1.1、查看系统整体的内存使用情况
free -h
结果:
可以看出内存总80G,使用62G,使用率还是78%
1.2、查看运行内存的进程id
ps -ef|grep tomcat
1.3、查看堆内存的使用情况(假设pid是1234)
jmap -heap 1234
结果:
可以看新生代和老年代的使用率挺高的。
3、如果出现堆溢出
Java 堆溢出(Heap Overflow)通常是由于应用程序中创建了过多的对象,导致堆内存不足而触发的错误。以下是一些解决 Java 堆溢出的常见方法:
1、增加堆内存大小:可以通过调整 JVM 的启动参数,增加堆内存的大小,例如通过 -Xms 和 -Xmx 参数来设置初始堆大小和最大堆大小。增加堆内存大小可以提供更多的内存空间,减少堆溢出的可能性。
2、优化代码:检查应用程序的代码,避免创建过多的临时对象或者不必要的对象。优化代码结构和算法,减少对象的创建和销毁次数,以降低堆内存的使用量。
3、检查内存泄漏:定期检查应用程序中是否存在内存泄漏问题,即未释放不再使用的对象导致内存占用过高。可以使用内存分析工具(如 Eclipse Memory Analyzer)来检测和解决内存泄漏问题。
4、使用对象池:考虑使用对象池技术,将对象缓存在池中,避免频繁地创建和销毁对象,减少堆内存的压力。
5、分析堆内存使用情况:通过监控和分析堆内存的使用情况,可以了解哪些对象占用了大量内存,从而有针对性地进行优化和调整。
6、升级 JVM 版本:在某些情况下,升级 JVM 到最新版本可以解决一些堆溢出问题,因为新版本的 JVM 在内存管理方面可能有一些改进和优化。
7、手动清理堆
1234是pid
jcmd 1234 GC.run