【应届面试篇】JVM的主要组成部分?及各部分常见问题详解
来源:http://www.tudoupe.com时间:2022-07-17
首先,JVM包含三个主要组成部分
1. 运行时数据区
2. 类加载系统
3. 执行引擎
一、运行时数据区
运行时数据区为 jdk 1.7 以前,它主要分为:
- 栈区(线程私有)
- 堆区(线程共享)
- 本地方法堆栈(线性私人)
- 程序计数器(线性私人)
- 方法区(线程共享)
栈区
堆栈区主要由堆栈框架组成,每个实现将堆栈框架添加到堆栈中。
堆栈框架主要包括方法局部变量、动态链接和方法输出数据。
堆区
存储对象的区域,新的对象将放在堆栈区域
本地方法栈
由于Java语言是用c写的,所以有许多母语方法,主要是存储本地方法堆栈。
程序计数器
它可以被视为当前线程执行的字节代码的行数指示器,记录当前代码执行的位置。
方法区
它用于存储由即时编译器编译的类型信息、常数、静态变量和代码缓存等数据,这些数据被虚拟机载入。
在JDK1中,Post方法区不是JVM的内存,而是移动到直接内存,由元素空间取代
主要原因是信息的大小不确定,例如类装载和空间浪费
二、类加载系统
主要功能:搜索和验证.class文件,完成对象创建和存储分配
类加载的过程?
班级装载总共需要七步
- 加载
- 验证
- 准备
- 解析
- 初始化
- 使用
- 卸载
同时,为分析准备的三个验证步骤也被称为链接。
这是一个我们一般认为的类加载序列,但验证从加载开始,是一个全球性的步骤。
类加载器有哪些?
- 启动类加载器bootstrap ClassLoader
- Ext ClassLoader
- App ClassLoader
- 自定义类载体
JVM的双边代表模式
如果一个类负载器收到一个类负载请求,它不会首先尝试自己负载类,而是将请求委托给母类负载器完成,这对于每个类负载器的每个层都是如此。
因此,所有负载请求最终应该传递给上层启动类负载器,并且只有当主负载器反馈它不能完成负载请求本身(它在搜索范围中找不到所需的类)时,子负载器才会尝试自己负载。
为什么设计生物 delegation模型
- 防止核心类库被修改
- 避免重复加载
- 保证类的唯一性
三、执行引擎
它主要由两个部分组成:即时编译器和垃圾回收器。
即时编译器
将字节代码转换为cpu指令
垃圾回收器
如果你判断哪件东西是垃圾品?
引用计算方法,可用性分析
要自己会分析哪些对象可以是GC ROOT对象,GC ROOT有一个特例:老年代的对象引用了新生代中的对象,那么这个对象也可 以作为GC ROOT
在Java中,可以成为GCRoots的对象包括以下:
(1).在虚拟机器堆栈中引用的对象(堆栈框架中的局部变量区域,也称为局部变量表)。
(二)方法领域中由类静态属性引用的对象。
(三)方法领域中的常参考对象。
(4).在本地方法堆栈中由JNI(原始方法)引用的对象。
垃圾回收算法
1.标记清除
2.标记整理
3.复制
4.分代回收
CMS执行流程
提示:C初始及重新清洗(初始标记、同时标记、重新标记、同时清理)
整个过程分为四个步骤,包括:
初始标记 :仅仅只是标记一下 GCRoots 能直接关联到的对象,速度很快,需要停顿(STW-Stoptheworld)。
同步标记:从GCRoot开始,堆栈中的对象可以进行访问性分析,并且可以存储,这在整个回收过程中花费最长的时间,而不停止。
重新标记:为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,需要停顿(STW)。这个阶段的停顿时间一般 会比初始标记阶段稍长一些,但远比并发标记的时间短。
同时清理:无需停止。 基于标记的清理
G1 回收过程
G1循环器的运行可以大致分为四个步骤:
- 初始标记(将STW):仅标记GC Roots可以直接关联的对象,并修改 TAMS指针的值,让用户线程的下一个阶段同时运行,可以正确地在可用区域分配新的图像对.这个阶段需要停止,但耗时很短,而且是借用进行Minor GC的时候同步完成 的,因此G1收集器实际上在这一阶段没有额外的停止。
- 复制:从GC Roots开始分析堆栈中的对象的可用性,从整个堆中除去扫描对象图,找出要回收的对象,这阶段耗时较长,但它可以与用户程序同时执行。当对象图被扫描时,还重新处理在同步中有参考更改的对象。
- 最后标记(will STW):用于用户线程和在合并阶段处理后仍然引用的对象的简短停顿。
- 清理阶段(STW):更新区域统计,列列每个区域的回收价值和成本,根据用户预期的停止时间来制定恢复计划,您可以自由选择任何区域组成集合,然后把决定回收的那一部分Region的存活对象复制到空的Region中,再清理掉整 个旧Region的全部空间。这里操作涉及保存对象的移动,必须暂停用户线程,同时由多个回收线程完成.
CMS与G1之间的区别
- 两个垃圾回收器虽然都是基于分代回收,但是 CMS是物理意义上的真正分代回收,而G1 由于把内存分成了小的内存块,所以他是逻辑意义上的分代回收
- CMS 是最求最短的停顿时间 STW的时间不可控制,而G1 是最求最高的效率,可以指定STW时间,G1 会记录每一个内存块回收垃圾所需的时间以及能回收的垃圾,从而确定在指定时间内能回收最多的垃圾
- CMS是基于标记清楚算法 会形成大量的垃圾碎片 , 而G1 宏观上看是标记整理法 而 微观上看是复制算法
Minor GC 和 Full GC 有什么不同呢?
小型GC:只收集新生GC。
全GC:收集整个堆栈,包括新代、老代、永久代(在JDK 1).8中),然后,永久代数在模型的所有部分中被删除并以元空间(元空间元素空间)取代。
Minor GC触发条件:当Eden区满时,触发Minor GC。 Full GC触发条件:
通过小GC访问的老年记忆的平均大小比现有的老年记忆大。如果发现统计数据说之 前Minor GC的平均晋升大小比目前old gen剩余的空间大,它不再触发一个小GC,而是切换到触发一个完整的GC。老龄空间不足以分配新的内存(或永久空间不足,只是JDK1.7,是的,这也是用元空 间来取代永久代的原因,你可以降低全GC的频率,减少GC负担,提升其效率)。 由Eden区、From Space区向To Space区复制时,比空间大的对象可以存储在内存中,然后,物体被保存到老年期,可用的较旧的内存比对象的大小小。调用系统。gc时,该系统建议实施全职公务员制度,但是不必然执行。
什么是强引语,软引语,弱引语,假引语,有什么区别?
强引用,是一个常见的对象参考关系,例如, String s = new String("ConstXiong")软引用,用于维护一些可用和不存在的对象。只有在内存不足时,系统将检索图像的软引用,如果在恢复软参考对象后仍然没有足够的内存,只有内存溢出异常将被抛出。SoftReference实现弱的参考,相比软引用来说,要更加无用一些,它的生命周期较短,当JVM回收垃圾时,无论内存是否充足,所有被弱点引用的对象都被恢复.错误引用的实现错误引用是一种形式和错误引用。它在现实生活中并不很有用,它主要用于跟踪被回收的对象的活动。
上一篇:外国人在华工作的12个常见问题
下一篇:泰国长居常见问题解析
相关新闻
- 2023-04-16 2台电脑怎么共享(2台电脑怎么共享
- 2023-04-16 主板检测卡代码(电脑主板检测卡代
- 2023-04-16 dnf未响应(dnf未响应老是上不去)
- 2023-04-16 ppoe(pppoe拨号上网)
- 2023-04-16 网速不稳定(网速不稳定是路由器的
- 2023-04-16 wds状态(Wds状态成功)
- 2023-04-16 光标键(光标键不动了怎么办)
- 2023-04-16 电脑提速(电脑提速100倍的方法)
- 2023-04-16 切换用户(切换用户怎么切换回来
- 2023-04-16 数据包是什么(产品数据包是什么
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
