一、垃圾回收发生在哪里
主要发生在堆中。
Java堆:对象分配内存的区域,这里是垃圾回收的主战场。
方法区:存放类信息、常量、静态变量、编译器编译后的代码等数据,另外还有一个常量池,垃圾回收器也会在这个区域工作。
二、垃圾回收常用算法
2.1、引用计数法
含义:每个对象有一个引用计数器,当对象被饮用一次则计数器加1,当对象引用失效一次则计数器减1,对于计数器为0的对象意味着是垃圾对象,可以被GC回收。
2.2、可达性算法
从GC Roots作为起点开始搜索,那么整个连通图中的对象便都是活对象,对于GC Roots无法到达的对象变成了垃圾回收的对象,随时可被GC回收。
每次对对象赋值时均需要维护引用计数器,且计数器本身也有一定的消耗。较难处理循环引用。
可以作为GC Roots的对象:
- 虚拟机栈的栈桢的局部变量表所引用的对象;
- 本地方法栈的JNI所引用的对象;
- 方法区的静态变量和常量所引用的对象。
关于可达性的对象,便是能与GC Roots构成连通图的对象。