JVM内存结构的知识点

JVM内存分为线程共享的内存区域和线程私有的内存区域(工作内存)。
  1. 线程共享的内存区域包括方法区和堆。
  • 方法区是存储类的元信息的地方。包括类信息、常量、静态变量、编译后的代码(字节码指令)等数据。1.7方法区的实现是永久代,1.8方法区的实现是元数据。方法区存在垃圾回收,但回收效率低。回收主要针对常量池的回收和类型的卸载。当方法区无法满足内存需求时,报OOM异常。
  • 堆的唯一目的是存放对象实例,几乎所有的对象和数组都在这里存放。对于大多数应用来说,堆是JVM管理的内存中最大的一块儿内存区域,也是最容易OOM的区域。大多数JVM都将堆实现为大小可扩展的,(通过-Xms和-Xmx控制)。
    堆只会记录对象的状态, 存储实例对象的值. 对象包含对象头.
    判断对象是否可被回收的算法有引用计数器算法和可达性分析算法.引用计数算法存在两个对象相互引用的问题, 造成内存泄漏. 主流的商用程序语言都是通过可达性分析算法来判定对象是否存活的. GC Roots可以是虚拟机栈, 方法中静态属性引用的对象, 方法区中常量引用的对象, Native方法引用的对象等不容易被回收的对象.
    堆被分为新生代和老年代. 默认的,新生代与老年代的比例为1:2(该值可以通过参数 –XX:NewRatio 来指定 ). 新生代又被分为Eden、From Survivor和To Survivor. 默认的,Edem : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 )
  1. 线程私有的内存区域包括虚拟机栈、本地方法栈和程序计数器。
  • 虚拟栈表示线程中方法执行的模型, 每个方法执行时, 就会在虚拟机中创建一个栈帧, 每个方法从调用到执行的过程, 就对应着栈帧在虚拟机栈中从入栈到出栈的过程. 简单来说就是执行方法先进后出的数据结构.
    栈帧包含局部变量表, 操作数栈, 动态链接和返回值地址.动态链接指向方法区方法的地址. 返回值地址指向返回值对象.操作数栈保存中间变量.
  • 本地方法栈, 和虚拟栈功能类似, 虚拟机栈是为虚拟机执行java方法而准备的, 本地方法栈是为虚拟机使用native方法而准备的.
  1. 直接内存, JVM之外的内存, 开发人员自己分配和回收内存.
  2. class文件结构.

你可能感兴趣的:(java)