1. Jdk jre jvm 的关系
JDK包含 JRE JRE包含JVM
JDK: 开发类库+JRE
JRE: 运行类库+JVM
JVM: 虚拟机 它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,以便在虚拟机上运行。 JVM 虚拟机: 主要是由 类加载器(classloader)、运行时数据区、执行引擎、本地接口库 四个部分组程。
类加载器(Class Loader): 类加载器是用来加载class的它负责将 Class 的字节码形式转换成内存形式的 Class 对象。字节码可以来自于磁盘文件 .class,也可以是 jar 包里的class,也可以来自远程服务器提供的字节流,字节码的本质就是一个字节数组[]byte。
本地接口库: 它是Java语言允许Java代码与C、C++代码交互的标准机制。程序执行过程中需要调用其他语言的接口 就是这个本地接口库。
执行引擎: 主要是将字节码翻译成底层系统之列指令交友CPU执行
运行时数据区: 是面试过程中经常提问的 运行时数据区是由 PC程序计数器、栈、堆、本地方法栈、方法区五个部分组成。
PC程序计数器: 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行字节码的行数指示器。在虚拟机的概念模型中,字节码解析器的工作是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 特性:内存私有
虚拟机栈: 一个线程的每个方法在执行的同时,都会创建一个栈帧,栈帧中存储的有局部变量表,操作站,动态链接,方法出口等 ,当方法被调用时 栈帧在JVM栈中入栈,当方法执行完成时,栈帧出栈. 每个线程对应着一个虚拟机栈,因此虚拟机栈也是线程私有的
虚拟机栈中只保存基础数据类型的对象和自定义对象的地址(不是对象是地址);每个栈的数据都是不能被其他栈访问的 所以是私有的 特性: 内存私有.
本地方法栈: 本地方法栈在 运行机制、异常类型等方面都与虚拟机栈相同,唯一的区别就是 虚拟机栈是执行java方法的,而本地方法栈是用来执行native方法的,在很多虚拟机中,会将本地方法栈与虚拟机栈放在一起使用 本地方法栈 线程也是私有的 特性: 内存私有
虚拟机堆: 堆区 是用来存储对象实例的每一个new 出来的对象都会存储到堆区中; 堆是被共享的 特性:共享
方法区: 方法区是用于存储已经被虚拟机加载的类信息、final常量、静态变量、编译器即时编译的代码等 方法区中包含常量池 用于存储编译期就生成的字面常量、符号引用、翻译出来的直接引用;如 string 字符创 就会存在常量池中
2. GC垃圾回收机制
GC垃圾回收机制是java语言的核心技术之一,在Java中程序员不需要去关心内存的动态分配和垃圾回收的问题; 如果对象没有被其他对象所引用该对象就会被视为垃圾,其占用内存就会被销毁;
标记对象为垃圾的算法: 分为引用计数法与可达性分析算法
引用计数法: 引用计数法就是给对象添加一个引用计数器。每当一个地方引用这个对象的时候计数器就会加1,当引用失效就会减1,任何时候计数器为0的对象就是不可能在被使用的对象 就会被当作垃圾收集
优点:执行效率快 程序执行受影响较小
缺点:无法检测出循环引用的对象 会存在导致内存溢出的情况
可达性分析算法: 可达性分析算法是将被称为GC Roots的对象作为起点,从这些节点开始往下搜索,当一个对象到GC Roots 没有任何引用链时(既从GC Roots节点到该节点不可达),则证明该对象时不可用的。
垃圾回收算法有哪些: java中存在四种垃圾回收算法 标记清除算法 复制算法 标记整理算法 与 分代回收算法 当前虚拟机的垃圾收集采用的时分代收集算法
分代回收算法:当前使用的是分代回收算法 ,这种算法是根据具体的情况选择具体的垃圾回收算法,一般分为新生代与老年代 这样我们就会根据各个年代的特点选择合适的垃圾回收算法
比如在新生代中,每次收集都会有大量对象死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集
标记清除算法:
复制算法:
标记整理算法: