48.Java虚拟机面试怎么面?

文章目录

前言

Java虚拟机面试也是面试经常会被问到的问题,Java之所以现在占有市场这么大就是因为其跨平台的特性,而跨平台的支撑就是虚拟机,当然虚拟机还有一个特性就是帮助我们管理内存,不需要再手动释放,本篇文章来介绍下虚拟机主要涉及到的面试问题总结。希望能帮助到正在面试的你。

1.虚拟机的结构:

整个java代码和虚拟机交互的流程为:
class文件-》类装载器《-》内存区域
内存区域包含:方法区、堆、虚拟机栈、本地方法栈、程序计数器 这一段也叫运行时数据区

然后《-》转型引擎-》本地库接口-》本地方法库 完成整个的程序的执行过程

当然上面运行时数据区跟本地库接口也存在双向交互的操作。

2.什么是Java内存模型:

这里概念一定要明确,内存模型不是那个运行时数据图。

java内存模型全称为Java Memory Model,是java虚拟机为了java程序能够正常运行而制定的一套规范,规范中规定了JVM中的数据如何与RAM的数据进行交互。

java中分为主内存和工作内存,主内存中存放共享变量:实例字段、静态字段、数组对象元素。线程对共享数据的操作必须在工作内存中进行。这就是为什么需要java内存模型,其实就是对内存的管理,线程间的变量值的传递都需要通过主内存完成,不能相互之间访问变量。
内存模型的抽象结构图:

48.Java虚拟机面试怎么面?

3.类加载机制面试题:

3.0 为什么不能自己写个String类:

双亲委派机制,类加载机制决定会先去加载父类,父类发现String冲突就不加载了。

延伸:类加载器种类和介绍:

名称

说明

备注

启动类加载器,Bootstrap Classloader

加载JAVA_HOMElib等底层类


扩展类加载器,Extension ClassLoader

libext,扩展类的加载


应用程序类加载器,Application ClassLoader

加载ClassPath中的类库


自定义类加载器

通过继承ClassLoader实现,加载我们自定义类的双亲委派模型


双亲委派模型:类加载时,先将请求委派给父类加载器加载完成,最底层、顶层Bootstrap ClassLoader加载器,如果父类无法加载,子类尝试自己加载。

双亲委派的好处:避免同一个类被多次加载,每个加载器只能加载自己范围的类。

3.1 能否在加载类的时候,对类的字节码进行修改:

可以,使用Java探针技术

3.2 类加载的生命周期:

类加载分三个步骤:加载、链接、初始化

流程为:
加载-》验证-》准备-》解析-》初始化
-》使用-》卸载

其中验证、准备、解析又叫链接

4.垃圾收集面试题

垃圾收集主要是针对堆和方法区进行,程序计数器、虚拟机栈、本地方法栈这三个区域都是私有的,线程生命周期结束后,会自动回收。

4.1垃圾收集面试题怎样判断一个对象是否可被回收?

方法

说明

备注

引用计数算法

对象添加计数器,当有引用就加1反之减1,当为0的时候回收

因为循环引用的存在,java虚拟机没采用

可达性分析算法

通过GC Roots作为起点进行搜索,能够达到的对象是存活的,不可达的对象可被回收


4.2引用类型介绍?

上面判断对象是否可被回收都涉及到引用相关。

术语

说明

备注

强引用

强引用的对象不会被回收


软引用

只有在内存不足时被回收


弱引用

一定会被回收,生命周期就是下次垃圾回收之前


虚引用

目的就是被回收的时候收到系统通止规,对其生存时间没有影响

决定于其他引用它是否被回收

4.3垃圾收集算法?

术语

说明

缺点

标记-清除

标记存活的对象,清理掉未被标记的对象

标记和清除效率都不高,会产生内存碎片,无法给大对象分配内存

标记-整理

让所有存活的对象都向一端移动,然后清理掉边界以外的内存


复制

将存活的对象复制到另一块上面然后把使用过的内存空间一次清理

主要不足是只使用了内存一半,利用率低

4.4垃圾收集器介绍?

收集器名称

介绍

优点

缺点

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

标签:虚拟机   双亲   线程   算法   生命周期   标记   模型   加载   机制   对象   内存   垃圾   程序   方法   数据   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top