⾯试的java如何说未来规划_2020年⾯试官最喜欢问的16道
Java内存模型⾯试题,20。。。
前⾔
对于⼀名 Java ⼯程师来说,JVM 可以说是⾯试必问的⼀个知识点,⽽⼤多数⼈可能没有对 JVM 的实际开发和使⽤经验,毕竟在⼯作中⽤到的很少,甚⾄说没有接触过,但是在我们技术晋升时,我们必须对 JVM 理解,知道它是什么?在项⽬中遇到性能问题⼜该怎么做?这⼀篇⽂章将带你深⼊了解 JVM 需要掌握的各个知识点。这也将帮助你完成从对 JVM 零接触到深⼊理解的转变,⼩编这⾥还整理了⼀份详细的JVM性能优化的思维导图,需要的朋友可以点击看看呢,关注:麒麟改bug。
Java内存模型
1. 我们开发⼈员编写的Java代码是怎么让电脑认识的
⾸先先了解电脑是⼆进制的系统,他只认识 01010101
⽐如我们经常要编写 HelloWord.java 电脑是怎么认识运⾏的
HelloWord.java是我们程序员编写的,我们⼈可以认识,但是电脑不认识
Java⽂件编译的过程
1. 程序员编写的.java⽂件
2. 由javac编译成字节码⽂件.class:(为什么编译成class⽂件,因为JVM只认识.class⽂件)
3. 在由JVM编译成电脑认识的⽂件 (对于电脑系统来说 ⽂件代表⼀切)
2. 为什么说java是跨平台语⾔
这个夸平台是中间语⾔(JVM)实现的夸平台
Java有JVM从软件层⾯屏蔽了底层硬件、指令层⾯的细节让他兼容各种系统
难道 C 和 C++ 不能夸平台吗 其实也可以 C和C++需要在编译器层⾯去兼容不同操作系统的不同层⾯,写过C和C++的就知道不同操作系统的有些代码是不⼀样
3. Jdk和Jre和JVM的区别
Jdk包括了Jre和Jvm,Jre包括了Jvm
Jdk是我们编写代码使⽤的开发⼯具包
Jre 是Java的运⾏时环境,他⼤部分都是 C 和 C++ 语⾔编写的,他是我们在编译java时所需要的基础的类库
Jvm俗称Java虚拟机,他是java运⾏环境的⼀部分,它虚构出来的⼀台计算机,在通过在实际的计算机上仿真模拟各种计算机功能来实现Java应⽤程序
看Java官⽅的图⽚,Jdk中包括了Jre,Jre中包括了JVM
4. 说⼀下 JVM由那些部分组成,运⾏流程是什么?
JVM包含两个⼦系统和两个组件: 两个⼦系统为Class loader(类装载)、Execution engine(执⾏引擎); 两个组件为Runtime data
area(运⾏时数据区)、Native Interface(本地接⼝)。
Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)来装载class⽂件到
Runtime data area中的method area。
Execution engine(执⾏引擎):执⾏classes中的指令。
Native Interface(本地接⼝):与native libraries交互,是其它编程语⾔交互的接⼝。
Runtime data area(运⾏时数据区域):这就是我们常说的JVM的内存。
流程 :⾸先通过编译器把 Java 代码转换成字节码,类加载器(ClassLoader)再把字节码加载到内存中,将其放在运⾏时数据区(Runtime data area)的⽅法区内,⽽字节码⽂件只是 JVM 的⼀套指令集规范,并不能直接交给底层操作系统去执⾏,因此需要特定的命令解析器执⾏引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执⾏,⽽这个过程中需要调⽤其他语⾔的本地库接⼝(Native Interface)来实现整个程序的功能。
5. 说⼀下 JVM 运⾏时数据区
Java 虚拟机在执⾏ Java 程序的过程中会把它所管理的内存区域划分为若⼲个不同的数据区域。这些区域都有各⾃的⽤途,以及创建和销毁的时间,有些区域随着虚拟机进程的启动⽽存在,有些区域则是依赖线程的启动和结束⽽建⽴和销毁。Java 虚拟机所管理的内存被划分为如下⼏个区域:
简单的说就是我们java运⾏时的东西是放在那⾥的
程序计数器(Program Counter Register):当前线程所执⾏的字节码的⾏号指⽰器,字节码解析器的⼯作是通过改变这个计数器的值,来选取下⼀条需要执⾏的字节码指令,分⽀、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成;
为什么要线程计数器?因为线程是不具备记忆功能
Java 虚拟机栈(Java Virtual Machine Stacks):每个⽅法在执⾏的同时都会在Java 虚拟机栈中创建⼀个栈帧(Stack Frame)⽤于存储局部变量表、操作数栈、动态链接、⽅法出⼝等信息;
栈帧就是Java虚拟机栈中的下⼀个单位
本地⽅法栈(Native Method Stack):与虚拟机栈的作⽤是⼀样的,只不过虚拟机栈是服务 Java⽅法的,⽽本地⽅法栈是为虚拟机调⽤Native ⽅法服务的;
Native 关键字修饰的⽅法是看不到的,Native ⽅法的源码⼤部分都是 C和C++ 的代码
Java 堆(Java Heap):Java 虚拟机中内存最⼤的⼀块,是被所有线程共享的,⼏乎所有的对象实例都在这⾥分配内存;
⽅法区(Methed Area):⽤于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
mybatis面试题2020
后⾯有详细的说明JVM 运⾏时数据区
6. 详细的介绍下程序计数器?(重点理解)
1. 程序计数器是⼀块较⼩的内存空间,它可以看作是:保存当前线程所正在执⾏的字节码指令的地址(⾏号)
2. 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执⾏时间的⽅式来实现的,⼀个处理器都只会执⾏⼀条线程中的指令。因此,为了线程切换后能恢复到正确的执⾏位置,每条线程都有⼀个独⽴的程序计数器,各个线程之间计数器互不影响,独⽴存储。称之
为“线程私有”的内存。程序计数器内存区域是虚拟机中唯⼀没有规定OutOfMemoryError情况的区域。
总结:也可以把它叫做线程计数器
**例⼦:**在java中最⼩的执⾏单位是线程,线程是要执⾏指令的,执⾏的指令最终操作的就是我们的电脑,就是 CPU。在CPU上⾯去运⾏,有个⾮常不稳定的因素,叫做调度策略,这个调度策略是时基于时间⽚的,也就是当前的这⼀纳秒是分配给那个指令的。
假如:
线程A在看直播
7. 详细介绍下Java虚拟机栈?
⼀个⽅法调⽤另⼀个⽅法,会创建很多栈帧吗?
栈指向堆是什么意思?
递归的调⽤⾃⼰会创建很多栈帧吗?
8. 你能给我详细的介绍Java堆吗?(重点理解)
9. 能不能解释⼀下本地⽅法栈?
10. 能不能解释⼀下⽅法区(重点理解)
11. 什么是JVM字节码执⾏引擎
12. 你听过直接内存吗?
13. 知道垃圾收集系统吗?
14. 堆栈的区别是什么?
15. 深拷贝和浅拷贝
浅拷贝(shallowCopy)只是增加了⼀个指针指向已存在的内存地址,
深拷贝(deepCopy)是增加了⼀个指针并且申请了⼀个新的内存,使这个增加的指针指向这个新的内存,
浅复制:仅仅是指向被复制的内存地址,如果原地址发⽣改变,那么浅复制出来的对象也会相应的改变。
深复制:在计算机中开辟⼀块新的内存地址⽤于存放复制的对象。
16. Java会存在内存泄漏吗?请说明为什么?
内存泄漏是指不再被使⽤的对象或者变量⼀直被占据在内存中。理论上来说,Java是有GC垃圾回收机制的,也就是说,不再被使⽤的对象,会被GC⾃动回收掉,⾃动从内存中清除。
但是,即使这样,Java也还是存在着内存泄漏的情况,java导致内存泄露的原因很明确:长⽣命周期的对象持有短⽣命周期对象的引⽤就很可能发⽣内存泄露, 尽管短⽣命周期对象已经不再需要,但是因为长⽣命周期对象持有它的引⽤⽽导致不能被回收 ,这就是java中内存泄露的发⽣场景。
总结
最后来⾃⼩编的福利
以上⾯试题及资料⼩编以及整理成⽂档【附答案】这⾥还总结了 Java虚拟机(JVM)⾯试题 51道+Java虚拟机:JVM⾼级特性与最佳实践400多页的资料、spring、mybatis、jvm,Zookeeper,spring】 关注:麒麟改bug ,编程的世界永远向所有热爱编程的⼈开放,这是⼀个⾃由,平等,共享的世界,我始终是这样坚信的。