哈喽!大家好,我是小奇,一个专给面试官添堵的撑序员
小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】更有我为大家准备的福利哟!
文章目录
- 一、前言
- 二、面试
- 三、总结
一、前言
最近关注一个公司好久了, 但是他们居然说已经招收到合适的人了,那我肯定不能坐以待毙。。。
二、面试
面试官:我看你简历上写的精通Java虚拟机?
我:准确来说不是精通,而是登峰造极。
面试官:那你说一下JVM虚拟机的内存模型吧
我:JVM虚拟机中有一个运行时数据区,里面主要分为程序计数器、虚拟机栈、本地方法栈、堆、方法区
面试官:能不能详细介绍一下这几个区域都是干什么的吗
1.程序计数器:简单来说每一个线程在执行代码的时候执行到哪一行是有一个记录的,比如线程A执行到代码第10行了这个时候在线程A中是有一个程序计数器来记录10这一行。程序计数器在线程中是私有的。那么他有什么好处呢?虽然我们开发的时候可以使用多线程来开发,但是CPU在执行A线程的时候B线程就需要等待,等到CPU去执行A线程的时候B线程又需要等待了,所以说如果这个时候CPU去执行B线程,那么执行完后再回来执行A线程的时候就知道之前执行到哪一行了,可以从这一行接着执行。
2.虚拟机栈:与程序计数器一样,虚拟机栈也是线程私有的,虚拟机是栈是存放执行方法的时候用到的一些信息,例如在执行方法的时候虚拟机就会创建一个栈帧用于存储局部变量表(表里是局部变量)、操作数栈(如果要进行一些数的计算,那么会把数先读取到操作数栈中进行操作最后赋值到局部变量表中)、动态链接、方法出口等信息。
3.堆:堆是线程共享的,堆是虚拟机所管理的内存中最大的一块,一般优化就是优化这块内存,比如我们Student st = new Student();那么我们新创建出来的对象就在堆内存里。
4.本地方法栈:本地方法栈是用来执行本地方法的时候所使用的,例如Java中我们会看到很多Native方法,这些方法使用例如c语言写的,Java中只是调用。
5.方法区:方法区是线程共享的,它用于存储已被虚拟机加载的类型信息、常量、静态变量等。在方法区中还包含一个运行时常量池部分,这一部分用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中,所谓符号引用其实就是将一个例如main方法这个方法引用转化为指针应用,可以更加快速的找到这个方法在磁盘中的真正位置
面试官:确实有些东西,那你继续关注我们公司吧,等有空位了你再来?
我:奸商啊。。。
三、总结
文章后面持续更新,建议收藏。
文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。
如果觉得我的文章还不错的话就点个赞吧,另外可以微信搜索【小奇JAVA面试】的好文章,获取我为大家准备的资料。