TangGodBlogs

JVM内存模型

Word count: 1,285 / Reading time: 5 min
2018/07/26 Share

1.JVM内存模型简介

JVM定义了不同运行时数据区,他们是用来执行应用程序的。某些区域随着JVM启动及销毁,另外一些区域的数据是线程性独立的,随着线程创建和销毁。jvm内存模型总体架构图如下:(摘自oracle官方网站

这里写图片描述

JVM在执行Java程序时,会把它管理的内存划分为若干个的区域,每个区域都有自己的用途和创建销毁时间。如下图所示,可以分为两大部分,线程私有区和共享区。下图是根据自己理解画的一个JVM内存模型架构图:

这里写图片描述

安利:上图是利用在线画图工具processon,我也是刚上手,个人感觉还不错,各种图例都有,在此安利一下!

2.内存模型

2.1.线程私有区

2.1.1 程序计数器

当同时进行的线程数超过CPU数或其内核数时,就要通过时间片轮询分派CPU的时间资源,不免发生线程切换。这时,每个线程就需要一个属于自己的计数器来记录下一条要运行的指令。如果执行的是JAVA方法,计数器记录正在执行的java字节码地址,如果执行的是native方法,则计数器为空。

2.1.2 虚拟机栈

线程私有的,与线程在同一时间创建。管理JAVA方法执行的内存模型。每个方法执行时都会创建一个桢栈来存储方法的的变量表、操作数栈、动态链接方法、返回值、返回地址等信息。栈的大小决定了方法调用的可达深度(递归多少层次,或嵌套调用多少层其他方法,-Xss参数可以设置虚拟机栈大小)。栈的大小可以是固定的,或者是动态扩展的。如果请求的栈深度大于最大可用深度,则抛出stackOverflowError;如果栈是可动态扩展的,但没有内存空间支持扩展,则抛出OutofMemoryError。

使用jclasslib工具可以查看class类文件的结构。下图为栈帧结构图:

这里写图片描述

2.1.3 本地方法栈

与虚拟机栈作用相似。但它不是为Java方法服务的,而是本地方法(C语言)。由于规范对这块没有强制要求,不同虚拟机实现方法不同。

2.2.线程共享区

此区域是用来存储被各线程共享的数据的。

2.2.1 方法区

线程共享的,用于存放被虚拟机加载的类的元数据信息,如常量、静态变量和即时编译器编译后的代码。若要分代,算是永久代(老年代),以前类大多“static”的,很少被卸载或收集,现回收废弃常量和无用的类。其中运行时常量池存放编译生成的各种常量。(如果hotspot虚拟机确定一个类的定义信息不会被使用,也会将其回收。回收的基本条件至少有:所有该类的实例被回收,而且装载该类的ClassLoader被回收)

2.2.2 堆

存放对象实例和数组,是垃圾回收的主要区域,分为新生代和老年代。刚创建的对象在新生代的Eden区中,经过GC后进入新生代的S0区中,再经过GC进入新生代的S1区中,15次GC后仍存在就进入老年代。这是按照一种回收机制进行划分的,不是固定的。若堆的空间不够实例分配,则OutOfMemoryError。

这里写图片描述

1
2
3
4
5
Young Generation      即图中的Eden + From Space(s0) + To Space(s1)
Eden 存放新生的对象
Survivor Space 有两个,存放每次垃圾回收后存活的对象(s0+s1)
Old Generation Tenured Generation 即图中的Old Space
主要存放应用程序中生命周期长的存活对象

2.3堆和栈的区别

栈是运行时单位,代表着逻辑,内含基本数据类型和堆中对象引用,所在区域连续,没有碎片;堆是存储单位,代表着数据,可被多个栈共享(包括成员中基本数据类型、引用和引用对象),所在区域不连续,会有碎片。

2.3.1功能不同

栈内存用来存储局部变量和方法调用,而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。

2.3.2共享性不同

栈内存是线程私有的。

堆内存是所有线程共有的。

2.3.3异常错误不同

如果栈内存或者堆内存不足都会抛出异常。

栈空间不足:java.lang.StackOverFlowError。

堆空间不足:java.lang.OutOfMemoryError。

2.3.4空间大小

栈的空间大小远远小于堆的。

2.4参考链接

http://www.cnblogs.com/AloneSword/p/4262255.html

http://www.jianshu.com/p/6ff6bdb22439

http://www.jianshu.com/p/753efd60f329

原文链接:http://www.jianshu.com/p/49b27deaf1d4

CATALOG
  1. 1. 1.JVM内存模型简介
  2. 2. 2.内存模型
    1. 2.1. 2.1.线程私有区
      1. 2.1.1. 2.1.1 程序计数器
      2. 2.1.2. 2.1.2 虚拟机栈
      3. 2.1.3. 2.1.3 本地方法栈
    2. 2.2. 2.2.线程共享区
      1. 2.2.1. 2.2.1 方法区
      2. 2.2.2. 2.2.2 堆
    3. 2.3. 2.3堆和栈的区别
      1. 2.3.1. 2.3.1功能不同
      2. 2.3.2. 2.3.2共享性不同
      3. 2.3.3. 2.3.3异常错误不同
      4. 2.3.4. 2.3.4空间大小
    4. 2.4. 2.4参考链接