JVM虚拟机内存模型 - 图1

本文主要根据JDK1.8讲解JVM虚拟机 JVM虚拟机内存模型 - 图2

从上图我们可以看到JVM在运行时的

一、JVM虚拟机数据区域分为

程序计数器、本地方法栈、java虚拟机栈属于线程私有的内存

堆,元数据区,和直接内存 线程共享区

程序计数器 程序计数器是一块较小的内存空间,可以看作当前线程执行的字节码的行号指示器。若线程执行a的是一个Java方法,这个计数器记录的是虚拟机字节码的指令的地址;若正在执行的是一个Nactive方法,这个计数器值为空

本地方法栈( 线程私有) 本地方法栈存放的是虚拟机使用到的Native方法

java虚拟机栈(线程数据私有)

存放一些常用变量的常量、以及存放一些方法。 线程私有每个线程对应一个Java虚拟机栈,其生命周期与线程同步。每个Java方法在被调用的时候都会创建一个栈桢,并入栈。一旦完成调用,则出栈,线程也就结束完成了任务。

  1. 堆(线程共享数据)

堆是用占用内存最大的一块区域,用于存放对象的示例,几乎所有对象和数组都在堆上进行分配,JDK1.7之后字符串常量从永久代中剥离出来,存放在堆中。

  1. 元数据区

元数据区取代了1.7的永久代。元数据和永久代本质上都是方法区的实现

  1. 直接内存

直接内存并不是java虚拟机运行时区域的一部分,也不是Java虚拟机规范中定义的内存区域。它可以使用Nactive函数直接分配堆外内存

二、堆内存分配(线程共享数据)

JVM虚拟机内存模型 - 图3

从上图我们可以看出 堆内存分为 年轻代、老年代、直接内存 年轻代占用堆内存3分之1 、老年代占用堆内存3分之2

  1. 年轻代(1/3) 年轻代里面又细分 Eden(中心体)占用年轻代的10分之8的空间。余下的10分之2是幸存空间。幸存空间存在的意义是为了减少被送到老年代的对象,减少Full Gc的发生。

  2. 老年代空间(2/3) 在年轻代经历了16次MinorGC回收、依旧保留的或者的对象。老年代采用MajorGC或者FullGC。