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


(图来自网络)

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上)的原因。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值