title: JVM面试_1
date: 2019/7/30 8:23:01
tags: JVM面试_1
cateories: 面试
谈谈你对java的理解
- java具有平台无关性: 即可以一次编译,到处运行.
- jvm具有自动GC功能: 正因为有了GC,我们就不用像C++那样去手动释放内存了.
- java有自己的语言特性:如泛型,反射,lamda表达式
- java是面向对象的(OOP): 即将现实的事物和关系抽象出来变成类,不用在意过程的实现过程,包括了封装,继承,多态.
有一天你想吃鱼香肉丝了,怎么办呢?你有两个选择
1、自己买材料,肉,鱼香肉丝调料,蒜苔,胡萝卜等等然后切菜切肉,开炒,盛到盘子里。
2、去饭店,张开嘴:老板!来一份鱼香肉丝!
看出来区别了吗?这就是1是面向过程,2是面向对象。
- java有自己的类库.
- java有异常处理机制.
java的平台无关性如何实现(即Compile Once, Run Anywhere)
java程序执行主要分为两个阶段:
-
编译期: 通过
javac
将源码编译为字节码文件. -
运行期:
字节码文件也就是class文件,其中保存的就是我们java文件翻译成的字节码文件,即java文件中的方法,对象,常量信息等都会被放在字节码文件中, 除此之外,还会添加一个公有的静态常量属性class,这个属性记录了相关的属性信息和类型信息,是class的一个实例
,这样我们就可以通过类.class获取其class对象.
我们想看class文件,直接通过notepad++这样子的工具打开是乱码,所以我们需要知道javap
这个JDK自带的反编译指令,通过这个指令可以查看字节码文件
可以通过在命令提示符窗口输入javap-help
获取javap指令的帮助信息,其中javap -c 类名
是用于对代码进行反编译,可以看到java从字节码文件到机器码文件再到显示执行结果的执行过程.
为什么JVM不直接将源码解析成机器码去执行
如果我们不直接将源码转换成机器码去执行,主要有以下原因:
- 准备工作太多: 每次执行都需要各种检查,效率会比较低
(.class文件是编译时已经检查过基本语法等之后生成的文件)
. - 为了实现兼容性,脱离java的束缚: 也可以将别的语言解析成字节码,由JVM进行调用.
JVM如何加载.class文件
JVM是一个内存中的虚拟机,也就是说,JVM的存储就是内存.
JVM大致架构
- ClassLoader(类加载器): 依据特定格式(并不是随便一个class文件都可以加载),加载class文件到内存,它只负责加载,能不能运行就要看
Execution Engine了
. - Execution Engine(解释器): 对命令进行解析,解析完成后就提交到操作系统中去执行了.
- Runtime Data Area(运行时数据区): JVM内存空间结构模型,我们的代码都会被加载到这里,之后才开始运行.
- Native Interface(本地方法接口): 它融合了不同开发语言的原生库为java使用,也就是说,
实现不是通过java实现的,但是java可以直接调用.