1. Q:为什么Full GC的次数越来越多?
A:因此内存的积累,逐渐耗尽了年老代的内存,导致新对象分配没有更多的空间,从而导致频繁的垃圾回收
2 .Q:为什么年老代占用的内存越来越大?
A:因为年轻代的内存无法被回收,越来越多地被Copy到年老代
3. Q:为什么崩溃前垃圾回收的时间越来越长?
A:根据内存模型和垃圾回收算法,垃圾回收分两部分:内存标记、清除(复制),
标记部分只要内存大小固定时间是不变的,变的是复制部分,
因为每次垃圾回收都有一些回收不掉的内存,所以增加了复制量,
导致时间延长。所以,垃圾回收的时间也可以作为判断内存泄漏的依据
通过-Xms -Xmx限定其最小、最大值(JVM性能调优 - 每天进步一点点! - ITeye博客)
为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,我们通常把最大、最小设置为相同的值
请看一下一个时间的Java参数配置:(服务器:Linux 64Bit,8Core×16G) JAVA_OPTS="$JAVA_OPTS -server -Xms3G -Xmx3G -Xss256k -XX:PermSize=128m -XX:MaxPermSize=128m -XX:+UseParallelOldGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/aaa/dump -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/usr/aaa/dump/heap_trace.txt -XX:NewSize=1G -XX:MaxNewSize=1G" 经过观察该配置非常稳定,每次普通GC的时间在10ms左右,Full GC基本不发生,或隔很长很长的时间才发生一次
JVM监控
- JVM堆内存监控
- GC次数和耗时
- JVM线程数监控