jvm

jvm的运行时数据区


堆:java垃圾回收的主要区域,唯一存在的价值就是存放对象实例,几乎所有的对象实例都会在这里分配内存。从垃圾回收的角度分为新生代和老年代。在细分一点可以划分为Eden空间,From Survivor空间,To Survivor空间。若是在堆中没有完成实例分配,并且堆也无法再扩展时,就会抛出OutOfMemoryError异常。


方法区:用于存储已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。当方法区无法满足内存分配的需求时,将会抛出OutOfMemoryError异常。


虚拟机栈:描述的是java方法执行的内存模型,每个方法执行时都会创建一个栈帧,栈帧中用于存储局部变量表,操作数栈,动态链接,方法出口等信息。当线程申请的栈深度大于虚拟机所允许的栈深度,将抛出StackOverflowError异常。若是虚拟机动态扩展时无法申请到足够的内存,将会抛出OutOfMemoryError异常。


程序计数器:记录当前线程执行的字节码指令的行号,不会发生OutOfMemoryError。


本地方法栈:用于执行非java方法的内存模型,也会发生StackOverflowError和OutOfMemoryError异常。


jvm垃圾回收考虑的三个问题

  • 回收哪些对象
  • 什么时候回收这些对象
  • 怎么回收这些对象

jvm垃圾回收算法

  • 标记清除:会有内存碎片

  • 标记整理:没有内存碎片,适合新生代对象的回收

  • 复制算法:需要留出一部分的内存空间,利用率不高

  • 分代收集算法:新生代死亡对象多,采用复制算法。老年代死亡对象少,采用标记整理或标记清除。


jvm垃圾收集器

​ 新生代垃圾收集器

​ 老年代垃圾收集器