本地方法栈
保存native方法进入区域的地址
程序计数器
用于记录当前执行字节码指令的位置
虚拟机栈
每个线程都有自己的虚拟机栈,用来存放执行方法时的局部变量、操作栈、动态链接、方法返回地址等
堆区
对象创建后,数据会保存到堆区,堆区也是jvm进行垃圾回收的地方
垃圾回收
- 回收对象判断算法
1.引用计数法
2.可达性分析 - 垃圾回收算法
1.标记清除法
产生内存碎片
2.标记整理法
在标记清除的基础上,进行整理,效率低
3.标记复制法
耗内存
4.分代收集法
将堆区分为新生代、老年代
4.1 新生代
每次垃圾回收都会有大量的对象死去,采用标记复制法
新生代分为 Eden、Survivor From、Survivor To三块,比例为8:1:1
Survivor区相当于Eden和老年代中间的缓存
新产生的对象都会进入Eden区等待垃圾回收,每次垃圾存活的对象会进入 Survivor From区
而在From区中,仍存活的对象会根据他们的年龄值来决定去向。(From Survivor和To Survivor的逻辑关系会发生颠倒: From变To , To变From,目的是保证有连续的空间存放对方,避免碎片化的发生)
4.2 老年代
经过多次垃圾回收仍然存活的对象会进入老年代,老年代每次垃圾回收只有少量的对象死去,采用标记清除或者标记整理法
方法区(JDK1.8后也叫metaspace区)
存放常量池、被加载的类的信息,可以看成是类(Class)的元数据