结构
方法区
存放class模板、和static有关的变量和方法
- 线程共享
- jdk8 之后被元空间取代。移动到堆外内存(字符串常量池依旧在堆中,增强字符串回收效率)
堆 heap
实例化的类对象在堆里面
- 线程共享
分区
- 新生代
- 伊甸区:新生对象都在伊甸区
- s0(from)和s1(to):两个大小相同,可以互换的区域。每次Minor GC会将伊甸区和s0的对象复制到s1区,并交换s0和s1。(to区域一直是空的)
- 老年代:新生代对象经过指定次数Minor GC后就会晋升到老年代
虚拟机栈 stack
栈中只保存基本数据类型的数据和自定义对象的引用(不是对象)
- 线程私有
堆 虚拟机栈 方法区的交互
GC
只在堆和方法区中进行
评估GC的性能指标
- 吞吐量:程序代码运行时间占总时间的比例(总运行时间 = 程序的运行时间 + 内存回收的时间)
- 暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间(stw stop the world 时间)
- 内存大小:堆内存大小
吞吐量、暂停时间、内存占用 这三者共同构成一个不可能三角。因为随着硬件发展,内存占用多些越来越能容忍。不幸的是”高吞吐量”和”低暂停时间”是一对相互竞争的目标(矛盾)。
类型
- Minor GC :新生代GC
- Full GC:老年
串行收集器
Serial、Serial old 都是串行收集器,效率低,stw时间长。