运行时数据区(1)——程序计数器和虚拟机栈概述

本文深入探讨了Java运行时数据区,包括本地方法栈、虚拟机栈、程序计数器等。强调了线程在Java中的角色,解释了程序计数器在多线程环境中的作用,以及虚拟机栈对于Java指令执行的影响。此外,还讨论了栈帧在方法调用中的功能和栈溢出、内存不足等异常情况。
摘要由CSDN通过智能技术生成

学完了类加载器,现在开始学习Java运行时数据区

运行时数据区

Java之所以能够跨平台,JVM功不可没。Java程序“一次编写到处运行”正是基于不同平台上底层JVM的不同。不同的JVM对于内存的划分方式和管理机制存在着部分差异
一个JVM就是一个进程,一个Java进程对应一个运行时数据区。运行时数据区主要包括五部分:本地方法栈、虚拟机栈、方法区、堆区、程序计数器。其中,虚拟机栈、本地方法栈和程序计数器属于线程私有,一个线程对应一份,方法区和堆区是多线程共享的。

线程

在学习Java基础部分时已经了解过线程、进程等概念,现在学习Java虚拟机,从虚拟机角度进一步剖析线程
(1)线程是程序里的一个执行单元
(2)在Hotspot JVM中,每个线程与操作系统本地的一个线程直接映射。当一个Java线程准备就绪后,此时操作系统本地线程也会创建。Java线程终止后,操作系统本地线程也会被回收。一旦本地线程初始化成功,它会调用Java线程的run方法,从而启动Java线程。
(3)Java中的线程分为用户线程和守护线程。当一个JVM进程的最后一个用户进程退出后,JVM进程会被操作系统退出。

程序计数器(PC寄存器)

JVM的程序计数器是对物理PC寄存器的抽象模拟
作用:PC寄存器用来存储指向下一条指令的地址,由执行引擎读取下一条字节码指令。
PC寄存器是线程私有的,每个线程各有一份。

PC寄存器工作原理图
PC寄存器存放下一条指令的地址,是一块很小的内存空间,线程私有。任何一个线程都只有一个方法在执行,这个方法被称为“当前方法”,PC寄存器存储的便是当前方法的JVM指令地址。如果当前方法是native方法,则PC寄存器是未指定值因为native方法是调用本地C++程序,Java体系的PC寄存器获取不到native方法的指令地址。
PC寄存器是JVM规范中没有规定OOM错误的区域,也不存在垃圾回收(GC)问题。

两个关于PC寄存器的常见问题
1、使用PC寄存器存储字节码指令地址有什么用?
答:因为CPU需要不停地在各个线程之间频繁切换。当从一个线程切换到另一个线程时,需要知道从哪开始继续执行,因此需要程序计数器来保存待执行的指令地址
2、PC寄存器为什么是线程私有的?
答:因为多个线程的执行任务和进度不同,为防止线程之间互相干扰,所以每个线程都有单独一份寄存器来保存志林大哥地址。

虚拟机栈概述

(1)Java指令都是根据栈来设计的
这种方式的优点是可以跨平台、指令集小,缺点是性能下降、完成同样的任务相对于寄存器结构而言指令多。
(2)栈与堆的区别
栈是运行时单位,解决怎么运行程序问题;堆是存储单位,解决数据存储问题(当然,栈中也会存放局部变量、对象的引用地址等)
(3)每一个栈对应一个线程,是线程私有的,生命周期与线程的生命周期相同。
(4)栈的内部基本单位:栈桢一个栈桢对应有于一个Java方法,方法的调用会涉及压栈、弹栈等操作
(5)栈的作用:保存局部变量、部分结果,并参与方法的调用和返回,主管Java程序的运行
(6)优点:访问速度快(仅次于PC寄存器的访问速度)、JVM对栈的操作只有两个(压栈和弹栈)、栈不存在垃圾回收问题(但是存在OOM问题)
(7)栈可能出现的异常
首先需要知道,Java栈的大小是动态的或固定不变的
如果栈的动态大小的,则可能会出现OutOfMemoryError异常,这种异常出现的原因是栈在动态扩容时内存不够用了,会抛出这个错误终止Java虚拟机

如果栈的大小是固定不变的,可能会出现栈溢出:StackOverflowError异常,比如死递归就会造成栈溢出

扩展:如何动态设置栈的内存大小?
“-Xss size”指令可以用来设置栈的大小,其中size的默认单位为byte
举例:-Xss256k表示将栈的大小设置为256KB

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值