0%

常见面试题的基础总结(JVM篇)

由于这些内容都是比较早之前进行的整理的,所以有的部分是参考了他人的博文,但是由于是之前找的,所以具体的博文链接找不到了,如果原博主看到这个文章或者有人知道其中部分内容的原博文,请与我联系,我将加上原链接,谢谢


1、为什么Java一次编译,到处可运行

  • 因为只需要将java文件编译成字节码文件,在运行平台只要有JVM虚拟机就可以运行。这样Java在不同的平台也不需要重新编译,只需要虚拟机把字节码文件转换成具体平台的机器指令。

2、JVM是如何加载文件的

  • 首先对于字节码文件,使用Class Loader将class文件记载到内存中。然后使用Exction Engine对命令进行解析。对于使用了不同开发文件的原生库我们可以使用Native interface来为Java所用。

3、Java反射机制

  • 对于任何一个类,我们都可以知道这个类的所有属性和方法,对弈任何一个对象我们都能调用他的任意方法和属性。这种动态获取信息以及动态调用对象的方法就是成为Java语言的反射机制。

4、Class Loader

  • Class Loader在Java中有着非常重要的作用,它主要工作在Class装载的加载过程,主要作用是从系统外获取Class的二进制数据流。所有的class都是由他来加载很系统,然后交给虚拟机进行连接初始化等操作。过程为加载-链接(校验-准备-解析)-初始化

5、loadClass和forName区别

  • 对于loadClass没有链接,而forName获取的是已经初始化的。优点就是没有链接初始化可以减少资源浪费,需要的时候再进行初始化。

6、JVM内存模型

主要分为程序计数器,虚拟机栈,本地方法栈 这几个是线程私有的。
而堆(包含常量池,数组和类对象)以及MetaSpace(类加载信息)是线程共享的。

  • 程序计数器:记录当前线程执行的字节码行号的指示器,通过改变这个值来选取下一条需要执行的字节码指令。和线程是一对一的关系即“线程私有”的,对于Native方法计数为Undefine

  • Java虚拟机栈:包含Java方法执行的内存模型,包含多个栈帧。每个栈帧都含有局部变量表,操作栈还有动态连接,返回地址等数据

这里写图片描述

  • 本地方法栈:与虚拟机栈相似,主要作用是标注了native方法

  • 局部变量存储的是方法执行过程中的所有变量。
    操作数栈:入栈、出栈、复制、交换、产生消费变量


7、递归为什么会引发StackOverFlowError异常

  • 多次递归一直入栈超出虚拟栈深度

8、JVM三大性能调优参数

  • -Xss规定虚拟栈大大小
  • -Xms堆的初始值
  • -Xmx堆能达到的最大值

9、Java内存模型中的堆和栈的区别-内存分配策略

  • 静态存储:编译时确定每个数据目标在运行时的存储空间需求
  • 栈式存储:数据区需求在编译时未知,运行时模块入口确定
  • 堆式存储:编译时或者运行时入口都无法确认,动态分配

10、堆和栈的关系与区别

  • 联系:
    • 引用对象或者数组时,栈中变量保存的是堆中目标的首地址
  • 区别:
    • 管理方式:栈自动释放,堆需要GC
    • 空间大小:栈比堆小
    • 碎片相关:栈产生的随便远小于堆
    • 分配方式:栈支持动态和静态分配,而堆仅支持动态分配
    • 效率:因为底层数据结构不同所以栈效率高于堆

11、元空间、堆、栈、线程独占部分的联系——————内存角度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class HelloWorld{
private String name;
public void sayHello(){
System.out.println("Hello" + name);
}
public void setName(String name){
this.name = name;
}
public static void main(String[] args) {
int a = 1;
HelloWorld hw = new HelloWorld();
hw.setName("test");
hw.sayHello();
}
}

引用参数
本地变量
局部变量

这里写图片描述