Java垃圾收集机制

分代的垃圾回收策略:

不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的回收算法,以便提高回收效率。

年轻代(Young Generation)

1.所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。

2.新生代内存按照8:1:1的比例分为一个eden区和两个survivor(survivor0,survivor1)区。一个Eden区,两个 Survivor区(一般而言)。大部分对象在Eden区中生成。回收时先将eden区存活对象复制到一个survivor0区,然后清空eden区,当这个survivor0区也存放满了时,则将eden区和survivor0区存活对象复制到另一个survivor1区,然后清空eden和这个survivor0区,此时survivor0区是空的,然后将survivor0区和survivor1区交换,即保持survivor1区为空, 如此往复。

3.当survivor1区不足以存放 eden和survivor0的存活对象时,就将存活对象直接存放到老年代。若是老年代也满了就会触发一次Full GC,也就是新生代、老年代都进行回收

4.新生代发生的GC也叫做Minor GC,MinorGC发生频率比较高(不一定等Eden区满了才触发)

年老代(Old Generation)

1.在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

2.内存比新生代也大很多(大概比例是1:2),当老年代内存满时触发Major GC即Full GC,Full GC发生频率比较低,老年代对象存活时间比较长,存活率标记高。

持久代(Permanent Generation)

用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。

Minor GC与Major GC

Minor GC:新生代,回收频率高;

Minor GC机制

当新对象生成,并且在Eden申请空间失败时,就会触发Minor GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。

major GC:老年代,回收频率低;

Major GC机制

对整个堆进行整理,包括Young、Tenured和Perm。Major GC因为需要对整个堆进行回收,所以比Minor GC要慢,因此应该尽可能减少Major GC的次数。在对JVM调优的过程中,很大一部分工作就是对于Major GC的调节。有如下原因可能导致Major GC:

1.年老代(Tenured)被写满

2.持久代(Perm)被写满

3.System.gc()被显示调用

4.上一次GC之后Heap的各域分配策略动态变化

内存分配与回收策略总结

对象优先在eden区分配:

在大多数情况之下,对象在新生代Eden区分配,当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC

大对象直接进入老年代:

大对象指的是需要大量连续内存的Java对象,比如很长的字符创或者数组;

大对象直接在老年代分配,是为了避免在Eden区及两个Survivor之间发生大量的内存拷贝;

长期存活对象进入老年代

动态对象年龄分配:

如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或者等于该年龄的对象可以直接进入老年代。

引用计数法:

给内存中的对象给打上标记,对象被引用一次,计数就加1,引用被释放了,计数就减一,当这个计数为0的时候,这个对象就可以被回收了。当然,这也就引发了一个问题:循环引用的对象是无法被识别出来并且被回收的。

根搜索算法:

从一个根出发,搜索所有的可达对象,这样剩下的那些对象就是需要被回收的。判断完了哪些对象是没用的,这样就可以进行回收了

强引用:

是指创建一个对象并把这个对象赋给一个引用变量。比如:

Object object =new Object();

String str ="hello";

 强引用有引用变量指向时永远不会被垃圾回收;

如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。比如Vector类的clear方法中就是通过将引用赋值为null来实现清理工作的。

软引用:

软引用用来描述一些还有用但不是必须的对象,软引用可用来实现内存敏感的高速缓存,比如网页缓存、图片缓存等。使用软引用能防止内存泄露,增强程序的健壮性。  JDK提供SoftReference类实现软引用, SoftReference的特点是它的一个实例保存对一个Java对象的软引用, 该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。

如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;

如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。

也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对 这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。另外,一旦垃圾线程回收该Java对象之 后,get()方法将返回null。

弱引用:

弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。

虚引用:

虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。无法通过虚引用获得一个对象实例。为对象设置虚引用的唯一目的是希望能在这个对象被收集器回收时收到一个系统通知。

Java有了GC同样会出现内存泄露问题

一、静态集合类像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector等应用着;

二、各种连接,数据库连接,网络连接,IO连接等没有显示调用close关闭,不被GC回收导致内存泄露;

三、监听器的使用,在释放对象的同时没有相应删除监听器的时候也可能导致内存泄露。

参考链接:

https://www.cnblogs.com/andy-zcx/p/5522836.html

https://blog.csdn.net/zcw4237256/article/details/79042490

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java垃圾回收机制Java语言的一项重要特性,它可以自动管理内存,减轻了程序员手动释放内存的负担。Java垃圾回收机制主要通过垃圾收集器(Garbage Collector)来实现。 在Java中,当一个对象不再被引用时,就可以被判定为垃圾垃圾收集器会定期扫描堆内存,找出不再被引用的对象,并将其回收释放内存间。这样,程序员就不需要手动释放对象所占用的内存,大大简化了内存管理的工作。 Java垃圾回收机制基于以下两个核心概念: 1. 引用计数法:每个对象都有一个引用计数器,当有新的引用指向该对象时,计数器加1;当引用失效时,计数器减1。当计数器为0时,表示该对象不再被引用,可以被回收。但是,引用计数法无法解决循环引用的问题,即两个或多个对象相互引用,但与程序的根节点没有直接引用关系,导致无法被回收。 2. 可达性分析算法:Java垃圾回收机制采用可达性分析算法来判断对象是否可被回收。该算法从程序的根节点(如静态变量、方法参数等)出发,通过引用链追踪对象的引用关系,如果一个对象不可达(即无法通过引用链与根节点相连),则被判定为垃圾,可以被回收。 Java垃圾回收机制具有以下优点: 1. 简化了内存管理,减少了内存泄漏和野指针等问题的发生。 2. 提高了程序的可靠性和稳定性,减少了因为内存管理错误导致的程序崩溃。 3. 提高了开发效率,程序员不需要手动释放内存,可以更专注于业务逻辑的实现。 然而,垃圾回收机制也存在一些缺点: 1. 垃圾回收过程会占用一定的系统资源,可能会导致程序的运行速度变慢。 2. 垃圾回收的时间是不确定的,可能会导致程序在某些时刻出现短暂的停顿。 相关问题: 1. Java垃圾回收机制是如何工作的? 2. 什么是引用计数法?它有什么缺点? 3. 什么是可达性分析算法?它如何判断对象是否可被回收? 4. 垃圾回收机制有哪些优点和缺点?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值