JAVA基础训练习册

架构思想

环境

配置 nginx 配置1.1 JDK、 JRE、JVM 的关系是什么?

什么是 JVM ?

英文名称 ( Java Virtual Machine ),就是 JAVA 虚拟机, 它只识别 .class 类型文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。

什么是 JRE ?

英文名称( Java Runtime Environment ),Java 运行时环境。它主要包含两个部分:JVM 的标准实现和 Java 的一些基本类库。相对于 JVM 来说,JRE多出来一部分 Java 类库。

什么是 JDK? 英文名称( Java Development Kit ),Java 开发工具包。JDK 是整个 Java 开发的核心,它集成了 JRE 和一些好用的小工具。例如:javac.exe、java.exe、jar.exe 等。

这三者的关系:一层层的嵌套关系。JDK > JRE > JVM。

1.2 JVM 的内存模型以及分区情况和作用

如下图所示:

enter image description here

黄色部分为线程共有,蓝色部分为线程私有。

方法区

用于存储虚拟机加载的类信息,常量,静态变量等数据。

存放对象实例,所有的对象和数组都要在堆上分配。 是 JVM 所管理的内存中最大的一块区域。

Java 方法执行的内存模型:存储局部变量表,操作数栈,动态链接,方法出口等信息。生命周期与线程相同。

本地方法栈

作用与虚拟机栈类似,不同点本地方法栈为 native 方法执行服务,虚拟机栈为虚拟机执行的 Java 方法服务。

程序计数器

当前线程所执行的行号指示器。是 JVM 内存区域最小的一块区域。执行字节码工作时就是利用程序计数器来选取下一条需要执行的字节码指令。

1.3 JVM 对象创建步骤流程是什么?

整体流程如下图所示:

enter image description here

第 1 步:虚拟机遇到一个 new 指令,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用, 并且检查这个符号引用的类是否已经被加载&解析&初始化。

第 2 步:如果类已经被加载那么进行第 3 步; 如果没有进行加载, 那么就就需要先进行类的加载。

第 3 步:类加载检查通过之后, 接下来进行新生对象的内存分配。

第 4 步:对象生成需要的内存大小在类加载完成后便可完全确定,为对象分配空间等同于把一块确定大小的内存从 Java 堆中划分出来

第 5 步:内存大小的划分分为两种情况: 第一种情况:JVM 的内存是规整的, 所有的使用的内存都放到一边, 空闲的内存在另外一边, 中间放一个指针作为分界点的指示器。 那么这时候分配内存就比较简单, 只要讲指针向空闲空间那边挪动一段与对象大小相同的距离。 这种就是“指针碰撞”。

第二种情况:JVM 的内存不是规整的, 也就是说已使用的内存与未使用的内存相互交错。 这时候就没办法利用指正碰撞了。 这时候我们就需要维护一张表,用于记录那些内存可用, 在分配的时候从列表中找到一块足够大的空间划分给对象实例, 并更新到记录表上。

第 6 步:空间申请完成之后, JVM 需要将内存的空间都初始化为 0 值。如果使用 TLAB, 就可以在 TLAB 分配的时候就可以进行该工作。

第 7 步: JVM 对对象进行必要的设置。 例如, 这个对象是哪个类的实例、对象的哈希码、GC 年代等信息。

第 8 步:完成了上面的步骤之后 从 JVM 来看一个对象基本上完成了, 但从 Java 程序代码绝对来看, 对象创建才刚刚开始, 需要执行 < init > 方法, 按照程序中设定的初始化操作初始化, 这时候一个真正的程序对象生成了。

1.4 垃圾回收算法有几种类型? 他们对应的优缺点又是什么?

常见的垃圾回收算法有:

标记-清除算法、复制算法、标记-整理算法、分代收集算法

标记-清除算法

标记—清除算法包括两个阶段:“标记”和“清除”。 标记阶段:确定所有要回收的对象,并做标记。 清除阶段:将标记阶段确定不可用的对象清除。

缺点:

标记和清除的效率都不高。

会产生大量的碎片,而导致频繁的回收。

复制算法

内存分成大小相等的两块,每次使用其中一块,当垃圾回收的时候, 把存活的对象复制到另一块上,然后把这块

猜你喜欢

转载自www.cnblogs.com/ievixvs/p/12750001.html