- java中NIO(直接内存),比普通io速度更快,且不受到gc作用,NIO免去了系统缓存和java缓存的传输这一步骤
- 垃圾回收:通常有引用计数方法和可达性方法,引用计数法存在循环引用的问题(互相引用,都不能被回收)
- 可达性分析:查看对象是否能通过gc root对象找到
- 引用:强,软,弱,虚
- 垃圾回收算法:标记清除,先标记再清楚,不用连续,容易产生内存碎片
- 标记整理:在标记清除的基础上再做一步整理,避免内存碎片,但效率低,例如需要移动引用对象的地址
- 复制算法:两个区域,一个区域的存活对象复制(顺便整理)到另一个区中,再将这个区垃圾回收,之后再互换。没有内存碎片,但是需要双倍空间
- 三种垃圾回收算法根据实际场景协同工作,在jvm中使用分代协同算法
- 新生代中分为伊甸园,幸存区from,to
- 当一个对象产生时,先被分配到伊甸园,如果空间不足,会促发minor gc,在伊甸园中使用可达性分析算法,存活的使用复制算法,将这些对象复制到幸存区from,并将他们的寿命+1,伊甸园剩余的对象回收掉,复制算法会交换幸存区from和to的位置
- 当幸存区from中对象的寿命达到阈值,会被移到老年代(minor gc)
- 当老年代内存也不足,先尝试minor gc,还是无法分配,会促发full gc,整体gc一次,full gc的算法不使用复制算法,可能使用标记算法,如果full gc之后不足,会触发oom
- minor gc会导致stop the world,因为复制算法会导致一些变量地址的改变,所以需要暂停用户线程