深入理解Java虚拟机01-Java虚拟机内存分析

    Java 虚拟机在运行时有如下区域    除了图片中的内存区域 Jdk1.4 新加入的NIO为虚拟机运行时分配内存提供了实现 


虚拟机内存分类



线程私有的



程序计数器

作用简述:

    记录正在执行的虚拟机字节码指令地址。

    一个很小的内存空间 ,通过改变该计数器用来选取下一条需要执行的字节码指令,分支、循环、跳转、线程恢复等都依赖该计数器。

    记录正在执行的字节码指令地址。

可能发生的异常:

    没有OOM异常



java虚拟机栈

作用简述:

    每个方法在执行时都会创建一个栈帧用于存储局部变量、操作数栈、动态链接、方法出入口。

局部变量 3种类型:

    基本数据类型  long 和 double 占用两个空间  其他基本数据类型只有占一个。

    对象引用 指向对象起始地址的引用指针。

    returnAddress 指向一条字节码的指令地址。

可能产出的异常:

    栈深度大于虚拟机所允许的深度  会抛出 StackOverflowError

    栈的内存不足  OutOfMemoryError


本地方法栈

作用简述:

    与java虚拟机栈类似  执行Native方法。

    有的虚拟机将本地方法栈与虚拟机栈合二为一。

可能产出的异常:

    栈深度大于虚拟机所允许的深度  会抛出 StackOverflowError

    栈的内存不足  OutOfMemoryError



线程共有的



Java堆

作用简述:

    在虚拟机启动的时候创建,最大内存块,存放对象实例与数组,“几乎”所有对象的存放地址。

    Java中垃圾收集的主要管理区域,基于分代的回收算法新生代和老年代。

    可能划分出线程私有的分配缓存区 TLAB。

    通过 -Xmx 和 -Xms 控制堆的内存大小。

可能产出的异常:

    内存不足 OutOfMemoryError



方法区



方法区视图


作用简述:

    用于存储虚拟机加载的类信息,比如类有哪些字段有哪些方法, 常量、 静态变量  (这个区域可以不实现垃圾收集)。在jdk1.8以后将方法区移动到元空间去,使用本地内存。

可能产出的异常:

    内存不足 OutOfMemoryError



运行时常量池


作用简述:

    方法区的一部分  用于存放各种字面量和符号引用。

    通常运行时常量池都是在编译时产出的,不过String的intern方法可以在运行时放入常量池。

可能产出的异常:

    内存不足 OutOfMemoryError




直接内存

    计算机内存 可以在运行时直接分配,进行存取 NIO就是通过直接内存实现的 

    不受堆的大小限制 只受计算机内存的限制

    jdk1.8 以后方法区从堆内存移动到本地内存中去

你可能感兴趣的:(深入理解Java虚拟机01-Java虚拟机内存分析)