2.1 java平台无关性如何体现(compile once;run anywhere)
Java源码首先被编译成字节码,再由不同平台的JVM进行解析,JAVA语言在不同平台上运行时候不需要重新编译,java虚拟机在执行字节码的时候,把字节码转换成具体平台上的机器指令。
为什么JVM不直接将源码解析成机器码进行执行
每次执行前都需要检查,整体性能都将受到影响;也可以将别的语言解析成字节码,增加平台语言的兼容性。
2.2 JVM的架构
JVM是一个内存中的虚拟机,这意味着JVM的存储就是内存。JVM大致分为四个部分:
①Class Loader:加载编译好的Class文件到内存;
②Execution Engine:负责对命令进行解析执行
③Native Interface(本地接口):融合不同开发语言的原生库为java所用
④Runtime Date Area:JVM内存空间结构模型
2.3 什么是反射
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
反射就是把JAVA类中的一个个成分映射成JAVA对象
2.4谈谈ClassLoader
ClassLoader负责将Class文件里面的二进制数据流装载进系统,然后交给JAVA虚拟机进行连接、初始化操作。
Java默认提供的三个ClassLoader:
①BootStrap ClassLoader:称为启动类加载器,是Java类加载层次中最顶层的类加载器,负责加载JDK中的核心类库;
②Extension ClassLoader:称为扩展类加载器,负责加载Java的扩展类库;
③App ClassLoader:称为系统类加载器,负责加载应用程序classpath目录下的所有jar和class文件。
最后还有一种自定义加载类
2.5 什么是ClassLoader的双亲委派机制
因为这样可以避免重复加载,当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。
2.6 类的装载过程
加载:通过ClassLoader加载class文件字节码,生成Class对象
链接:①校验:class的正确性与安全性②准备:为类变量分配存储空间并设置类变量初始值③解析:JVM将常量池内的符号引用转换为直接引用
初始化:执行类变量赋值和静态代码块
loadClass和forName的区别?
loadClass 和forName都是显性加载方法(隐性加载方法为 new);Class.forName方法得到的Class是已经初始化完成的;Classloder.loadClass得到的class是还没有链接的,只是完成了第一步。
2.7 JAVA的内存模型
递归为什么会引发java.lang.StackOverflowError异常
因为递归函数会反复调用自身,由于虚拟栈的深度是有限的,栈帧数超出虚拟栈深度,从而引发异常。
2.8 JVM三大性能调优参数 -Xms -Xmx -Xss的含义
-Xms:堆的初始值
-Xmx:堆能达到的最大值
-Xss:规定了每个线程虚拟机栈的大小
2.9 JAVA内存模型中堆和栈的区别
静态存储:编译时确定每个数据目标在运行时的存储空间需求。
栈式存储:数据区需求在编译时未知,运行时模块入口前确定。
堆式存储:编译时或运行时模块入口都无法确定,动态分配。
二者的联系:引用对象、数组时,栈里定义变量保存堆中目标的首地址
答:栈比堆小,栈的效率比堆高,栈产生的碎片远小于堆,栈支持静态与动态分配,堆仅支持动态分配,栈能够由编译器自动释放,堆需要GC。