0
点赞
收藏
分享

微信扫一扫

jvm面试题

海牙秋天 2022-05-02 阅读 107
JVM内存有哪些区域
1. 弱引用和软引用有什么区别

两者都可以提高GC的效率,但是弱引用直到失去最后一个强引用才会被回收。而软引用虽然不能阻止被回收,但可以维持到内存不足时,也就是下次FullGC时。

2.类加载过程

五个阶段,分别为加载、验证、准备、解析以及初始化。

3.直接内存

优点:
减少垃圾回收影响:JVM直接受操作系统管理,
提升IO效率:堆内内存由JVM管理,属于“用户态”;而堆外内存由OS管理,属于“内核态”。如果从堆内向磁盘写数据时,数据会被先复制到堆外内存,即内核缓冲区,然后再由OS写入磁盘,使用堆外内存避免了这个操作

缺点:需要手动去触发GC,因为没有JVM协助管理内存,需要我们自己来管理堆外内存,防止内存溢出。为了避免一直没有FULL GC,最终导致物理内存被耗完。我们会指定直接内存的最大值,通过-XX:MaxDirectMemerySize来指定,当达到阈值的时候,调用system.gc来进行一次full gc,把那些没有被使用的直接内存回收掉。

4.常见垃圾回收器 -7种

1.Serial:最古老的垃圾收集器,“Serial”体现在其收集工作是单线程的, 在进行垃圾收集过程中,会进入臭名昭著的“Stop-The-World”状态,一直是 Client 模式下 JVM 的默认选项。复制算法(-XX:+UseSerialGC)
2.Serial Old:老年代,采用了标记 - 整理(Mark-Compact)算法
3.ParNew:新生代 GC 实现,是 Serial GC 的多线程版本,最常见的应用场景是配合老年代的 CMS GC 工作(-XX:+UseParNewGC)
4.Parallel Scavenge: 新生代的多线程收集器(并行收集器) 其采用的是Copying算法,是 server 模式 JVM 的默认 GC 选择(-XX:+UseParallelGC)
5.Parallel Old:并行运行;作用于老年代;标记-整理算法;吞吐量优先;适用于后台运算而不需要太多交互的场景。
6.CMS:基于标记 - 清除(Mark-Sweep)算法,设计目标是尽量减少停顿时间,采用的标记 - 清除算法,存在着内存碎片化问题,所以难以避免在长时间运行等情况下发生 full GC(-XX:+UseConcMarkSweepGC),在 JDK 9 中被标记为废弃(deprecated)
7.G1:兼顾吞吐量和停顿时间的 GC 实现,是 Oracle JDK 9 以后的默认 GC 选项。G1 可以直观的设定停顿时间的目标。
G1 同样存在着年代的概念,但是与我前面介绍的内存结构很不一样,其内部是类似棋盘状的一个个 region 组成。

你都有哪些手段用来排查内存溢出?

(这个话题很大,可以从实践环节中随便摘一个进行总结,下面举例一个最普通的)
你可以来一个中规中矩的回
内存溢出包含很多种情况,我在平常工作中遇到最多的就是堆溢出。有一次线上遇到故障,重新启动后,使用jstat命令,发现Old区在一直增长。我使用jmap命令,导出了一份线上堆栈,然后使用MAT进行分析。通过对GC Roots的分析,发现了一个非常大的ConcurrentLinkedQueue对象,这个原本是有位同学做异步本地队列缓存用的,批量从mq消费打入本地缓存,然后再一条条从本地消费,但是作为一个无界队列缓存,造成了堆内存占用一直上升。后来将这个队列设置为有界队列LinkedBlockingQueue了。

还有,对数据库中的热点数据做本地缓存,用hashMap,发现热点数据越来越大,没有做清除的动作后来,将这个缓存改成 guava的Cache,并设置了弱引用,故障就消失了。

这个回答不是十分出彩,但着实是常见问题,让人挑不出毛病。

知识点

重新标记:即第二次标记,如果被筛选判定位有必要执行回收,则会放入FQueue队列,并自动创建一个低优先级的finalize线程来执行释放操作。如果在一个对象释放前被其他对象引用,则该对象会被移除FQueue队列。

举报

相关推荐

JVM 面试题

JVM面试题

面试题--JVM面试总结

JVM面试题(一)

面试题:JVM相关

【JVM】面试题汇总

java面试题(jvm)

0 条评论