jvm主要分3大块:堆heap,栈stack,持久区permanent(也叫方法区)。
1:堆是gc的主要区域,主要存放对象实例,分为新生代young和老年代old(默认young占堆的1/3,old占2/3)。
新生代分:Eden伊甸,To,From三部分(默认8:1:1)。
Eden存放新建的对象,当Eden满了(jvm内存分配技术Bump-the-pointer可以快速检测,加快Eden内存分配)会进行一次gc(存活对象年龄+1),1岁的对象移到To或From一个survivor,假设移动到了To,当To内存满了会进行一次gc(年龄+1),此时,存活下来的2岁对象移到另一个survivor,即From,To会被清空。默认15岁的对象会从young移动到old,一些比较大的对象会无视存活年龄直接进入old。
注意:新生代的gc(minor gc)主要采用的复制算法,理论上一个survivor,假设To满了且对象全部存活的情况下,另一个survivor即From为了存放所有存活对象,所以在gc之前必须是空的。所以,两个survivor永远有一个是空的。
2:栈是虚拟机栈,存放方法中的局部变量和对象的引用(对象的地址值),栈存放栈帧,栈帧代表一个线程执行的一个方法,栈帧储存的是方法调用过程中的临时变量,参数和中间结果。
全局变量:基本类型的变量和值存在堆里,引用类型的变量和对象存在堆里,指向对象的引用(地址值)存在栈中。
局部变量:基本类型的变量和值存在栈里,引用类型的变量(地址值)在栈里,具体对象在堆中。
3: 持久区permament,一般叫方法区,存放的是关于类的描述,class的所有信息,静态变量,final常量,属性,方法信息等。