当前位置:   article > 正文

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

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站:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/753287
推荐阅读
相关标签
  

闽ICP备14008679号