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