19四、说一下JVM的主要组成部分? 及其做用?spa
1) 类加载器 (ClassLoader)操作系统
2) 运行时数据区 (Runtime Data Area)线程
3) 执行引擎 (Execution Engine)翻译
4) 本地库接口 (Native Interface)对象
组件的做用: 首先经过类加载器(ClassLoader)会把Java代码转换成字节码, 运行时数据区(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是JVM的一套指令集规范,并不能直接交给底层操做系统去执行,所以须要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层指令,再交给CPU去执行,而这个过程当中须要调用其余语言的本地库接口(Native Interface)来实现这个程序的功能。接口
19五、说如下JVM运行时数据区?队列
不一样虚拟机的运行数据区可能略微有所不一样,可是都会听从Java虚拟机规范,Java虚拟机规范规定的区域为如下5个部分:内存
1) 程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器, 字节码解析器的工做是经过改变这个计数器的值,来选取下一条须要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能,都须要依赖这个计数器完成。虚拟机
2)Java虚拟机栈(Java Virtual Machine Stacks): 用于存储局部变量,操做数栈,动态连接,方法出口等信息。io
3)本地方法栈(Native Method Stack): 与虚拟机栈的做用同样的,只不过虚拟机栈服务Java方法的,而本地方法栈是为虚拟机调用Native方法服务的;
4) Java堆(Java Heap): Java虚拟机中内存最大的一块,是被全部线程共享的,几乎全部的对象实例都在这里分配内存
5) 方法区(Method Area): 用于存储已经被虚拟机加载的类信息,常量,静态变量,即时编译后的代码等数据。
19六、说一下堆栈的区别?
功能方面: 堆是用来存放对象的,栈是用来执行程序的。
共享性: 堆是线程共享的,栈是线程私有的。
空间大小 : 堆大小远远大于栈。
19七、队列和栈的是什么? 有什么区别?
队列和栈都是被用来预存储数据的。
队列容许先进先出进行检索原生,但也有例外的状况,Deque接口容许从两端检索元素。
栈和队列很类似,可是他容许对元素后进先出进行检索。
198. 什么是双亲委派
在介绍双亲委派模型以前,先说下类加载器。对于任意一个类,都须要由加载它的类加载器和这个类自己一同确立在JVM中的惟一性,每个类加载器,都有一个独立的类名称空间。类加载器就是根据指定全限定名称将class文件加载JVM内存中,而后再转化为class对象
类加载器的分类:
1)启动加载器(Bootstrap ClassLoader),是虚拟机自身的一部分,用来加载Java_Home/lib/目录中的,或者被-XBootclasspath参数所指定的路径中而且被虚拟机识别的类库。
2)其它类加载器
21)扩展类加载器(Extension ClassLoader)
19九、说一下类加载的执行过程?
1)加载: 根据查找路径找到相应的class文件而后导入
2)检查: 检查加载的class文件的正确性
3) 准备: 给类中的静态变量分配内存空间
4) 解析: 虚拟机将常量池中的符合引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址
5) 初始化: 对静态变量和静态代码块执行初始化工做。