天天看点

JVM 学习笔记

jvm  ----java  virtual machine   (熟称:java虚拟机),jvm

在执行java程序的过程中将内容划分为若干个区域,其有各自的用途和管理机制。如下图:

JVM 学习笔记

1.  程序计算器(program counter register)  -- 

是当前线程所执行字节码的行号指示器,通过改变其值来实现执行不同的代码指令。内存占用小,线程私有,支持多线程处理(多线程时,每个线程有一个独立程序计算器,已达到各自互不影响),

也正是由于这些特点,该区域是jvm规范中唯一没有规定任何outofmemoryerror的区域。

2.  java 虚拟机栈(jvm stack) 

    也是线程私有,和线程有相同的生命周期,是java方法执行的内存模型,

即:每个方法执行时,都会同时创建一个stack

frame(栈帧)用于存储局部变量(8种基本数据类型、对象引用类型)、操作数栈、动态链接、方法出口信息。方法调用到执行完成的过程也是stack

frame栈帧出、入jvm stack的过程.

    在jvm规范中,规定了两种内存异常:

    一是:线程请求的栈深度超过了栈允许的最大深度,将抛出:stackoverflowerror 异常。

    二是:当java虚拟机动态扩展时,无法申请到足够的内存时,将抛出:outofmemoryerror异常。

3.  本地方法栈(native method stack)

    与jvm stack 相似,jvm stack 为虚拟机执行java方法服务,而native method

stack 是为虚拟机执行本地方法服务。有的虚拟机对两者没有区分,合二为一。

   同样会存在两种异常: stackoverflowerror   和 

outofmemoryerror  异常.

4.   java 堆(heap)

 heap 是java内存管理中最大的一块内存区域,被所有线程共享,用于存放对象实例,几乎所有的对象实例和数组都在此分配。

 在jvm规范中规定,java堆可以物理不联系,只要逻辑空间联系即可。这样,当堆heap无法完成再扩展时,将会抛出:outofmemoryerror异常。

5. 方法区(method area)

 方法区也是多线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译的代码数据。(jvm规范把方法区描述为堆的一个逻辑区域)

方法区在无法满足内存分配时,将抛出outofmemoryerror 异常。

6.  运行时常量池(runtime constant pool )

运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池。

7. 直接内存(direct memory)

   本机内存分配不受java

虚拟机(堆,栈等)的影响,但是受机器内存的影响,当各区域内存总和大于物理内存时,导致动态扩展内存出现:outofmemoryerror异常。