由于这些内容都是比较早之前进行的整理的,所以有的部分是参考了他人的博文,但是由于是之前找的,所以具体的博文链接找不到了,如果原博主看到这个文章或者有人知道其中部分内容的原博文,请与我联系,我将加上原链接,谢谢
1、为什么Java一次编译,到处可运行
- 因为只需要将java文件编译成字节码文件,在运行平台只要有JVM虚拟机就可以运行。这样Java在不同的平台也不需要重新编译,只需要虚拟机把字节码文件转换成具体平台的机器指令。
2、JVM是如何加载文件的
- 首先对于字节码文件,使用Class Loader将class文件记载到内存中。然后使用Exction Engine对命令进行解析。对于使用了不同开发文件的原生库我们可以使用Native interface来为Java所用。
3、Java反射机制
- 对于任何一个类,我们都可以知道这个类的所有属性和方法,对弈任何一个对象我们都能调用他的任意方法和属性。这种动态获取信息以及动态调用对象的方法就是成为Java语言的反射机制。
4、Class Loader
- Class Loader在Java中有着非常重要的作用,它主要工作在Class装载的加载过程,主要作用是从系统外获取Class的二进制数据流。所有的class都是由他来加载很系统,然后交给虚拟机进行连接初始化等操作。过程为
加载-链接(校验-准备-解析)-初始化
5、loadClass和forName区别
- 对于loadClass没有链接,而forName获取的是已经初始化的。优点就是没有链接初始化可以减少资源浪费,需要的时候再进行初始化。
6、JVM内存模型
主要分为程序计数器,虚拟机栈,本地方法栈 这几个是线程私有的。
而堆(包含常量池,数组和类对象)以及MetaSpace(类加载信息)是线程共享的。
程序计数器:记录当前线程执行的字节码行号的指示器,通过改变这个值来选取下一条需要执行的字节码指令。和线程是一对一的关系即“线程私有”的,对于Native方法计数为Undefine
Java虚拟机栈:包含Java方法执行的内存模型,包含多个栈帧。每个栈帧都含有局部变量表,操作栈还有动态连接,返回地址等数据
本地方法栈:与虚拟机栈相似,主要作用是标注了native方法
局部变量存储的是方法执行过程中的所有变量。
操作数栈:入栈、出栈、复制、交换、产生消费变量
7、递归为什么会引发StackOverFlowError异常
- 多次递归一直入栈超出虚拟栈深度
8、JVM三大性能调优参数
-Xss
规定虚拟栈大大小-Xms
堆的初始值-Xmx
堆能达到的最大值
9、Java内存模型中的堆和栈的区别-内存分配策略
- 静态存储:编译时确定每个数据目标在运行时的存储空间需求
- 栈式存储:数据区需求在编译时未知,运行时模块入口确定
- 堆式存储:编译时或者运行时入口都无法确认,动态分配
10、堆和栈的关系与区别
- 联系:
- 引用对象或者数组时,栈中变量保存的是堆中目标的首地址
- 区别:
- 管理方式:栈自动释放,堆需要GC
- 空间大小:栈比堆小
- 碎片相关:栈产生的随便远小于堆
- 分配方式:栈支持动态和静态分配,而堆仅支持动态分配
- 效率:因为底层数据结构不同所以栈效率高于堆
11、元空间、堆、栈、线程独占部分的联系——————内存角度
1 | public class HelloWorld{ |
引用参数
本地变量
局部变量