JVM理解(二)

上一节了解完类加载机制后,继续学习JVM

HotSpot虚拟机是Sun/OracleJDK和OpenJDK中默认的Java虚拟机,也是目前使用范围最广的Java虚拟机。

 一起学习一下Runtime Data Area吧~


Runtime Data Area(运行时数据区)

进程生命周期

以下这些区域存储的数据是被当前进程中所有线程所共享的,所以这些数据是非安全性的

  • MethodArea(方法区)
    • 又称Class Template类模板,存放类对象,常量,静态变量
  • Heap(堆)
    • 存放的是class对象(new ThreadDemo())对象实例

线程生命周期

存活时间是和线程绑定一期的,每个线程都有以下三个区域,这些区域数据是私有的线程安全的

  • Java虚拟机栈
    • ​​​​​​​一个方法被执行,一个栈桢就会被创建
    • 由于栈是先进后出,所以限制性的方法一定是结束于后执行的方法
    • 栈中的每一个元素被称为栈桢
      • 局部变量表(存储局部变量,如果是类方法,下标从0开始,如果是普通方法,下标从1开始,0存储的是this)
      • 操作数栈(存、取数据)
      • 动态链接(符号引用转换成直接引用 [非常量池])
      • 方法的返回地址(正常或者异常)

思考:如果add方法是一个递归方法,会被压栈几次呢?当然是多次!

  • 本地方法栈
    • ​​​​​​​执行native方法的栈(native修饰的方法)
  • 程序计数器
    • ​​​​​​​Java虚拟机可以支持多线程同时执行,每一个Java虚拟机线程都会有自己的PC Register,为了记录执行的位置。PC Register记录当前线程执行的方法所在的地址。下一次就可以从这个地址获取内容继续执行了。

 问题

     不管是栈还是堆,都是有大小的,不够的情况怎么办?

  1. 对这些区域进行垃圾回收。
  2. 如果回收不掉,或者依然不够,抛出OOM 异常,堆的话还会抛出StackOverFlowError。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值