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

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

bbf2af8120b7bee9129c4b23bbe2e3f9.png

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值