以下为JDK1.8版本虚拟机运行时数据区的相关总结(OneNote截图)。
文章目录结构:
线程共享区域
1 方法区
1.1 运行时常量池(Runtime Constant Pool)
1.2 元空间实现方法区
2.堆(Heap)
2.1 新生代(Young Generation)
2.2 老年代(Old Generation)
2.3 元空间(Meta Space)
2.4 字符串常量池(String Pool)
线程不共享区域
3.虚拟机栈(Stack)
3.1 局部变量表
3.2 操作数栈(Operand Stack)
3.3 动态链接和指向运行时常量池的引用
3.4 方法返回地址
4.本地方法栈(Native Method Stack)
5.程序计数器(Program Counter Register)
更正:
上文对新生代中进行GC的过程描述有歧义,重新更正一下 。
对象在From Survivor和To Survivor来回转移的详细过程
对象在Eden区创建,当Eden区第一次装满之后,会执行第一次Yong GC,第一次Yong GC会将伊甸区还存活的对象复制到Surviver区的“From”区,此时“To”区是空的。但是在以后伊甸区被装满后进行的Yong GC,会将Eden区还存活的对象直接移动到Surviver区的“To”区,而“Form”区的对象有两个去处,“From”区的对象会根据经过的GC次数计算年龄,如果年龄到达了阈值(默认15),则会被移动到老年代中,否则就转移到“To”区,此时“From”区变成了空的,然后“From”区和“To”区进行角色互换,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。到下一次进行GC时,还是有一块空的“To”区,用来存放从eden区和“From”区移动过来的对象。也就是不管怎样,都会保证名为To的Survivor区域是空的。Yong GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。