JVM学习---Java运行时数据

来源:互联网 发布:python界面开发 实例 编辑:程序博客网 时间:2024/06/05 19:40


(图来自网络)

1.程序计数器

         线程私有----各条线程间独立存储,互不影响。

2.Java虚拟机栈(Stack)

     常说的“栈内存”,虚拟机栈中局部变量表部分。局部变量表存放了编译期可知的8大基本数据类型、对象引用、returnAdress(指向了一条字节码指令的地址)。

    double、long 64位,会占用2个局部变量空间(Slot),其余数据类型只占用1个。

    局部变量表的内存空间分配在编译期完成。

    线程私有。

    有两种异常:StackOverflowError(线程请求的栈深度大于虚拟机允许的深度),OutOfMemoryError(扩展时无法申请到足够的内存)

PS:就是常理解的,栈中存放局部变量。

3.本地方法栈

        为虚拟机使用的Native方法服务。

       有的虚拟机将其与java虚拟机栈合并-----Sun HotSpot

4.Java堆(Heap)

        所有线程共享的一块内存区域。

        存放对象实例、数组。

5.方法区(Method Area,Non-Heap

       存储已经被虚拟机加载的信息:类信息、常量、静态变量、即时编译器编译后的代码 等。

       各个线程共享的内存区域。

      *运行时常量池(方法区的一部分)

        编译期生成的各种字面量和符号引用


JVM 每遇到一个线程,就为其分配一个 Program Counter Register(程序计数器) ,   VM Stack(虚拟机栈)和Native Method Stack  (本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说只发生在Heap上)的原因。





0 0