一句话:GC 主要关注 堆和方法区
内存运行时 JVM 会有一个运行时数据区来管理内存。它主要包括 5 大部分:
• 程序计数器(Program Counter Register)
• 虚拟机栈(VM Stack)
• 本地方法栈(Native Method Stack)
• 方法区(Method Area)
• 堆(Heap)
而其中程序计数器、虚拟机栈、本地方法栈是每个线程私有的内存空间,随线程而生,随线程而亡。例如栈中每一个栈帧中分配多少内存基本上在类结构确定是哪个时就已知了,因此这 3 个区域的内存分配和回收都是确定的,无需考虑内存回收的问题。
而堆和方法区则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的。GC 关注的也就是这部分的内存区域。