应用程序内存泄漏问题排查
1.文章的由来;
在日常运维过程中,会遇到服务器资源居高不下,或者CPU内存暴涨问题而引发的oom导致服务不可用 (大多数程序都是java应用),由此编写了该文章,为工作排查问题参考依据和快速定位问题方法;
2.基础知识储备;
(1).jvm 配置常见参数:
堆参数参数
参数 |
描述 |
-Xms | 设置 JVM启动时堆内存的初始化大小 |
-Xmx | 设置堆内存最大值 |
-Xmn | 设置年轻代的空间大小,剩下的为年老代的空间大小 |
-XX:PermGen | 设置永久代的内存初始化大小(JDK1.8 开始废弃永久代) |
-XX:MaxPermGen | 设置永久代的最大值 |
-XX:SurvivorRatio | 设置Eden区和Survivor区的空间比例:Eden/S0 =Eden/S1 默认8 |
-XX:NewRatio | 设置年老代和年轻代的比例大小,默认值是2 |
回收器参数
-XX:+UseSerialGC |
串行,young (年轻区)和Old(老年区)都使用串行,使用复制算法回收,逻辑简单高效,无现场切换开销 |
-XX:+UseParallelGC | 并行 young (年轻区)使用 Parallel scavenge 回收算法,会产生多个线程并行回收。通过-XX:ParallelGCThreads=n 参数指定有线程数,默认为cpu核数,Old(老年区):单线程 |
如上表所示,目前主要有串行、并行和并发三种,对于大内存的应用而言,串行的性能太低,因此使用到的主要是并行和并发两种。并行和并发 GC 的策略通过 UseParallelGC 和 UseConcMarkSweepGC 来指定,还有一些细节的配置参数用来配置策略的执行方式。例如:XX:ParallelGCThreads, XX:CMSInitiatingOccupancyFraction 等。 通常:Young 区对象回收只可选择并行(耗时间),Old 区选择并发(耗 CPU)。