java架构师面试题:描述以下jvm的内存区域

    程序计数器(PC,ProgramCounterRegister)。在JVM规范中,每个线程都有其自己的程序计数,并且线程在任何时间都只有一个正在执行的方法,这就是所谓的当前方法。程序计数将存储当前线程正...

    程序计数器(PC,ProgramCounterRegister)。在JVM规范中,每个线程都有其自己的程序计数,并且线程在任何时间都只有一个正在执行的方法,这就是所谓的当前方法。程序计数将存储当前线程正在执行的Java方法的JVM指令地址;或者,如果它正在执行本机方法,则是未指定值(undefined)。

attachments-2020-09-Yq07n74b5f5b5ff602109.jpg

    Java虚拟机栈(JavaVirtualMachineStack),在早期也称为Java栈。创建每个线程时,将创建一个虚拟机栈,该机栈存储与Java方法调用相对应的机栈框架(StackFrame)。在谈到程序计数时,我提到了当前的方法。同样,在某个时间点上,只有一个活动机栈帧,通常称为当前帧,而方法所在的类称为当前类。如果在此方法中调用其他方法,则将创建相应的新机栈框架并成为新的当前框架,直到返回结果或执行结束。JVM在Java机栈上只有两个直接操作,即推入和弹出机栈框架。机栈框架存储本地更改表,操作数(操作数)堆栈,动态链接,方法的正常退出或异常退出的定义等。


    堆是Java内存管理的核心领域,用于放置Java对象。几乎所有创建的Java对象都直接分配在堆上。堆由所有线程共享。当虚拟机启动时,诸如“Xmx”之类的参数用于指定诸如最大堆空间之类的指示符。理当然,堆也是垃圾收集器关注的领域,所以堆中的空间将被同一垃圾收集器进一步细分为行,最著名的是新一代和老年一代的划分。。


    方法区(MethodArea)。这也是所有线程共享的一块内存区域,用于存储所谓的元(Meta)数据,例如类结构信息,以及对应的运行时常量池、字段、方法代码等。由于早期的HotspotJVM实现,很多人习惯于将方法区称为永久代(PermanentGeneration)。OracleJDK8中将永久代移除,同时增加了元数据区(Metaspace)。


    运行时常量池(Run-TimeConstantPool),这是方法区的一部分。如果仔细分析过反编译的类文件结构,你能看到版本号、字段、方法、超类、接口等各种信息,还有一项信息就是常量池。Java的常量池可以存放各种常量信息,不管是编译期生成的各种字面量,还是需要在运行时决定的符号引用,所以它比一般语言的符号表存储的信息更加宽泛。


    本地方法栈(NativeMethodStack)。它和Java虚拟机栈是非常相似的,支持对本地方法的调用,也是每个线程都会创建一个。在OracleHotspotJVM中,本地方法栈和Java虚拟机栈是在同一块儿区域,这完全取决于技术实现的决定,并未在规范中强制。

推荐阅读:java架构师指南之架构师的工作流程

0 条评论

请先 登录 后评论
JAVA Q&A
JAVA Q&A

173 篇文章

作家榜 »

  1. JAVA Q&A 173 文章
  2. 江南 1 文章
  3. 伯乐 0 文章
  4. 孤存 0 文章
  5. q21164340 0 文章
  6. 赫敏12 0 文章
  7. 子牙 0 文章
  8. 赫敏 0 文章