复杂的不多说了,只要满足于实际开发即可了,java程序的堆、栈存放的java内存对象,不可能一直不停的存而不释放,不然爆仓了还怎么存呢,所以就有个垃圾回收,清理掉垃圾对象,释放存储空间,jvm自带的,就是为了处理这个问题;存储的空间分为新生带、老年代和永久带,新生代又分为eden区、survior1和survior2,java程序创建的内存对象先存在eden区,满了之后挪到survior1,再满了之后挪到survior2并触发一次垃圾回收Minor GC,如果回收以后,还存活的survior2数据便存到老年代,而survior1和survior2名称交换进行下一轮新的对象存储和回收,老年代满了以后就会触发Full GC垃圾回收,如果还未被回收的对象,便存储在永久带,这里的对象便不会被垃圾回收了;过程大概是这样,里面涉及很多对象回收整理、空间释放的一些算法,比如交换算法、标记算法、整理算法、标记整理算法、清理算法、标记清理算法等,感兴趣的童鞋可以去一一查阅,反正作为基础程序员,需要用到这种算法的业务很少,个人觉得知道大概就好,某天需要用到再去研究也不迟;下面说说实际应用,垃圾回收在实际里用的最多的就是内存优化的运用,调整内存空间比例(以上eden区:survior1:survior2:老年代默认合适的比例8:1:1:2,永久带不被垃圾回收,可自定义或使用默认内存空间即可),使项目运行效率最高,并不造成OOM内存溢出,如果上述空间配置不合理可以直接导致项目无法启动,甚至开发工具软件都打不开;至于手动调用垃圾回收方法System.gc()、调用软引用对象、弱引用对象、虚引用对象的情况实际引用很少见,或者本人所处的普通岗位太低级无法涉及,各位如果有实际运用的案例还请不吝赐教,写出来大家共同观摩~
一句话说明垃圾回收机制原理及实际使用
最新推荐文章于 2022-12-08 11:55:43 发布