打印gc信息VM arguments: -verbose:gc -XX:+PrintGCDetails
答:引用计数法是一个较为简单的算法,实际上就是在对象中添加一个引用计数器,这个计数器记录着该对象被使用的次数,当有地方引用到这个对象的时候,引用计数器的值就+1,当引用失效的时候(如把对象置为null),计数器就-1。垃圾收集器在进行垃圾回收时,对扫描到的每一个对象判断一下计数器是否等于0,若等于0,就会释放该对象占用的内存空间,同时将该对象引用的其他对象的计数器进行减一操作。
优点:实现简单、判定效率高 缺点:难以解决对象之间的循环引用问题答:从GC Roots(每种具体实现对GC Roots有不同的定义)作为起点,向下搜索它们引用的对象,可以生成一棵引用链,链的节点视为可达对象,反之视为不可达,可以解决对象之间的循环引用问题。
不可达对象一定会被回收吗?
答:不是。执行垃圾回收前JVM会执行不可达对象的finalize()方法,如果执行完毕之后该对象变为可达,则不会被回收它,但一个对象的finalize方法只会被执行一次。
回收策略
总共有两个过程:第一个过程是标记——标记被引用的对象,即可达对象,反之为不可达对象将其回收(使用引用计数法或可达性分析法)
第二个过程是清除
缺点:1、效率低下问题(清除后会出现越来越多不连续的空间,当分配一个大对象的时候,由于空间的不连续,在进行寻址的过程存在效率低下的问题,若寻址不到,JVM可能还会触发一次垃圾回收)
2、空间问题
未被标记(未被回收的对象)复制到内存2后,排序,变为连续的内存地址空间,最后把内存1中被标记的对象清空。
若内存2中又存在垃圾被标记,则未被使用(未被标记)的内存区域复制到内存1,排序,内存1对象地址变为连续地址,内存2再被清理掉。以此循环...复制算法一定程度上解决了标记-清除算法效率低下的问题。但也存在内存资源消耗过大问题,内存只有一半被使用(为解决此问题,采用内存分代方案)
这样的话内存不会被浪费太多(左边servivor的10%,是可接受的)
跟第一种标记-清除算法很类似,将需要回收的对象和不需要回收的对象通过在内存空间中移动进行分离
未被标记部分 已被标记部分(最后回收)
采用标记整理算法和复制算法相结合,根据分代的不同(新生代和老年代)决定选用何种收集算法(标记整理算法和复制算法)
程序线程执行——停止线程——开启垃圾回收单线程——清理后垃圾回收线程停止——程序线程执行 以此循环
-XX:+UseSerialGC
程序线程执行——停止线程——开启垃圾回收多线程——清理后垃圾回收线程停止——程序线程执行 以此循环
XX:+UseParNewGC 线程数量可以使用XX:ParaleiGCThreads参数指定
程序线程执行——停止线程——开启垃圾回收多线程——清理后垃圾回收线程停止——程序线程执行 以此循环
复制算法(新生代收集器)
多线程收集器
达到可控制的吞吐量: cpu用于运行用户代码的时间 与 cpu消耗的总时间的比值
吞吐量 = 执行用户代码时间 / (执行用户代码的时间 + 垃圾回收所占用的时间)
若程序运行了100ms,垃圾回收所占用时间为1ms,则吞吐量为(100-99) / 100 = 99%
为了达到可控的吞吐量(设置合理的VM参数)
-XX:MaxGCPauseMillis 垃圾收集器的最大停顿时间(ms)
-XX:GCTimeRatio 吞吐量区间可选(0,100) 不包括0和100
从某种角度说,降低最大停顿时间,会有良好的响应速度,用户体验感好。 作为服务端,注重高并发,后台运算,不需要过多交互情况下,Parallel做垃圾收集器更适合。
-XX:+UseParallelOldGC 进行设置使用老年代的OldParallel收集器 -XX:+ParallelCThread也可以设置垃圾收集时的线程教量。
优点 并发收集,即CMS收集器的内存回收过程是与用户线程一起并发执行的低停顿
缺点 占用大量的cpu资源无法处理浮动垃圾出现Concurrent Mode Failure(并发清理时,预留的内存区域过小)空间碎片
java最屌的收集器
G1回收器(Garbage-First)是在jdk1.7中提出的垃圾回收器,从长期目标来看是为了取代CMS回收器,G1回收器拥有独特的垃圾回收策略,G1属于分代垃圾回收器,区分新生代和老年代,依然有eden和from/to区,它并不要求整个eden区或者新生代、老年代的空间都连续,它使用了分区算法。
并行性: G1回收期间可多线程同时工作。 井发性G1拥有与应用程序交替执行能力,部分工作可与应用程序同时执行,在整个GC期间不会完全阻塞应用程序。 分代GC:G1依然是一个分代的收集器,,G1在回收过程中,不会像CMS那样要进行碎片整理。 G1用了有效复制对象的方式,减少空间碎片。
使用.XXX:+UseG1GC 应用G1收集器, Mills指定最大停顿时间 使用-XX:MaxGCPausel 设置并行回收的线程数量 使用-XX:ParallelGCThreads
