JVM垃圾回收Garbage Collection

GC机制的好处:
1.提升安全性
2.减少内存泄漏
3.减少程序员工作量
参考博文:
https://www.cnblogs.com/whgk/p/6138522.html
https://www.cnblogs.com/xiarongjin/p/8309839.html
http://www.importnew.com/16173.html
一.要回收的对象所在
1.JVM运行时数据区如下,要回收的是无用的对象,对象存在于下图的堆中
在这里插入图片描述
堆中分为新生代,老年代,永久带,如下图
在这里插入图片描述

1.新生代
主要是用来存放新生的对象。一般占据堆的1/3空间。由于频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾
回收。Edem : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 )
2.老年代
主要存放应用程序中生命周期长的内存对象。占据堆的2/3空间老年代的对象比较稳定,所以MajorGC不会频繁执行。在进行MajorGC前一般都先进行了一次MinorGC,使得有新生代的对象晋身入老年代,导致空间不够用时才触发。当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次MajorGC进行垃圾回收腾出空间。 当老年代也满了装不下的时候,就会抛出OOM(Out of Memory)异常。
3.永久代
在Java8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代。元空间并不在虚拟机中,而是使用本地内存。
二.发现无用的对象:
1.根搜索算法:(可达性分析)
通过一些GC Roots对象作为起点,从这些结点往下搜索,搜索通过的路径成为引用链,当一个对象在引用链外的时候,说明这个对象是无用的。
2.GC Roots对象有:
虚拟机栈的引用对象
方法区中的类静态属性引用对象
方法区中常量的引用对象
本地方法栈中的引用对象
3.判断对象的存活通过对象的引用,对象的引用又有多种
强引用:Object o = new Object() ;不会被gc回收
软引用:Object o = null ; 如果内存够,就不回被gc回收
弱引用:比软引用要弱,下次GC就会被回收
虚引用:对象的虚引用不产生影响
关于对象的这四个引用,我也不是很懂

三.垃圾回收算法
1.标记-清除算法:先标记无用的对象再清除。
会导致清楚后产生大量的不连续内存空间,不利于程序分配大内存对象
2.复制算法:将内存分成两块A和B,一次只用一块,假如用A。在清除的时候,把A中的存活对象复制到B上,然后把A整个清理掉。
会导致内存的利用率不高
3.标记-整理算法:先标记,然后把存活的对象往内存的一端移动。然后清理存活边界外的内存。
提高了利用率,适用于收集老年代。
4.分代收集:新生代用复制算法,老年代用标记-整理算法

四.一些指令
在这里插入图片描述
五.有了GC机制还会出现内存泄露吗?

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

Static Vector v = new Vector(); 
for (int i = 1; i<100; i++) 
{ 
    Object o = new Object(); 
    v.add(o); 
    o = null; 
}

在这个例子中,代码栈中存在Vector 对象的引用 v 和 Object 对象的引用 o 。在 For 循环中,我们不断的生成新的对象,然后将其添加到 Vector 对象中,之后将 o 引用置空。问题是当 o 引用被置空后,如果发生 GC,我们创建的 Object 对象是否能够被 GC 回收呢?答案是否定的。因为, GC 在跟踪代码栈中的引用时,会发现 v 引用,而继续往下跟踪,就会发现 v 引用指向的内存空间中又存在指向 Object 对象的引用。也就是说尽管o 引用已经被置空,但是 Object 对象仍然存在其他的引用,是可以被访问到的,所以 GC 无法将其释放掉。如果在此循环之后, Object 对象对程序已经没有任何作用,那么我们就认为此 Java 程序发生了内存泄漏。

2.各种连接,数据库连接,网络连接,IO连接等没有显式调用close关闭,不被GC回收导致内存泄露。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值