高级Java开发面试常用题的答案(二)

本文深入探讨了Java面试中常见的JVM和多线程问题。详细介绍了JVM的堆内存结构、垃圾回收算法,如CMS的详细流程,以及常用的JVM启动参数和内存监控工具。在多线程部分,讨论了线程安全、死锁避免、Volatile关键字的作用,以及HashMap在并发环境下的注意事项。同时,文章还提到了线程池ThreadPoolExecutor的重要参数及其作用。
摘要由CSDN通过智能技术生成

三、JVM

· JVM堆的基本结构。

image.png

java_heap_struct.jpg

参考阅读:JVM内存堆布局图解分析

· JVM的垃圾算法有哪几种?CMS垃圾回收的基本流程?

基本的算法有:

  1. 标记-清理算法

    等待被回收对象在被标记后直接对对象进行清理,会带来另一个新的问题——内存碎片化。假如下次有比较大的对象实例需要在堆上分配较大的内存空间时,可能会出现无法找到足够的连续内存而不得不再次触发垃圾回收。

  2. 复制算法(Java堆中新生代的垃圾回收算法)

    此GC算法实际上处理了标记-清理算法带来的“内存碎片化”问题。首先还是先标记处待回收内存和不用回收的内存,下一步将不用回收的内存复制到新的内存区域,这样旧的内存区域即可以一律回收,而新的内存区域则是连续的。它的缺点就是会损失掉部分系统内存,由于你总要腾出一部分内存用于复制。

  3. 标记-压缩算法(或者称为标记-整理算法,Java堆中老年代的垃圾回收算法)

    对于新生代,大部分对象都不会存活,所以在新生代中使用复制算法较为高效,而对于老年代来讲,大部分对象可能会继续存活下去,假如此时还是利用复制算法,效率则会降低。标记-压缩算法首先还是“标记”,标记过后,将不用回收的内存对象压缩到内存一端,此时就可直接清理边界处的内存,这样就能避免复制算法带来的效率问题,同时也能避免内存碎片化的问题。老年代的垃圾回收称为“Major GC”。

image.png

jvm_gc.png

CMS的基本流程:

  1. 初始标记 :在这个阶段,需要虚拟机停顿正在执行的任务,官方的叫法STW(Stop The Word)。这个过程从垃圾回收的"根对象"开始,只扫描到能够和"根对象"直接关联的对象,并作标记。所以这个过程尽管暂停了整个JVM,但是很快就完成了。
  2. 并发标记 :这个阶段紧随初始标记阶段,在初始标记的基础上继续向下追溯标记。并发标记阶段,应用程序的线程和并发标记的线程并发执行,所以客户不会感受到停顿。
  3. 并发预清除 :并发预清除阶段依然是并发的。在这个阶段,虚拟机查找在执行并发标记阶段新进入老年代的对象(可能会有少量对象从新生代晋升到老年代, 或者者有少量对象被分配到老年代)。通过重新扫描,减少下一个阶段"重新标记"的工作,由于下一个阶段会Stop The World。
  4. 重新标记 :这个阶段会暂停虚拟机,收集器线程扫描在CMS堆中剩余的对象。扫描从"跟对象"开始向下追溯,并解决对象关联。
  5. 并发清除 :清除垃圾对象,这个阶段收集器线程和应用程序线程并发执行。
  6. 并发重置 :这个阶段,重置CMS收集器的数据结构,等待下一次垃圾回收

延伸说明:

  • CMS(Concurrent Mark-Sweep) 在启动JVM参数加上-XX:+UseConcMarkSweepGC,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记—清理(Mark-Sweep)。CMS不会整理、压缩堆空间。这样就会有一个问题:经过CMS收集的堆会产生空间碎片。CMS的另一个缺点是它需要更大的堆空间。
  • 假如你的应用程序对停顿比较敏感,并且在应用程序运行的时候可以提供更大的内存和更多的CPU(也就是硬件牛逼),那么使用CMS来收集会给你带来好处。还有,假如在JVM中,有相对较多存活时间较长的对象(老年代比较大)会更适合使用CMS。

· JVM有哪些常用启动参数可以调整,形容几个?

各主要JVM启动参数的作用如下:
-Xms:设置jvm内存的初始大小
-Xmx:设

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值