jvm系列
年老代大部分是活着的对象,那么年老代过大,或者对象过早提升到年老代,导致年老代存活对象过多,那么如果做一次FullGC,寻找活着的对象,那么对于性能可想而知。
如果系统频繁地发生FullGC的话,而这些或者的对象在这么短的时间内被注销的概率很低,那么FullGC的时间越长,就会有越多的请求得不到响应或者响应很慢,它们所持有的内存就无法释放掉,就会有越多的对象进入Old区域,这就会在一个点上产生连锁效应。
old区不想young区有survivor空间专门存放存活的对象,因而,old区域的对象的清除操作需要在自己的空间内扫描遍历,然后将对应的垃圾对象清除掉,这个时间开销自然是比较大的,虽然可以并行,但是并行之中又带来了很多冲突的复杂性,因而FullGC一直都不是我们想看到的。
清除操作会导致内存产生很多碎片,如果碎片很多的话,在大对象分配上面会出现一些麻烦的问题,因而需要整理碎片,如果存活对象过多的话,那么对于内存碎片整理来说,就越麻烦,有时候可能就为了几个字节的碎片而导致几百M内存对象的移动(JVM不会因为因为这里有几个字节的碎片,而寻找一个几个字节大小的对象放在这个位置,它采用的是顺序移动的方式)。