Java多线程基础(1)Java程序运行原理

本文详细介绍了JVM的内存布局,包括线程共享的数据区如方法区和堆内存,以及线程独占的虚拟机栈、本地方法栈和程序计数器。探讨了这些区域在JVM中的作用和管理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当JVM加载class文件的字节码时,会为class分配一个JVM运行时数据区。
数据区包含方法区(类的方法),堆内存(类的对象),虚拟机栈,本地方法栈,程序计数器。

其中方法区、堆内存是线程共享的,虚拟机栈、本地方法栈、程序计数器是线程独占的。

线程共享:所有线程都能访问,随虚拟机或GC而创建和销毁。

线程独享:线程独立拥有的空间,随线程的生命周期创建和销毁。

方法区

JVM用来存储加载的类信息,常量,静态变量,编译后的代码等数据。

虚拟机规范中,这是个逻辑区划,不同的虚拟机有不同的具体实现。

比如:oracle的HotSpot在java7中方法区放在永久代,java8放在元数据空间,并且通过GC机制对这个区域进行管理。

堆内存

堆内存还可细分为:老年代,新生代(Eden、From Survivor、To Survivor),在JVM启动时创建,存放对象的实例。

GC主要就是管理堆内存。如果满了会出现OutOfMemoryError。

虚拟机栈

每个线程都在虚拟机栈有个私有的空间。

线程栈由多个栈帧(Stack Frame)组成。

一个线程会执行一个或多个方法,一个方法对应一个栈帧

栈帧内容包含:局部变量表,操作数栈,动态链接,方法返回地址,附加信息等

栈内存默认最大1M,超出则抛出StackOverflowError

本地方法栈

虚拟机栈是为虚拟机执行Java方法准备的,本地方法栈则是虚拟机执行Native方法准备的

虚拟机规范没有规定具体的实现,由不同虚拟机厂商实现。HotSpot中,本地方法栈和虚拟机栈的实现是一样的,栈内存默认最大1M,超出则抛出StackOverflowError

程序计数器

记录当前线程执行字节码的位置,存储的是字节码指令地址,如果执行Native方法,则计数器值为空

每个线程都在这个空间有个私有的空间,占用内存很少

CPU同一时间只会执行一条线程中的指令。JVM多线程会轮流切换并分配CPU执行,线程切换后,需要通过程序计数器,恢复正确的执行位置。

转载于:https://www.cnblogs.com/filozofio/p/10344536.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值