Java面试八股之简述JVM内存结构

  1. 简述JVM内存结构

Java虚拟机(JVM)内存结构主要分为线程私有区域和线程共享区域两大部分,具体组成部分如下:

 线程私有区域

程序计数器(Program Counter Register):

记录当前线程执行的字节码行号,用于跟踪下一条需要执行的指令。

占用空间小,几乎不会发生内存溢出(Out Of Memory,OOM)。

虚拟机栈(Java Virtual Machine Stacks):

每个线程都有自己的栈,用于存储方法调用时的信息,包括局部变量表、操作数栈、动态链接、方法出口等。

栈帧随着方法的调用和返回而入栈和出栈。

栈的大小可以固定也可以动态扩展,但动态扩展时若无法申请到足够的内存会抛出StackOverflowError或OutOfMemoryError。

本地方法栈(Native Method Stacks):

与虚拟机栈类似,但服务于本地(Native)方法,即用非Java语言编写的方法。

同样可能抛出StackOverflowError或OutOfMemoryError。

线程共享区域

堆(Heap):

JVM中最大的一块内存区域,用于存储几乎所有的对象实例和数组。

分为年轻代(Young Generation)和老年代(Old Generation)。

年轻代进一步分为Eden区和Survivor区(由两个相同大小的From Space和To Space组成)。

对象创建发生在年轻代的Eden区,经过多次GC幸存的对象会被移动到老年代。

若堆内存不足,会抛出OutOfMemoryError。

方法区(Method Area):

存储类的元数据信息,如类的结构(如字段、方法信息)、运行时常量池、静态变量等。

在Java 8之前,永久代(Permanent Generation)是方法区的实现,之后被元空间(Metaspace)取代。

元空间使用本地内存,不再受Java堆大小的限制,但过度使用仍会导致OutOfMemoryError。

运行时常量池(Runtime Constant Pool):

方法区的一部分,存放编译期生成的各种字面量和符号引用,如字符串字面量、类名、方法名等。

动态常量池,能够在运行期间将新的常量放入池中。

总结来说,JVM内存结构设计精巧,通过区分线程私有和共享区域,以及细致划分各个区域的功能,确保了Java程序的高效、安全运行。

 如果大家需要视频版本的讲解,欢迎关注我的B站:

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值