Java中JVM内存结构

Java中JVM内存结构

 线程共享区

  • 方法区:

又名静态成员区域,包含整个程序的 class、static 成员等,类自己的字节码是静态的;它会被全部的线程共享和是全区级别的;java

属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。面试

  • Java (Heap)

存储的所有都是 Object 对象实例,对象实例中通常都包含了其数据成员以及与该对象对应类的信息,它会指向类的引用一个,不一样线程确定要操做这个对象;一个 JVM 实例在运行的时候只有一个 Heap 区域,并且该区域被全部的线程共享;补充说明:垃圾回收是回收堆 (heap) 中内容,堆上才有咱们的对象数组

对于绝大多数应用来讲,这块区域是 JVM 所管理的内存中最大的一块。线程共享,主要是存放对象实例和数组。内部会划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer, TLAB)。能够位于物理上不连续的空间,可是逻辑上要连续。并发

OutOfMemoryError:若是堆中没有内存完成实例分配,而且堆也没法再扩展时,抛出该异常。ide

 线程独占区

  • 本地方法栈

这个是在迭归的时候确定是相当重要的;区别于 Java 虚拟机栈的是,Java 虚拟机栈为虚拟机执行 Java 方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。也会有 StackOverflowError 和 OutOfMemoryError 异常。.net

  • 程序计数器

这是一个全区计数器,对于线程切换是相当重要的;内存空间小,线程私有。字节码解释器工做是就是经过改变这个计数器的值来选取下一条须要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都须要依赖计数器完成线程

若是线程正在执行一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;若是正在执行的是 Native 方法,这个计数器的值则为 (Undefined)。此内存区域是惟一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 状况的区域。3d

  • Java (Stack)

Stack 区属于线程私有,高效的程序通常都是并发的,每一个线程都会包含一个 Stack 区域,Stack 区域中含有基本的数据类型以及对象的引用,其它线程均不能直接访问该区域;Java 栈分为三大部份:基本数据类型区域、操做指令区域、上下文等。线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每一个方法在执行时都会床建立一个栈帧(Stack Frame)用于存储局部变量表、操做数栈、动态连接、方法出口等信息。每个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。对象

局部变量表:存放了编译期可知的各类基本类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型)和 returnAddress 类型(指向了一条字节码指令的地址)blog

StackOverflowError:线程请求的栈深度大于虚拟机所容许的深度。

OutOfMemoryError:若是虚拟机栈能够动态扩展,而扩展时没法申请到足够的内存。

若是想了解更多关于JVM的信息,请参考:

ü  《Java虚拟机(JVM)你只要看这一篇就够了!:http://www.javashuo.com/article/p-uhqvzxiy-ms.html

ü  《面试必问之JVM原理: https://baijiahao.baidu.com/s?id=1605937053950156833&wfr=spider&for=pc

ü  《java堆内和堆外内存介绍: http://www.javashuo.com/article/p-gkuzbtkr-me.html

相关文章
相关标签/搜索