没有合适的资源?快使用搜索试试~ 我知道了~
1. 标记和清除的效率都不高 2. 会产生大量的碎片,而导致频繁的回收 1. 需要浪费额外的内存作为复制区 2. 当存活率较高时,复制算法效率会下降 1. 当
资源详情
资源评论
资源推荐
JVM面试
基础
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 的内存模型以及分区情况和作用
如下图所示:
黄色部分为线程共有,蓝色部分为线程私有。
方法区
用于存储虚拟机加载的类信息,常量,静态变量等数据。
堆
存放对象实例,所有的对象和数组都要在堆上分配。 是 JVM 所管理的内存中最大的一块区域。
栈
Java 方法执行的内存模型:存储局部变量表,操作数栈,动态链接,方法出口等信息。生命周期与线程相同。
本地方法栈
作用与虚拟机栈类似,不同点本地方法栈为 native 方法执行服务,虚拟机栈为虚拟机执行的 Java 方法服务。
程序计数器
当前线程所执行的行号指示器。是 JVM 内存区域最小的一块区域。执行字节码工作时就是利用程序计数器来选取下
一条需要执行的字节码指令。
1.3 JVM 对象创建步骤流程是什么?
整体流程如下图所示:
第 1 步:虚拟机遇到一个 new 指令,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用, 并
且检查这个符号引用的类是否已经被加载&解析&初始化。
第 2 步:如果类已经被加载那么进行第 3 步; 如果没有进行加载, 那么就就需要先进行类的加载。
第 3 步:类加载检查通过之后, 接下来进行新生对象的内存分配。
第 4 步:对象生成需要的内存大小在类加载完成后便可完全确定,为对象分配空间等同于把一块确定大小的内存从
Java 堆中划分出来
第 5 步:内存大小的划分分为两种情况: 第一种情况:JVM 的内存是规整的, 所有的使用的内存都放到一边, 空闲
的内存在另外一边, 中间放一个指针作为分界点的指示器。 那么这时候分配内存就比较简单, 只要讲指针向空闲空
间那边挪动一段与对象大小相同的距离。 这种就是“指针碰撞”。
第二种情况:JVM 的内存不是规整的, 也就是说已使用的内存与未使用的内存相互交错。 这时候就没办法利用指正
碰撞了。 这时候我们就需要维护一张表,用于记录那些内存可用, 在分配的时候从列表中找到一块足够大的空间划
分给对象实例, 并更新到记录表上。
第 6 步:空间申请完成之后, JVM 需要将内存的空间都初始化为 0 值。如果使用 TLAB, 就可以在 TLAB 分配的时
候就可以进行该工作。
第 7 步: JVM 对对象进行必要的设置。 例如, 这个对象是哪个类的实例、对象的哈希码、GC 年代等信息。
第 8 步:完成了上面的步骤之后 从 JVM 来看一个对象基本上完成了, 但从 Java 程序代码绝对来看, 对象创建才刚
刚开始, 需要执行 < init > 方法, 按照程序中设定的初始化操作初始化, 这时候一个真正的程序对象生成了。
1.4 垃圾回收算法有几种类型? 他们对应的优缺点又是什么?
常见的垃圾回收算法有:
标记-清除算法、复制算法、标记-整理算法、分代收集算法
标记-清除算法
标记—清除算法包括两个阶段:“标记”和“清除”。 标记阶段:确定所有要回收的对象,并做标记。 清除阶段:将标记
阶段确定不可用的对象清除。
缺点:
1. 标记和清除的效率都不高。
2. 会产生大量的碎片,而导致频繁的回收。
复制算法
内存分成大小相等的两块,每次使用其中一块,当垃圾回收的时候, 把存活的对象复制到另一块上,然后把这块内
存整个清理掉。
缺点:
1. 需要浪费额外的内存作为复制区。
2. 当存活率较高时,复制算法效率会下降。
标记-整理算法
标记—整理算法不是把存活对象复制到另一块内存,而是把存活对象往内存的一端移动,然后直接回收边界以外的内
存。
缺点: 算法复杂度大,执行步骤较多
分代收集算法
目前大部分 JVM 的垃圾收集器采用的算法。根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下
将堆区划分为新生代( Young Generation 和老年代( Tenured Generation ),永久代( Permanet Generation
)。
老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被
回收,那么就可以根据不同代的特点采取最适合的收集算法。
如下图所示:
剩余10页未读,继续阅读
无声远望
- 粉丝: 52
- 资源: 298
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0