1、JVM何时会回收♻️类?-----0415
三个条件缺一不可:
- 1、类的所有实例(堆中)都已经被回收♻️。
- 2、该类的ClassLoader已经被回收♻️了。
- 3、该类对应的Class对象没有任何引用。
2、方法执行完毕,栈帧立马出栈,该栈帧中的变量数据立马回收♻️?还是等垃圾回收器回收♻️?为什么?-----0416
出栈就回收了,基础类型变量内存分配就在栈中,所以出栈就直接销毁了。引用堆中的对象需要等一次YongGC。
3、实例对象被回收’和‘Class对象没有引用’ 是一个概念么?-----0417
不是,Class对象代表的是类,如果有变量引用了类的Class对象,那么就是有引用。
4、新生代为何分为三块区域{Eden、From、To},半劈分成两块为什么不行?-----0418
三块区域,只有From or To 空间是闲置的,而分为两块后,要有一半的新生代资源闲置着。
5、如何理解STW对系统的影响?调优策略如何制定?------0419
一直以来都是想着控制yonggc在50ms以下,oldgc在300ms以下。但是GC执行势必都会带来STW,JVM分代回收♻️的本质是对象的生命周期结束时就近一次执行GC进行回收。所以调优者需要估算出对象的生命周期。
6、parnew+cms回收器,如何保证只做yonggc?-------0420
需要观察每秒钟新增多少对象,多长时间触发一次yonggc,平均一次yonggc后有多少对象存活,survivor区域是否放的下(对象动态年龄等问题),计算survivor区域与eden区域比例跳过动态年龄导致进入老年代的问题。
7、使用ParNew回收器并行线程是怎么设置的?------0421
一般是与应用服务器的CPU核数保持一致。非要设定可以使用-XX:ParallelGCThreads指定。
8、启动系统的时候是选择服务端模式还是客户端模式?对ParNew有什么影响?------0422
系统部署在linux上就选择server模式,部署在windows上就选择client模式。
一般web项目都是部署在多核的linux服务器上面,ParNew可以充分利用多核资源。windows上一般都是安装client模式,比如qq、wx等,如果用ParNew方式会导致CPU运行多个线程,反而加重了性能开销。所以Client一般选择Serial模式。
9、CMS回收♻️第一阶段“初始标记”都标记哪些?STW嘛?------0423
初始标记需要STW,为了保障低停顿,只标记出GC-ROOT直接引用的对象。
10、CMS回收♻️第二阶段“并发标记”都标记哪些?STW嘛?------0424
并发标记不会STW,垃圾回收线程与工作线程同时工作。并发标记时根据第一阶段标记的GC-ROOT进行延展标记。
11、CMS回收♻️第三阶段“重新标记”都标记哪些?STW嘛?------0425
重新标记需要STW,需要标记第二阶段新创建对象&已有对象可能失去引用变成垃圾。
12、CMS回收♻️第四阶段“并发清理”会STW嘛?------0425
并发清理很耗时,需要进行对象清理,垃圾回收线程与工作线程并发运行的,不会STW。
13、CMS回收♻️“并发标记”&“并发清理”这两个阶段时,垃圾回收线程与工作线程并行运行,会导致cpu资源会成为瓶颈,CMS并发回收线程数如何设置?-------0426
cms默认启动的垃圾回收线程数:(cpu核数+3)/4
14、CMS回收器在“并发清理”阶段可能会发生“Concurrent Mode Failure”问题?为什么?发生了“Concurrent Mode Failure”问题jvm会如何解决?-------0427
CMS在“并发清理”阶段系统线程是工作着的,这就会产生“浮动垃圾”(通过YongGC进入老年代的对象),CMS为了保证回收期间还有一定的内存空间让一些对象进入老年代,一半会预留一些空间,-XX:CMSInitiatingOccupancyFraction设置剩余百分比(默认68%)。
如果CMS在回收期间,剩余空间小于本次晋升的对象大小会怎样呢?
就会发生“Concurrent Mode Failure”错误,也就是说并发垃圾回收失败,此时JVM会升级处理策略:自动启用“Serial Old”垃圾回收♻️替代CMS回收♻️,Serial Old 会强行STW,重新进行GC-Roots跟踪标记出全部垃圾对象,不允许新对象产生,一次性清理垃圾对象,然后恢复系统线程。
15、CMS内存碎片整理会STW嘛?为什么?-------0428
首先内存整理会STW,内存碎片会导致分配连续空间受阻,JVM就会频繁触发FullGC。所以CMS也会根据设置-XX:CMSFullGCsBeforeCompaction=n意思是说在上一次CMS并发GC执行过后,到底还要再执行多少次full GC才会做压缩。默认是0,也就是在默认配置下每次CMS GC顶不住了而要转入full GC的时候都会做压缩。 如果把CMSFullGCsBeforeCompaction配置为10,就会让上面说的第一个条件变成每隔10次真正的full GC才做一次压缩。
16、有几种情况会触发老年代执行GC?-------0429
-1、老年代可用空间小于新生代全部对象的大小,如果没有开启空间担保策略会执行FullGC,一般默认担保策略是打开的。
-2、历次新生代GC后进入老年代的平均大小大于老年代可用空间。
-3、老年代使用空间大于-XX:CMSInitiatingOccupancyFraction设置的阀值。
17、什么是分配担保?默认开启嘛?可以去掉分配担保机制吗?为什么需要的是连续空间?-------0430
- 1、在发生Minor GC之前,虚拟机会检查
老年代最大可用的连续空间
是否大于新生代所有对象的总空间
。- 如果大于,则此次Minor GC是安全的。
- 如果小于,则虚拟机会查看HandlePromotionFailure设置分配担保。
- HandlePromotionFailure=true,老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小,如果大于,则尝试进行一次Minor GC。
- HandlePromotionFailure=false or 老年代最大可用连续空间小于历次晋升到老年代的对象的平均大小,执行FullGC。
- 2、1.6以后是默认开启的。
- 3、可以去掉,会加大FullGC发生的概率。虚拟机短暂停止,吞吐量、性能下降。
- 4、新生代使用的是复制算法,复制算法决定需要连续空间。