您的位置:首页 > 编程语言 > Java开发

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

2016-03-07 23:58 483 查看
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堆中来回复制数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: