Java虚拟机-GC

判断死对象

1.引用技术算法

每个对象添加一个引用计数器,每当一个方法引用就+1;当引用失效则-1。当计数为0时,则该对象是不可再使用的。

缺点:不能解决对象之间互相循环的问题。

2.可达性分析算法

基本思路是通过一系列的成为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC  Roots没有任何引用链相连时,则证明此对象是不可用的。

在Java语言中,可作为GC Roots 的对象包括下面几种:

  • 虚拟机栈(帧栈中的本地变量表)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI引用的对象

引用的概念

JDK1.2之后,java对引用的概念进行了扩充,将引用分为强引用、软引用、弱引用、虚引用,引用强度一次减弱。

强引用:指在程序代码中普遍存在的,类似Object object = new Object()这类的引用,只要强引用还存在,垃圾收集器永远不会回收被引用的对象。

软引用:用来描述一些还有用但并非必须的对象。对于软引用关联的对象,在系统将要发生内存溢出异常之前,将会把这些对象列入回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才回抛出内存溢出异常。JDK1.2之后,提供了SoftReference类来是想软引用。

弱引用:非必须对象,但他的强度比软引用更弱一点,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。WeakReference类来实现弱引用。

虚引用:最弱的一种引用关系,也叫做幽灵引用或者幻影引用。完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的在于这个对象被回收时可以收到一个系统通知。PhantomReference类。

To Be, Or Not To Be(看看就行)

在可达性分析中不可达的对象,也并非是“非死不可”,这时他们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历两次标致过程:如果对象在进行可达性分析之后发现没有与GC Roots没有相连接的引用链,那么它将被第一次标致并进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()或者已被虚拟机调用之后,将被视为没有执行必要。

如果有必要,将放在一个低优先级的F-Queue队列中等待执行。在finalzie中是最后机会逃离被回收的机会,稍后Gc将对这个队列中的对象进行第二次小规模的标致,如果成功在finalize中拯救了自己,那么这个对象将在第二次标志中被移除出“即将回收”集合。

垃圾收集算法

1.标志-清除算法

2.复制算法(商业虚拟机用这种手机算法来回收新生代)

新生代中98%的对爱选哪个是“朝生暮死”的,因此并不需要按照1:1的比例来划分内存空间,而是将内训分为一个较大的eden空间和两个较小的suvivor空间,每次使用Eden和其中的一个suvivor空间。当回收时,将eden和suvivor中还存活这的对象一次性复制到另一suvivor空间中,最后清理掉eden和刚才使用过的suvivor空间。HotSpot虚拟机默认的Eden和suvivor的大小为8:1,也就是说每次新生代可使用的内存空间为整个新生代容量的90%(80+10),10%的内存会被浪费掉。当suvivor的空间不够用时,我们需要依赖其他内存进行分配担保。

3.标记-整理算法(老年代)

复制算法在对对象存活率较高时效率会降低。

此算法让所有存活的对象向一段移动,然后直接清理掉端以外的内存。

4.分代收集算法

根据对象存货周期将内存划分为几块,java堆分为新生代和老年代。新生代用复制算法,老年代用标志-清除或标志整理。

 

垃圾回收器参数总结

 参  数

 描  述

 UseSerialGC

 虚拟机运行在Client 模式下的默认值,打开此开关后,使用Serial +
Serial Old 的收集器组合进行内存回收

 UseParNewGC

 打开此开关后,使用ParNew + Serial Old 的收集器组合进行内存回收

 UseConcMarkSweepGC

 打开此开关后,使用ParNew + CMS + Serial Old 的收集器组合进行内存
回收。Serial Old 收集器将作为CMS 收集器出现Concurrent Mode Failure失败后的后备收集器使用

 UseParallelGC

 虚拟机运行在Server 模式下的默认值,打开此开关后,使用Parallel
Scavenge + Serial Old(PS MarkSweep)的收集器组合进行内存回收

 UseParallelOldGC

 打开此开关后,使用Parallel Scavenge + Parallel Old 的收集器组合进行内存回收

 SurvivorRatio

 新生代中Eden 区域与Survivor 区域的容量比值, 默认为8, 代表
Eden :Survivor=8∶1

 PretenureSizeThreshold

 直接晋升到老年代的对象大小,设置这个参数后,大于这个参数的对象
将直接在老年代分配

 MaxTenuringThreshold

 晋升到老年代的对象年龄。每个对象在坚持过一次Minor GC 之后,年
龄就加1,当超过这个参数值时就进入老年代

 UseAdaptiveSizePolicy

 动态调整Java 堆中各个区域的大小以及进入老年代的年龄

 HandlePromotionFailure

 是否允许分配担保失败,即老年代的剩余空间不足以应付新生代的整个
Eden 和Survivor 区的所有对象都存活的极端情况

 ParallelGCThreads

 设置并行GC 时进行内存回收的线程数

 GCTimeRatio

 GC 时间占总时间的比率,默认值为99,即允许1% 的GC 时间。仅在
使用Parallel Scavenge 收集器时生效

 MaxGCPauseMillis

 设置GC 的最大停顿时间。仅在使用Parallel Scavenge 收集器时生效

 CMSInitiatingOccupancyFraction

 设置CMS 收集器在老年代空间被使用多少后触发垃圾收集。默认值为
68%,仅在使用CMS 收集器时生效

 UseCMSCompactAtFullCollection

 设置CMS 收集器在完成垃圾收集后是否要进行一次内存碎片整理。仅
在使用CMS 收集器时生效

 CMSFullGCsBeforeCompaction

 设置CMS 收集器在进行若干次垃圾收集后再启动一次内存碎片整理。
仅在使用CMS 收集器时生效

 

对象的内存分配主要发生在新生代的Eden上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数可以直接分配在老年代中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值