JVM面试题--基础版
谈谈你对JAVA的理解 |
平台无关性,GC,语言特性,面向对象,类库,异常处理 |
平台无关性如何实现? |
JAVA源码首先被编译成字节码,再由不同平台的JVM进行解析,JAVA语言在不同的平台上运行时不需要进行重新编译,JAVA虚拟机在执行字节码的时候,把字节码转换成具体平台上的机器指令 |
为什么JVM不直接将源码解析成机器码去执行 |
每次执行都需要语句,句法,语义的各种检查 提高兼容性:也可以将别的语言解析成字节码 |
JVM如何加载.class文件 |
使用ClassLoader依据特定格式将class文件加载到Runtime Data Area内存中,使用Execution Engine解析文件的字节码,并提交给操作系统去执行 Class Loader:依据特定格式,加载class文件到内存中 Execution Engine【解释器】:对命令进行解析 Native Interface:融合不同开发语言的原生库为JAVA所用 Runtime Data Area:JVM内存空间结构模型 |
谈谈反射 |
在运行时分析类的能力 在运行时查看对象 实现通用的数组操作代码 利用Method对象,这个对象很像c++中的函数指针,反射机制允许你调用任意方法 反射是一种功能强大且复杂的机制,使用它的主要人员是工具构造者,而不是应用程序员 |
类从编译到执行的过程 |
编译器将Robot.java源文件编译为Robot.class字节码文件 ClassLoader将字节码转换为JVM中的Class<Robot>对象 JVM利用Class<Robot>对象实例化为Robot对象 |
谈谈ClassLoader |
ClassLoader在JAVA中有着非常重要的作用,它主要工作在Class装载的加载阶段,其主要作用是从系统外部获得Class二进制数据流。它是JAVA的核心组件,所有的Class都是由ClassLoader进行加载的。ClassLoader负责通过将Class文件里的二进制数据流装载进系统,然后交给JAVA虚拟机进行连接,初始化等操作 ClassLoader的种类 BootStrapClassLoader:C++编写,加载核心库java.* ExtClassLoader:JAVA编写,加载扩展库javax.* AppClassLoader:JAVA编写,加载程序所在目录 自定义ClassLoader:JAVA编写,定制化加载 |
谈谈类加载器的双亲委派机制 |
自下而上检查是否已经加载,如果加载则直接返回,如果没有加载,则自上而下去寻找类,然后加载,加载成功直接返回 |
为什么要使用双亲委派机制去加载类 |
避免多份同样字节码的加载 |
类的加载方式 |
隐式加载:new 显示加载:loadClass与forName |
loadClass与forName的区别? |
Class.forName得到的class是已经初始化完成的 ClassLoader.loadClass得到的class是还没有链接的 Class.forName除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。 classloader只是将.class文件加载到jvm中,不会执行static中的内容,只有在newIn |
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
针对Java简历中项目的功能进行提问,大家可以在评论区中解答/讨论;同时提供八股文