首先看一下GC的日志:
Java HotSpot(TM) 64-Bit Server VM (25.191-b12) for linux-amd64 JRE (1.8.0_191-b12), built on Oct 6 2018 05:43:09 by "java_re" with gcc 7.3.0
Memory: 4k page, physical 3881344k(841728k free), swap 16773116k(16463460k free)
CommandLine flags: -XX:InitialHeapSize=1073741824 -XX:MaxHeapSize=1073741824 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
1.249: [GC (Metadata GC Threshold) [PSYoungGen: 173036K->17342K(305664K)] 173036K->17358K(1005056K), 0.0219606 secs] [Times: user=0.02 sys=0.01, real=0.02 secs]
1.271: [Full GC (Metadata GC Threshold) [PSYoungGen: 17342K->0K(305664K)] [ParOldGen: 16K->16475K(699392K)] 17358K->16475K(1005056K), [Metaspace: 20736K->20736K(1067008K)], 0.0400390 secs] [Times: user=0.06 sys=0.01, real=0.04 secs]
2.995: [GC (Metadata GC Threshold) [PSYoungGen: 172146K->20960K(305664K)] 188622K->37436K(1005056K), 0.0296121 secs] [Times: user=0.05 sys=0.01, real=0.03 secs]
3.024: [Full GC (Metadata GC Threshold) [PSYoungGen: 20960K->0K(305664K)] [ParOldGen: 16475K->25311K(699392K)] 37436K->25311K(1005056K), [Metaspace: 33966K->33964K(1079296K)], 0.0789127 secs] [Times: user=0.14 sys=0.00, real=0.08 secs]
137.270: [GC (System.gc()) [PSYoungGen: 248285K->22330K(305664K)] 273596K->47649K(1005056K), 0.0246304 secs] [Times: user=0.03 sys=0.01, real=0.02 secs]
137.295: [Full GC (System.gc()) [PSYoungGen: 22330K->0K(305664K)] [ParOldGen: 25319K->34744K(699392K)] 47649K->34744K(1005056K), [Metaspace: 52953K->52953K(1097728K)], 0.1254259 secs] [Times: user=0.21 sys=0.01, real=0.13 secs]
项目频繁的GC,一方面Metaspace设置的-XX:MaxMetaspaceSize=500m太小,Metaspace的大小和加载类的数据有关系,加载的类越多metaspace占用的内存也就越大。通过修改JVM的-XX:SoftRefLRUPolicyMSPerMB值来解决metaspace上升问题。
参考:https://zhuanlan.zhihu.com/p/125503076
另一方面System.gc()
这个需要注意的是,这个明显的是程序中显式的调用gc才会引发垃圾回收,但是不好定位到底是哪个程序,这时候就需要打印出jvm的dump文件了,使用jstack pid 查出来服务崩溃前的线程堆栈。
2020-08-27 19:59:15.341 INFO 21209 --- [nio-8263-exec-7] c.o.f.g.f.controller.GateWayController : ===HZ Upload File Size=500065,File Name=file
2020-08-27 19:59:15.342 INFO 21209 --- [nio-8263-exec-7] c.o.f.g.f.controller.GateWayController : ===HZ Upload File Size=443810,File Name=file
2020-08-27 19:59:16.260 INFO 21209 --- [ Thread-7] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
2020-08-27 19:59:20.801 WARN 21209 --- [nio-8263-exec-7] s.w.m.s.StandardServletMultipartResolver : Failed to perform cleanup of multipart items
java.lang.NullPointerException: null
参照:https://www.jianshu.com/p/6a2f14067f50
https://www.cnblogs.com/cuizhiquan/p/11537678.html
https://blog.csdn.net/aorangtong0758/article/details/101112749
https://zhuanlan.zhihu.com/p/58851222
在此记录一下思路。