深入理解Java 虚拟机(周志明)笔记(二)——Java数据分区

来源:互联网 发布:qq飞车改装30雷诺数据 编辑:程序博客网 时间:2024/05/21 19:50
JVM运行时(一个处理器(的一个核)执行一条线程)数据分区
    1.线程共享的区(数据被处理器各线程共享,即各线程共有的区)
         a.方法区(Method Area):存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码。(Class文件信息)
                  常量池:存放编译时生成的各种字面量和引用。在类加载后数据进入运行时常量池。 例如通过 String str=“aba” 参数的字符串。
                  运行时常量池:存储运行时产生的常量数据或引用。  如通过String类的intern()方法产生新的常量
         b.堆(Heap):1.对大多数应用堆是虚拟机所管理的内存中最大的一块
                       2.存储所有的对象实例
                       3.Java堆是垃圾收集器管理的主要区域,因此也被称为“GC堆”。
         c.执行引擎:
         d.本地库接口
         e.本地方法库:
    2.线程私有的区(数据被各处理器线程私有,其他线程不可访问,即各线程都有自己独占的区,生命周期与线程相同)
    a.虚拟机栈(VM Stack):1.为虚拟机执行Java方法(字节码)服务
                            2.每个方法执行时需存储的数据(局部变量表,操作数栈,动态链接,方法出口) 局部数据
        局部变量表:编译时可知的基本数据类型和引用类型
        方法所需局部变量空间大小在编译时计算,运行时不变
      异常状况:1.StackOverflowError:线程请求的栈深度大于虚拟机允许的深度
  2.OutOfMemoryError:无法申请到足够的内存
    b.本地方法栈(Native Method Stack):1.为虚拟机执行Native方法服务
                                        2.使用方法与虚拟机栈类似
    c.程序计数器:当前线程嗦执行的字节码的行号,字节码解释器通过修改该值来进行字节码指令(类似于Cpu的程序计数器).
    3.直接内存:1.由Native函数库直接分配堆外内存
                           2.应用:NIO类 使用一种基于通道和缓冲区的I/O方式,分配直接内存,通过在堆中存储DirectByteBuffer对象作为直接内存的引用。
                                 这样避免了在堆和Native堆中来回复制数据
0 0