- 程序计数器(线程私有):记录虚拟机字节码指令的地址
- jvm stack/java虚拟机栈(线程私有):记录java方法,一个方法一个栈帧,里面记录局部变量表,方法出口等信息
- 本地方法栈(线程私有):存本地方法
- java堆:所有对象实例放在这里。GC回收主要区域。分为:新生代,老年代,永久代。内存动态扩展,可不连续。
- 方法区:已经被加载的类信息,常量,静态变量等。内存动态扩展,可不连续。
5.1运行时常量池: class文件的常量池在类加载后会被放入这个区域
1 引用计数器
2 可达性:用GC Roots作为起点搜索,能达到的都是可用的,不可用的回收
3 引用类型
4 方法区回收
5 finalize()
1.标记-清除
把需要回收的对象标记,清除
缺点:1,标记和清除过程效率不高2,产生大量内存碎片,导致无法给大对象分配内存
2复制
把内存划分为大小相等的两块,每次就用一块,内存用完了,就把还活着的对象复制到另一块,再把原先的内存空间清理。
现在很多商业虚拟机都用这种算法回收新生代。不是平均分,而是分成一个大的Eden和两个小的Survior,每次用的时候用前俩,回收的时候把前两个钟还活的对象放到后面的Survior中,HotSpot VM比例是:8:1。保证内存利用率90%,如果每次回收多余10%的存活对象,就借用老年代进行分配担保
3.标记-整理
让所有存活的对象都向一端移动
4.分代收集
根据对象存活周期将内存划分为几块,不痛快采用适当的收集算法
一般把java堆分为新生代和老生代
新生代:复制算法
老年代:标记清理或者标记整理
- 串行垃圾回收器Serial:单线程,只用一个线程进行垃圾回收,会暂停所有用户线程,不适合服务器环境
- 并行垃圾回收器Parallel:多个垃圾收集线程并行工作,用户线程是暂停的,
- 并发垃圾回收器(CMS):用户线程和垃圾收集线程同时执行(也可以交替执行),不需要停顿用户线程。使用响应时间有要求的场景
- G1垃圾回收器:将堆内存分割成不同的区域,然后并发的对其进行垃圾回收



