面试题专题:jvm的堆和栈

167 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

摘要

本次分享面试题专题均为自己21届校招时通过牛客以及自己面试遇到的问题,答案均为自己理解整理,如果有错误,请麻烦评论指出,万分感谢,如对您有所帮助,请交出您的三连或者点赞也是爱♥

Jvm的运行时数据区?

线程共享:堆,方法区(元空间)

线程私有:本地方法栈,虚拟机栈,程序计数器

堆、栈的区别

  1. 栈内存存储的是局部变量而堆内存存储的是实体;
  1. 栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;
  1. 栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

JVM堆的底层

老年代和新生代:老年代默认占2/3,年轻代默认1/3,其中年轻代又分围Eden区(占8/10)和survivor区(分为相等的 s1,s2),

对象进入堆后会先去Eden区,若Eden满了,则会触发Mintor gc,对不在GC root引用链的对象进行回收,在引用链的会移动到空的s1或者s2,并给其年龄+1,下次Eden满的时候,会和survivor一起判断哪些属于垃圾对象,比如若s1中又对象,则将不是垃圾的移到s2,垃圾清除,年龄再次+1,若年龄达到16(在Hospot中,Java的对象头Markword中分配了4个bit来存对象的分代年龄(所以范围是0~15,可用JVM参数设置,但不能超出这个范围),则会进入老年代,若老年代满了的话,就会触发full gc,进行full gc时会将所有线程暂停(stop the world)简称STW,而jvm优化就是让STW尽可能的少发生。

JVM栈的底层

栈内部有栈帧,栈帧是调用某个方法,存放此方法局部变量的区域,栈帧内又有局部变量表、操作数栈、方法出口

局部变量表:存放变量与变量的值的对应表,比如存放a=1;

操作数栈:用来给变量赋值,赋值完成后存放到局部变量表;

方法出口:标识本方法执行完后应该返回到main方法的具体哪一行代码