GC是什么? 为什么要有 GC?
Java 提供的GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,
Java 语言没有提供释放已分配内存的显式操作方法。
在堆中,找到已经无用的对象,并把这些对象占用的空间收回使其可以重新利用。
要请求垃圾收集,可以调用下面的方法之一:
- System.gc()
- Runtime.getRuntime().gc() 。
算法思路:把所有的对象组成一个集合,或者可以理解为树状结构,从树根开始找,只要可以找到的都是活动对象,如果找不到就应该被回收了。
Java 的 GC 哪些内存需要回收?
内存运行时 JVM 会有一个运行时数据区来管理内存。它主要包括 5 大部分:
- 程序计数器(Program Counter Register)
- 虚拟机栈(VM Stack)
- 本地方法栈(Native Method Stack)
- 方法区(Method Area)
- 堆(Heap)
而其中程序计数器、虚拟机栈、本地方法栈是每个线程私有的内存空间,随线程而生,随线程而亡。例如栈中每一个栈帧中分配多少内存基本上在类结构确定是哪个时就已知了,因此这 3 个区域的内存分配和回收都是确定的,无需考虑内存回收的问题。
但方法区和堆就不同了,一个接口的多个实现类需要的内存可能不一样,只有在程序运行期间才会知道会创建哪些对象,这部分内存的分配和回收都是动态的,GC 主要关注的是这部分内存。
总结&#