关于JVM 内存(牛客网)

本文详细介绍了JVM内存区域划分,包括线程共享区域(如方法区和堆)及非线程共享区域(如程序计数器、虚拟机栈和本地方法栈)。探讨了这些区域在Java程序执行过程中的作用及其生命周期。

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

大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) ,   VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的),Native Method Stack  ( 本地方法栈 ),其中Method Area 和  Heap 是线程共享的  ,VM Stack,Native Method Stack  和Program Counter Register  是非线程共享的。为什么分为 线程共享和非线程共享的呢?请继续往下看。

首先我们熟悉一下一个一般性的 Java 程序的工作过程。一个 Java 源程序文件,会被编译为字节码文件(以 class 为扩展名),每个java程序都需要运行在自己的JVM上,然后告知 JVM 程序的运行入口,再被 JVM 通过字节码解释器加载运行。那么程序开始运行后,都是如何涉及到各内存区域的呢?

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

来源:牛客网

1)  方法区( Method Area ):存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据;
2)  堆( Heap ):存放对象实例,几乎所有对象实例都在这里分配内存;
3)  虚拟机栈( VM Stack ):描述的是 Java 方法执行的内存模型,每个方法在执行的同时会创建一个 Stack Frame (方法运行时的基础数据结构)用于存储局部变量表、操作数栈、动态连接、方法出口等信息;
4)  本地方法栈( Native Method Stack ):与虚拟机栈类似,不过则为虚拟机使用到的 Native 方法服务。(有的虚拟机譬如 Sun HotSpot 虚拟机直接把本地方法栈和虚拟机栈合二为一);
5)  程序计数器( Program Counter Register ):可看作当前线程所执行的字节码的行号的标识器;

 

JVM内存模型图

 

转载于:https://www.cnblogs.com/Absorbed/p/8376948.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值