1、谈谈你对java的理解
平台无关性
GC
语言特性
面向对象
类库
异常处理
2、java如何实现平台无关性
.java文件
javac编译,生成字节码.class文件
jvm解析,转换成特定平台的执行指令
java源码首先被编译成字节码,再由不同平台的jvm进行解析,java语言在不同的平台上运行时不需要重新进行编译,java虚拟机在执行字节码时,把字节码转换成具体平台上需要的指令
3、jvm如何加载.class文件
java虚拟机
class loader:依据特定格式,加载class文件到内存
Execution Engine:对命令进行解析
native Interface:融合不同开发语言的原生库为java所用
Runtime Data Area:jvm内存结构模型
4、反射
java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制
5、谈谈classLoader
编译器将a.class源文件编译为a.class字节码文件
classLoader将字节码转换为jvm中的class<a>对象
jvm利用class<a>对象实例化为a对象
classLoader在java中有着非常重要的作用,它主要工作在class装载的加载阶段,其主要作用是从系统外部获得class的二进制数据流。它是java的核心组件,所有的class都是由classLoader进行加载的,classLoader负责通过将class文件里的二进制数据流装载进系统,然后交给java虚拟机进行连接、初始化等操作。
classLoader的种类:
bootstrapClassLoader:C++编写,加载核心库java.*
ExtClassLoader:java编写,加载扩展库javax.*
appClassLoader:java编写,加载程序所在目录。
自定义classLoader:java编写,定制化加载
6、为什么使用双亲委派机制去加载类
避免多份同样字节码的加载
双亲委派模型工作过程是:如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成。每个类加载器都是如此,只有当父加载器在自己的搜索范围内找不到指定的类时(ClassNotFoundException
),子加载器才会尝试自己去加载。
7、类的加载方式
隐式:new
显示加载:loadClass、forName
类的装载过程:
加载:classLoader加载class字节码,生成class文件
链接:校验(检查加载的class文件的正确性和安全性) 准备(为类变量分配存储空间并设置类变量初始值) 解析(jvm将常量池内的符号引用转换成直接引用)
初始化(执行类变量赋值和静态代码块)
class.forname 得到的class是已经初始化完成的
class.loadclass得到的class是还没有链接的
8、java内存模型
线程私有:程序计数器、虚拟机栈、本地方法栈
程序计数器:当前线程所执行字节码的行号指示器,改变计数器的值来选取下一条需要执行的字节码指令
native方法计数器值为undefined 不会发生内存泄漏
虚拟机栈:java方法执行的内存模型 包含多个栈帧,
局部变量表:包含方法执行过程中的所有变量
操作数栈:入栈、出栈、复制、交换、产生消费变量
动态链接出口
本地方法栈:java虚拟机栈是为java方法服务的,本地方法栈为native方法服务
线程共享:
堆:存放所有对象实例
常量池:类信息、常量、静态变量,即编译器编译后代码的数据