JVM内存区域
线程私有区域
程序计数器
- 当前线程所执行的字节码的行号指示器
- 方法执行时,记录的是实施虚拟机字节码指令的地址,若为native方法时,值为空。
虚拟机栈
- 描述方法执行过程的内存模型,在当前栈帧中存储了局部变量表、操作数栈、动态链接、方法出口等信息,同时存储部分运行时数据和数据结构,处理动态链接方法返回值和异常分派。
本地方法区
- 为native方法服务
线程共享区域
方法区
- 存储常量、静态变量、即时编译后的代码、类信息、运行时常量池等数据
堆
-
存储JVM运行过程中创建的对象和产生的数据
-
垃圾回收角度分类
-
新生代
-
分区
- Eden区
- ServiviorFrom区
- ServivorTo区
-
MinorGC(复制)
- Eden区和SF区中存活的对象进入到ST区,如出现对象年龄到达标准、ST空间不足、对象属于大对象的情况则直接复制到老年代
- 清空Eden区和SF区中的对象
- ST区和SF区互换
-
-
老年代
-
存放有长生命周期的对象和大对象
-
MajorGC(标记清除)
- 在进行MajorGC前,JVM会进行一次MinorGC,若仍出现老年代空间不足或无法找到足够大的连续空间,会触发MajorGC
-
-
永久代
- 指内存的永久保存区域,主要存放Class和Meta的信息
-
直接内存
垃圾回收
确定垃圾
-
没有任何引用该对象
-
策略
- 引用计数法
- 可达性分析法
垃圾回收算法
- 标记清除法
- 复制算法
- 标记整理算法
- 分代收集算法
垃圾收集器
-
新生代
- Serial:单线程复制算法
- ParNew:多线程复制算法
- Parallel Scavenge:多线程复制算法
-
老年代
- CMS:多线程标记清除算法
- Serial Old:单线程标记整理算法
- Parallel Old:多线程标记整理算法
- G1:多线程标记整理算法