【直击面试】JVM这些面试题你都会了吗

简介: 查漏补缺JVM面试题👀小提示:有些干,谨慎食用!!!!

1.JVM运行时内存结构

2.对象和内存溢出

3.GC算法


1.JVM运行时内存结构


1.由如下图构成。Runtime Data Area有如下几个区,其中PC程序计数器、

虚拟机栈和本地方法栈是线程独享的,堆和方法区是线程共享的。Classload用来加载class文

件,执行引擎用来执行程序,本地方法接口调用本地方法库。


2.java stack比较简单,每一个都是一个栈帧,每个栈帧由三部分构成。局部变量区、

操作数区和帧数据区。局部变量是一个以数组形式管理的内存区,一般第0位是指向

自己的this引用;其他的都是基本数据类型和reference类型和returnedAddress类型。

操作数区不是通过索引来访问,通过入栈出栈来访问,是临时数据的存储区域,比方

说数学计算。帧数据区是保存一些指向常量池的指针,需要常量数据时就通过这个指

针来访问常量池数据。



3.共享内存区:分为permanent space、old space、From,survivor、To survivor和

Eden。其中premanent包括runtime constant pool和已加载的类信息和方法信息。

Old space(tenured generation)包含生命周期长的存活对象。From survivor和Eden

存放存活比较短的对像,To survivor是用来复制保存存活的对象。



4.JVM参数设置。

-Xmx:最大堆内存,如:-Xmx512m

-Xms:初始时堆内存,如:-Xms256m

-XX:MaxNewSize:最大年轻区内存

X:NewSize:初始时年轻区内存.通常为mx的1/3或1/4。新生代=Eden+2

个Survivor空间。实际可用空间为=Eden+1个Survivor,即90%

-XX:MaxPermSize:最大特久带内存

-XX:PermSize:初始时特久带内存

XX:+PrintGCDetails。打印GC信息

-X:NewRatio新生代与老年代的比例,如-X:NewRatio=2,则新生代占整个堆

空间的1/3,老年代占2/3

-XX:SurvivorRatio新生代中Eden与Survivor的比值。默认值为8。即Eden占新生

代空间的8/10,另外两个Survivor各占1/10

栈:

×SS:设置每个线程的堆栈大小.JDK1.5+每个线程堆栈大小为1M,般来说如果

栈不是很深的话,1M是绝对够用了的。Lst集合存储元素特点?


2.对象和内存溢出


1.对象


A.创建。首先检查指令的参数能不能在常量区找到类的符号引用,并检查这个类

是否加载、解析和初始化过,如果没有就执行类的加载过程。其次是内存分配

类加载之后就知道要分配的内存大小,分配方法有两种,一种是指针碰撞,就

是一块内存是使用过的,一块是未使用的,用一个指针分割,新分配的内存指

针就向空闲的挪动,compact功能的虚拟机是用指针碰撞;另一种是空闲列表

就是一个列表记录空闲的内存块,不断更新列表,新分配的内存在列表中寻找

一个合适大小的内存块,sweep功能的虚拟机是使用空闲列表。第三,在分配

内存空间的时候,还要考虑并发性。有两个方法,一种是同步处理,如采用

C八S和失败重试的方法:另外一种是把内存分配动作按照线程划分在不同的空

间之中,每个线程在堆中预先分配一小块内存,本地线程分配缓冲TLAB,那

个线程需要分配内存在那个TLAB上分配,只有TLAB用完了,才要同步锁定

重新分配。第四、对对象进行必要设置,比方说对象属于那个类,如何找到类

的元数据信息和对象hashcode以及对象GC分代年龄等。


B·对象的内存布局。分为对象头、实例数据和对齐填充。对象头包括两部分,第

部分是存储对象自身信息,如hashcode,GC分代年龄,锁状态等;第二部

分是类型指针,对象指向它的类的元数据的指针,虚拟机通过这个指针确定这

是那个类的实例。


C.对象访问定位。两种方式,一种是句柄访问,句柄池有访问对象实例数据的指

