【深入了解JVM】 1.JVM运行时的数据区

本文详细解析了JVM的六大内存区域:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和运行时常量池。探讨了各区域的功能、生命周期、异常处理及内存配置。

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

JVM包含以下及格数据区域:程序计数器,Java虚拟机栈,本地方法栈,Java堆,方法区,运行时常量池;

  • 程序计数器(线程私有,内存空间较小):

        是当前线程所执行的字节码的行号指示器。在JVM中,字节码解释器工作时,是通过改变这个计数器的值来获取下一条执行的字节码指令。

        由于JVM的多线程是通过线程轮流切换并分配执行时间来实现的,为了线程切换时能够恢复到正确的位置,每个线程都需要一个独立的程序计数器。

       程序计数器是唯一一个在JVM中没有规定任何OutOfMemoryError情况的区域。

  • Java虚拟机栈(线程私有,生命周期与线程相同):

        主要是在java方法执行时,记录相关的信息(如:存储局部变量表、操作数栈、动态链接、方法出口等)。

        生命周期:方法调用(入栈)---->执行结束(出栈)

       可通过-Xss来扩展

       可能会出现的异常:

                                  1.StackOverflowError:线程所请求的栈的深度大于虚拟机所允许的深度

                                  2.OutOfMemoryError:虚拟机栈动态扩展时无法申请到足够的内存

  • 本地方法栈

        执行Native方法。

        有些虚拟机(如HotSpot)会将本地方法栈与虚拟机栈合二为一。

       可通过-Xss来扩展

        与虚拟机栈的区别:本地方法栈执行的是Native方法,虚拟机栈执行是Java方法(即字节码)

        可能会出现的异常,见虚拟机栈

  • Java堆(JVM中内存最大的一块,也是所有线程共享的区域):

        存放对象实例以及数组。同时也是垃圾处理器管理的主要区域,也被称为GC堆。

        可以通过-Xmx和-Xms来扩展内存。

        可能会出现的异常:OutOfMemoryError,主要是堆内存无法扩展时会出现。一般后面会跟着‘Java heap space’提示。

  • 方法区(是所有线程共享的区域):

        存储已被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。也被人称为永久代。

        可通过-XX:PermSize =10M和-XX:MaxPermSize=10M来限制大小

        可能会出现的异常:OutOfMemoryError,当方法区无法满足内存分配需求,会报出此error

  • 运行时常量池(是方法区的一部分):

        存储编译期生成的字面量和符号引用。

        通过-XX:PermSize =10M和-XX:MaxPermSize=10M来限制大小

        可能会出现的异常,与方法区相同

其中程序计数器、虚拟机栈、本地方法栈是随线程而生,随线程而灭,因此生命周期与线程相同,是线程私有的。

Java堆、方法区、运行时常量池是所有线程共享的区域

内容主要来自【深入了解Java虚拟机】一书。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值