Java虚拟机-运行时数据区概念

 
  • 文章目录
    • 一、Java5扩展点?
    • 二、运行时数据区简介
    • 三、程序计数器
    • 四、Java虚拟机栈
    • 五、本地方法栈
    • 六、Java堆
    • 七、方法区
    • 八、直接内存

一、Java5扩展点:

  • 自动装箱
  • 泛型
  • 动态注解
  • 枚举
  • 可变长参数
  • 遍历循环语法

二、运行时数据区:

  1. 方法区
  2. 虚拟机栈
  3. 本地方法栈
  4. 程序计数器

三、程序计数器:

  1. 较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器(字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能)
  2. 程序私有的内存:每个线程都有一个独立的程序计数器,不互相影响,独立存储

四、Java虚拟机栈

  1. 线程私有,生命周期与线程相同
  2. 描述的是Java方法执行的内存模型(每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等。)
  3. 局部变量表:存放编译期各种基本数据类型(boolean,byte,char,short,int,float,long,double)、对象引用;注:64未长度的long和double会占用2个局部变量空间,其它的数据类型只占用1个;
  4. 在栈中会抛出两个异常:
    • StackOverflowError异常:线程请求的栈深度大于虚拟机允许的深度时抛出
    • OutOfMemoryErroy异常:动态扩展内存是无法申请到足够的内存时抛出

五、本地方法栈

  1. 为虚拟机使用到的Native服务(虚拟机栈为虚拟机执行Java方法服务)
  2. 抛出的异常一致

六、Java堆

  1. 所有线程共享的一块区域内存;也是垃圾收集器管理的主要区域;
  2. 唯一目的:存放对象实例
  3. 基本采用分代收集算法;粗略:新生代、老年代;细致:Eden空间、From Survivor空间、To Survivor空间
  4. 关于垃圾回收算法,新生代、老年代、以及下面的永久代,后面会详细介绍

七、方法区

  1. 所有线程共享的内存区域;存储已被虚拟机加载的类信息、常量、静态变量、及时编译器编译后的代码数据。
  2. 要与 Java堆区分开,别名(Non-Heap),永久代(GC分代收集扩展至方法区,可以说是使用永久代来实现方法区)
  3. 字符串常量池已从永久代移出
  4. 运行时常量池:
    • 存放编译生成的各种字面量和符号引用
    • 另外一个特征:具有动态性(如:String.intern())
  5. 抛出异常:OutOfMemoryErroy异常

八、直接内存

  1. 不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域;通过NIO类,引入一种基于通道与缓冲区的I/O方式,使用Native函数库直接分配的堆外内存
  2. 抛出异常:OutOfMemoryErroy异常
  3. 受本机内存影响

 评论