转载

这些年面试必问的问题-JVM内存区域

这些年面试必问的问题-JVM内存区域

上面的思维导图已经包含了常见面试题答案,下面是一些可能会出现的面试题。

当线程执行的是一个Native方法,程序计数器记录的是啥?Java方法呢?

Java:正在执行的虚拟字节码指令的地址
  Native:计数器的值为空(Undefined)

程序计数器为啥要记录正在执行的字节码指令当前行号?(或者为什么程序计数器为什么是私有的?)

由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各条线程之间计数器互不影响,独立存储

为啥程序计数器不会OOM?

因为记录的是行号(指令的偏移地址),当执行到下一个指令时,改变的是当前保存的值,不需要去申请新的内存去保存。所以是永远不会内存溢出的

栈帧是什么?

栈帧(Stack Frame) 是用于虚拟机执行时方法调用和方法执行时的数据结构,它是虚拟栈数据区的组成元素。每一个方法从调用到方法返回都对应着一个栈帧入栈出栈的过程。

能讲一讲局部变量表中的索引顺序吗?

分两种情况,静态方法和非静态方法。非静态方法中索引顺序为对象实例方法的引用(this)-->参数列表-->方法内部定义的变量;静态方法是从参数列表开始的,因为静态方法无法关联到任何一个实例。

所有的对象都在堆上分配吗?

不一定。具体可参考这篇文章(我觉得有个大致概念即可):[原创|面试官:Java对象一定分配在堆上吗?](https://blog.csdn.net/dam454450872/article/details/103094629?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-3&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-3)。

为什么要将永久代(PermGen)替换为元空间(MetaSpace)呢?

整个永久代有一个 JVM 本身设置固定大小上线,无法进行调整,而元空间使用的是直接内存,受本机可用内存的限制,并且永远不会得到java.lang.OutOfMemoryError。你可以使用-XX:MaxMetaspaceSize标志设置最大元空间大小,默认值为 unlimited,这意味着它只受系统内存的限制。-XX:MetaspaceSize调整标志定义元空间的初始大小如果未指定此标志,则 Metaspace 将根据运行时的应用程序需求动态地重新调整大小。当然这只是其中一个原因,还有很多底层的原因,这里就不提了。
原文  https://segmentfault.com/a/1190000022419339
正文到此结束
Loading...