JVM面试一文搞定!!!JVM详解!!!

简介: JVM面试一文搞定!!!JVM详解!!!

一、JVM是什么?


JVM的基本概念:对于java来说JVM是一个可运行java代码的假想计算机


JVM里面有一套 字节码指令集,一组寄存器,一个栈,一个垃圾回收器,堆和一个存储方法域。他运行在操作系统上,与硬件没有直接交互。


二、JVM的内存区域


1.思维导图

image.png

2.JVM运行时的内存


java的堆从GC角度分为新生代和老年代,比例是新生代1/3,老年代2/3。

因为频繁的创建对象所以新生代会频繁触发MinorGC进行(小范围GC回收)。

所以新生代分为 Eden区,ServivorFrom区,ServivorTo区。


Eden区,对象刚创建的时候,如果对象很大的话会直接进入老年代。当Eden区内存不够就会触发一次GC,对新生代进行一次垃圾回收。


ServivorFrom区,上一次GC的幸存者,会被当做这次GC的扫描者。(这里我的猜想是上次GC没有回收他但是会标记一下他,方便下次回收。)


ServivorTo区,保留了一次MinorGC过程中的幸存者(这里你看的会有点懵,不着急慢慢往下看)


MinorGC的垃圾回收算法


MinorGC采用的是复制算法,首先把Eden区和ServivorFrom区中存活的对象复制到ServivorTo区去(如果有对象的年龄到达老年代的标准放入老年代),然后清空Eden和ServivorFrom中的对象,然后在把ServivorFrom区和ServivorTo区互换,原 ServicorTo 成为下一次 GC 时的ServicorFrom 区了。


什么是老年代


老年代主要存放生命周期长的内存对象。老年代的对象比较稳定,所以MajorGC不会频繁执行,一般执行MajorGC的时候新生代都会执行一次MinorGC使新生代的对象晋升老年代,然后导致老年代空间不足引发MajorGC。也有一种情况当无法为一个大对象分配一块连续空间时候就会触发MajorGC清理出一块空间。


什么是永久代


内存永久保存的区域,主要存放class和元数据(1.8以后叫这个名字)的信息,class在被加载的时候就会被存放入永久代,GC不会在主程序运行期间对永久代区域进行清理。所以这也导致永久代区域会随着class的增多然后爆满,最终出现OOM异常。


3.JVM如何确定垃圾?


1.引用计数法

java中引用和对象是有关联的(强弱软虚四种引用这里不做解释,大家可以百度),如果要操作对象必须要通过引用来操作,因此看这个对象有没有被引用,如果没有被引用哪这个对象就是可以被回收的的对象。

这里会有 一个循环引用的问题,就是两个对象之间互相引用,但是没有其他的对象引用他们。这种情况下引用计数法就没有办法回收这两个对象了。

image.png

2.根可达法

这个方法就是解决引用计数法里面的循环引用的问题。java通过一些列GC root根对象作为起点去搜索。如果GC root和一个对象之间不可达,那么这个对象就是不可达对象,注意!!!并不是不可达对象就要被回收,这里还要经历再次标记才能判断该不可达对象是否可以回收!

第一次标记筛选

筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize方法,或者finzlize方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”,对象被回收。

第二次标记

如果这个对象被判定为有必要执行finalize()方法,那么这个对象会被放入一个F-Queue的队列中。

finalize方法是对象逃脱死亡的最后一步,GC会对F-Queue队列中的对象进行二次小规模的回收,如果这个时候对象和GC root引用链上的任何一个对象挂钩的话那么就逃离了死亡。第二次标记的时候就会把这个对象移除“即将回收”的集合,如果没有逃脱那么就死翘翘了。


4.JVM的垃圾回收算法


标记清除算法

最基础的垃圾回收算法,分为两步,第一步标记,标记出需要被回收的对象,然后执行第二步清除。

这个算法缺点,造成内存碎片化严重,后续大对象没办法找到可以利用的空间。

image.png

复制算法

为了解决标记清除算法的内存碎片化严重的问题,出现了复制算法。原理,把当前的内

