GC需完成的三件事:
- 那些内存需要回收
- 什么时候回收
- 如何回收
为什么要了解GC和内存分配?
当需要排查内存泄漏和内存溢出等问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,开发人员就需要对这些自动化的东西进行必要的监控和调节。
判断对象是否已经死了:
- 引用计数法: 简单,但难以处理对象之间相互引用的关系
- 可达性分析算法:通过可达性分析来判断对象是否存活,通过枚举根节点,从根节点开始,向下搜索,搜索走过的路径称为引用链,对没有和引用链相连的对象判定为可回收的对象
GC根节点对象分类:
虚拟机栈中的对象(栈帧的本地变量表)
方法区中类静态属性引用的对象
方法区中的常量引用对象
本地方法栈中JNI引用的对象
引用分类:jdk1.2之后的故事
强引用: Abc abc = new Abc();
软引用:https://www.cnblogs.com/renhui/p/6069437.html
在使用非强引用时,构建对象后需把new出的对象制空,手动gc,之后用虚软弱等引用来进行操作,优化性能。
为了解决内存操作不灵活的问题,我们可以通过了解Java的引用方式来解决这个问题