JVM内存模型及GC回收算法

JAVA学习网 2018-03-06 13:59:03

从事Java开发已有好几年,一些基础的东西容易忘记,该篇博客主要对JVM内存模型以及GC回收算法以自己的理解和认识做以记录。

  • 内存模型
  • GC垃圾回收

 

1.内存模型

从上图可以看出,JVM分为 方法区,虚拟机栈,本地方法栈,堆,计数器 5个区域。其中最为重要的就是栈和堆。

栈:存放基本数据类型 和 引用

堆:存放各个对象的实例

栈和堆设计的目的是什么呢?

  • 栈存储了处理逻辑,堆存储了具体的数据,这样使得栈和堆中处理耦合度降低,也更为清晰
  • 栈和堆分离,使得堆可以被多个栈共享
  • 栈保存了上下文信息,因此只向上增长,而堆是动态分配

栈的大小可以通过XSs设置,如果栈空间不足,会抛出java.lang.StackOverflowError异常

2.各区域的动能及说明

  • 栈区

线程私有,生命周期与线程相同,每个方法的执行都会创建一个栈帧(stack frame)用于存放局部变量,操作栈,动态链接,方法出口。

存放对象实例,所有的对象的内存都在这里分配,垃圾回收主要就是作用于这里的

  • 堆的初始内存由Xms指定,默认为物理内存的1/64;最大内存由-Xmx指定,默认是物理内存的1/4
  • 默认空余的内存小于40%时,就会增大,直到-Xmx设置的内存大小,具体的比例由-XX:MinHeapFreeRatio指定
  • 空余的内存大于70%时,内存就会减小,直到-Xms设置的内存大小,具体的比例由-XX:MaxHeapFreeRatio指定

因此,一般建议都把-XX:MinHeapFreeRatio和-XX:MinHeapFreeRatio设置成一样大,可以避免JVM不断调整大小

  • 计数器

这里记录了线程执行的字节码的行号,在分支,循环,跳转,异常,线程恢复等环节都依赖这个计数器

  • 方法区

存放类信息,字段信息,方法信息,其他信息

 

阅读(760) 评论(0)