针和访问对象数据类型的指针。这个访问最大好处是reference是稳定的句柄

池地址,对象改变都是改变句柄池里面的指针,而reference本身不动。另外

一种就是直接指针,它有到对象类型数据的指针和实例数据。这个访问的好处

是速度更快,节省了一次指针定位的开销。


2. 内存溢出 OOM。

A.准益出。堆存放的是对象实例,只要不断创建对象,并且保证GC Root到对象

有可大路径避免被垃圾回收清除掉对象,那么对象数量达到最大堆容量限制就

会OOM。用内存映象分析工具,Eclipse Memory Analyzer分析一下。


B.虚拟机栈和本地方法栈益出。分为两种,一种是如果线程清求的栈深度大于虚

拟机所允许的最大深度,抛出StackOverFlowError异常;另一种是如果虚拟机

在扩展栈时无法申请到足够内存空间,抛出OutOfMemoryError异常。可以减

小最大堆和栈容量来获取更多的线程数量。


C.方法区和常量池溢出。会有额外提示PermGen space。.


D.本机直接内存益出。这个Heap Dump文件看不到内存占用,但是如果有直接

或简介使用了NO,那有可能就是本机直接内存溢出了。


3. GC 算法


1. 判断对象可以回收。

A.引用计数器方法。对象被引用就加一,失效的时候减一;为0时就可以释放。

缺点是,GC有环的时候不能释放。


B.GC Root。以根对象为起点,然后根据关联关系向下搜索。如果根对象找不到

任何路径与之相连,就判断为对象可以被回收。GC Root的选取有四种:虚拟

机栈中引用对象,方法区中类的静态属性引用对象,方法区中常量引用对象和

本地方法栈中i引用对象。可达性分析算法标记了的对象,默认是第一次标

泊,如果这个对像没有实现finalize方法的话,就直接回收了;如果实现了

finalize方法的话,就要把第一次标记的对象放到一个F-Queue队列里面,然

后虚拟机会启动一个Finalizer线程去执行,然后会进行第二次标记。第二次标

记的对象就直接回收。要想存活一次的话,就重写finalize方法,如果想复活

的话,就在finalize里,把自己关联到任何一个上就行,如,把自己赋值给某

个类变量或者对象的成员变量。


C.强引用对象任何时候都不会被回收;软引用在内存够的时候不会被回收,在不

够时候会,SoftReference类;弱引用在虚拟机回收时直接回收,WeakReference。

虚引用不会构成任何对对象的影响,创建目的是为了对象被回收时系统得到一个通知

消息,PhantomReference。


2. 垃圾回收算法。

A.标记-清除(mark-sweep)。缺点是内存碎片多。


B.标记-复制(mark-copy)。将内存分为两块,一块内存保留对象的全部复制到另一

块空闲内存中。缺点是内存减半。所以分区来实现,eden,s0,s1,按一定比例,

默认8:1:1即可。这个就是Minor GC,一般情况下,对象在Eden上申请空间,

当发现没有足够空间,就发生Minor GC,会把Eden和From survivor里的保留的

对象复制到To survivor里面,然后清空Eden和From survivor内存,然后rom

survivor和To survivor对换。如果To survivor空间不够,直接把From survivor

对象复制到old space,或者部分年龄足够了的对象也会直接复制到old space。

From survivor把对像复制到Tenured区域时,如果设置了

HandlePromotionFailure(允许担保失败),如果允许就只进行Minor GC,如果不

允许就触发ulGC。


C.标记整理(mark-compact)。整理时,先清除掉应该清除的对象,然后把存活的

对象压缩到堆的一端,按顺序排放。FuGC需要对整个堆进行回收。比方说

Tenured满了,permanent满了人system.gc显示调用,会发生Full GC。

Permanent要回收,一般回收的是常量池的常量和无用的类信息。类所有实例都回

收了,加载类的classloader已经被回收了和类的class对象没有被引用(没有通过

反射引用该类)这三条满足了才会回收类。


小提示


今日内容有些干,请谨慎食用!!!!

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