Java虚拟机面试也是面试经常会被问到的问题,Java之所以现在占有市场这么大就是因为其跨平台的特性,而跨平台的支撑就是虚拟机,当然虚拟机还有一个特性就是帮助我们管理内存,不需要再手动释放,本篇文章来介绍下虚拟机主要涉及到的面试问题总结。希望能帮助到正在面试的你。
整个java代码和虚拟机交互的流程为:
class文件-》类装载器《-》内存区域
内存区域包含:方法区、堆、虚拟机栈、本地方法栈、程序计数器 这一段也叫运行时数据区
然后《-》转型引擎-》本地库接口-》本地方法库 完成整个的程序的执行过程
当然上面运行时数据区跟本地库接口也存在双向交互的操作。
这里概念一定要明确,内存模型不是那个运行时数据图。
java内存模型全称为Java Memory Model,是java虚拟机为了java程序能够正常运行而制定的一套规范,规范中规定了JVM中的数据如何与RAM的数据进行交互。
java中分为主内存和工作内存,主内存中存放共享变量:实例字段、静态字段、数组对象元素。线程对共享数据的操作必须在工作内存中进行。这就是为什么需要java内存模型,其实就是对内存的管理,线程间的变量值的传递都需要通过主内存完成,不能相互之间访问变量。
内存模型的抽象结构图:
双亲委派机制,类加载机制决定会先去加载父类,父类发现String冲突就不加载了。
延伸:类加载器种类和介绍:
名称 | 说明 | 备注 |
启动类加载器,Bootstrap Classloader | 加载JAVA_HOMElib等底层类 | |
扩展类加载器,Extension ClassLoader | libext,扩展类的加载 | |
应用程序类加载器,Application ClassLoader | 加载ClassPath中的类库 | |
自定义类加载器 | 通过继承ClassLoader实现,加载我们自定义类的双亲委派模型 |
双亲委派模型:类加载时,先将请求委派给父类加载器加载完成,最底层、顶层Bootstrap ClassLoader加载器,如果父类无法加载,子类尝试自己加载。
双亲委派的好处:避免同一个类被多次加载,每个加载器只能加载自己范围的类。
可以,使用Java探针技术
类加载分三个步骤:加载、链接、初始化
流程为:
加载-》验证-》准备-》解析-》初始化
-》使用-》卸载
其中验证、准备、解析又叫链接
垃圾收集主要是针对堆和方法区进行,程序计数器、虚拟机栈、本地方法栈这三个区域都是私有的,线程生命周期结束后,会自动回收。
方法 | 说明 | 备注 |
引用计数算法 | 对象添加计数器,当有引用就加1反之减1,当为0的时候回收 | 因为循环引用的存在,java虚拟机没采用 |
可达性分析算法 | 通过GC Roots作为起点进行搜索,能够达到的对象是存活的,不可达的对象可被回收 |
上面判断对象是否可被回收都涉及到引用相关。
术语 | 说明 | 备注 |
强引用 | 强引用的对象不会被回收 | |
软引用 | 只有在内存不足时被回收 | |
弱引用 | 一定会被回收,生命周期就是下次垃圾回收之前 | |
虚引用 | 目的就是被回收的时候收到系统通止规,对其生存时间没有影响 | 决定于其他引用它是否被回收 |
术语 | 说明 | 缺点 |
标记-清除 | 标记存活的对象,清理掉未被标记的对象 | 标记和清除效率都不高,会产生内存碎片,无法给大对象分配内存 |
标记-整理 | 让所有存活的对象都向一端移动,然后清理掉边界以外的内存 | |
复制 | 将存活的对象复制到另一块上面然后把使用过的内存空间一次清理 | 主要不足是只使用了内存一半,利用率低 |
收集器名称 | 介绍 | 优点 | 缺点 |
Serial收集器 | 串行收集器,只会使用一个线程垃圾收集 | 简单高效,不存在线程交互的开销 | 有停顿,早期客户端模式下能接受,现在不能接受 |
ParNew收集器 | 是Serial的多线程版本 | 使用多线程进行垃圾收集,效率提升 | 执行的过程中,用户线程仍然处于等待状态 |
Parallel Scavenge收集器 | 吞吐量优先垃圾收集器 | 可控制的吞吐量,具备自适应调解策略 | 没有串行收集器和并行收集器干净 |
Serial Old收集器 | Serial收集器的老年代版本,同样是一个单线程收集器 | ||
Parallel Old收集器 | Parallel Scavenge收集器的老年代版本,在1dk1.6提出来的。使用多线程和“标记-整理”算法。 | ||
CMS收集器 | 是一种以获取短回收停顿时间为目标的收集器 | 基于标记-清除算法实现,初始标记、并发标记、重新标记、并发清除 | 对cpu资源非常敏感、处理浮动垃圾失败会出现full gc,会产生大量的空间碎片,也会导致full gc |
G1收集器 | 最好的收集器,步骤为:初始标记、并发标记、最终标记、筛选回收 |
回收总结:新生代GC(Minor GC):Minor GC非常频繁,一般回收的速度也比较快
老年代GC(Major GC/Full GC):比Minor GC 慢10倍以上
java虚拟机的面试也是一块比较重要的知识,大家参加面试前也是要经过学习,形成自己的描述语言,不一定所有的条目都能回答上来,但是一定要自己能说出来自己的理解,感谢大家的阅读,可以关注我的公众号:Java时间屋 进行更多的交流。
页面更新:2024-04-22
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号