存区域一分为二,只使用一半,当那一半内存满了后把存活的对象复制进另外一半,然

后把已使用的那一半内存清干净。就这样来回倒。

缺点内存使用率只有原来的一般了,如果对象过多效率会很慢。


标记整理算法

结合上面两个算法,先标记存活的对象然后把他们都整理到一端,然后把另一端的对象全部清理掉

效率高,内存使用率高


分代收集法

因为jvm会根据对象存活的生命周期划分不同的区域,分为新生代和老年代

新生代会采用复制算法,因为新生代每次回收大部分对象,需要被复制的少而且新生代会被划分Eden区和两个Servivor区域,每次只使用Eden区和一块Servivor区域。

老年代采用标记整理算法,老年代每次回收只回收少量对象。

image.png

分区收集法

分区算法则将整个堆空间划分为连续的不同小区间, 每个小区间独立使用, 独立回收. 这样做的好处是可以控制一次回收多少个小区间 , 根据目标停顿时间, 每次合理地回收若干个小区间(而不是整个堆), 从而减少一次 GC 所产生的停顿

相关文章
|
1月前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
1月前
|
存储 算法 安全
JVM常见面试题(四):垃圾回收
堆区域划分,对象什么时候可以被垃圾器回收,如何定位垃圾——引用计数法、可达性分析算法,JVM垃圾回收算法——标记清除算法、标记整理算法、复制算法、分代回收算法;JVM垃圾回收器——串行、并行、CMS垃圾回收器、G1垃圾回收器;强引用、软引用、弱引用、虚引用
|
1月前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
2月前
|
存储 监控 算法
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程 ?
尼恩提示: G1垃圾回收 原理非常重要, 是面试的重点, 大家一定要好好掌握
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程  ?
|
3月前
|
安全 Java 应用服务中间件
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
什么是类加载器,类加载器有哪些;什么是双亲委派模型,JVM为什么采用双亲委派机制,打破双亲委派机制;类装载的执行过程
106 35
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
|
2月前
|
Java 应用服务中间件 程序员
JVM知识体系学习八:OOM的案例(承接上篇博文,可以作为面试中的案例)
这篇文章通过多个案例深入探讨了Java虚拟机(JVM)中的内存溢出问题,涵盖了堆内存、方法区、直接内存和栈内存溢出的原因、诊断方法和解决方案,并讨论了不同JDK版本垃圾回收器的变化。
41 4
|
2月前
|
Java API 对象存储
JVM进阶调优系列(2)字节面试:JVM内存区域怎么划分,分别有什么用?
本文详细解析了JVM类加载过程的关键步骤,包括加载验证、准备、解析和初始化等阶段,并介绍了元数据区、程序计数器、虚拟机栈、堆内存及本地方法栈的作用。通过本文,读者可以深入了解JVM的工作原理,理解类加载器的类型及其机制,并掌握类加载过程中各阶段的具体操作。
|
2月前
|
存储 缓存 JavaScript
JVM面试真题总结(一)
JVM面试真题总结(一)
|
3月前
|
存储 缓存 监控
【Java面试题汇总】JVM篇(2023版)
JVM内存模型、双亲委派模型、类加载机制、内存溢出、垃圾回收机制、内存泄漏、垃圾回收流程、垃圾回收器、G1、CMS、JVM调优
【Java面试题汇总】JVM篇(2023版)
|
2月前
|
存储 Kubernetes 架构师
阿里面试:JVM 锁内存 是怎么变化的? JVM 锁的膨胀过程 ?
尼恩,一位经验丰富的40岁老架构师,通过其读者交流群分享了一系列关于JVM锁的深度解析,包括偏向锁、轻量级锁、自旋锁和重量级锁的概念、内存结构变化及锁膨胀流程。这些内容不仅帮助群内的小伙伴们顺利通过了多家一线互联网企业的面试,还整理成了《尼恩Java面试宝典》等技术资料,助力更多开发者提升技术水平,实现职业逆袭。尼恩强调,掌握这些核心知识点不仅能提高面试成功率,还能在实际工作中更好地应对高并发场景下的性能优化问题。