GC【垃圾回收】 *** 面试 +工作 heap + metaspace 1.什么是垃圾? 没有引用指向的对象GC: 1.哪些对象要被回收 which 2.什么时候被回收 when 3.采用什么方式回收 how1.哪些对象要被回收 which 1.引用计数法【了解】 给对象添加了一个引用计数器,引用一次 +1 引用失效 -1 计数器0 说明这个对象可以被回收 缺点: 循环引用 ,会导致 这个对象回收不了 Obejcet a = new Object(); +1 Obejcet b = new Object(); +1 a.xxx=b +1 b.xxx=a +1 a.xxx=b +1 a =>2 b =>3 a=null a =>1 b=null b =>2 2.根节点可达性分析什么是GCroot? 1.栈 2.方法区 3.native stack2.when +how采用什么方式回收? 1.理论:=》 gc算法 2.落地:=》垃圾收集器 gc算法: 1.标记清除: mark-sweep 标记: 标记哪些对象要被清除【根节点可达性分析】 清除:垃圾对象进行清除 缺点: 内存碎片 stop the world =》 stw 暂停应用 2.标记整理: 标记: 标记哪些对象要被清除【根节点可达性分析】 进行清除 整理:移动活的对象 进行内存整理 3.复制: 1.把内存分成大小相同的两片 2.浪费了一些内存 3.没碎片对象: 夭折:90% 老不死的:old 0-15 15 这个对象是足够的老 不灭的:class 、pool年轻代参数: -Xmnsize =》 年轻代 XX:SurvivorRatio=ratio =》 8:1:1 垃圾收集器 : 1.串行垃圾收集器 2.并行垃圾收集器 3.并发垃圾收集器 4.G1垃圾收集器【比较复杂】1.串行垃圾收集器 1.一个线程处理垃圾回收 2.stw app=>gc=>app 2.并行垃圾收集器 1.多个线程处理垃圾回收 2.比 串行垃圾收集器 stw时间短3.并发垃圾收集器 你的程序线程 和 gc线程 并发执行 没有stw分代算法: 年轻代 老年代1.年轻代 1.年轻代:串行 -Xms5m -Xmx5m -XX:+PrintGCDetails -XX:+UseSerialGC DefNew 年轻代 串行垃圾回收器 Tenured 老年代 串行垃圾回收器打印 2.年轻代:ParNew(并行) -Xms5m -Xmx5m -XX:+PrintGCDetails -XX:+UseParNewGC ParNew 年轻代 并行垃圾回收器 Tenured 老年代 串行垃圾回收器打印 3.年轻代:Parallel Scavenge(并发) jinfo -Xms5m -Xmx5m -XX:+PrintGCDetails -XX:+UseParallelGC PSYoungGen 年轻代 并发垃圾回收器 ParOldGen 老年代 并行垃圾回收器 注意: 可以从单单 一个方面入手 eg:年轻代 老年代的gc 就确定了2.老年代 1.老年代:串行 【用不了】 -Xms5m -Xmx5m -XX:+PrintGCDetails -XX:+UseSerialOldGC【参数没有找到】 2.老年代:Parallel old(并行) -Xms5m -Xmx5m -XX:+PrintGCDetails -XX:+UseParallelOldGC PSYoungGen 年轻代 并发垃圾回收器 ParOldGen 老年代 串行垃圾回收器打印 3.CMS(并发标记清除) 1.目的 gc =》 停顿的时间比较短 -Xms5m -Xmx5m -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC ParNew 年轻代 并发垃圾回收器 CMS 老年代 cms垃圾回收器
java-ed
最新推荐文章于 2022-07-23 23:08:51 发布