GC机制和算法

1. 概述

Java GC 垃圾回收机制,Java 和 C++的主要区别之一

出现问题: 内存泄漏,内存溢出(OutofMemory)

为何要使用: 为了写出高性能的应用程序

 

2. jvm内存管理

基本知识详见

2.1 方法区

存放类信息(类名,修饰符),类中静态变量,final常量,类属性和方法

方法区是全局共享的,在一定条件下它也会被GC。当方法区使用的内存超过它允许的大小时,就会抛出OutOfMemory:PermGen Space异常。

GC条件苛刻,这块区域被称为持久代,主要针对常量池和已加载的类的卸载

运行时常量池,存储编译器生成的常量和引用

2.2 堆区

存放对象实例和数组, new出来的对象都存放在此

是GC机制最重要的区域

进行分代管理

 新生代(Youn Generation):大致分为Eden区和Survivor区,Survivor区又分为大小相同的两部分:FromSpace和ToSpace。新建的对象都是从新生代分配内存(大对象会直接在老年代分配),Eden区不足的时候,会把存活的对象转移到Survivor区。当新生代进行垃圾回收时会出发Minor GC(复制算法也称作Youn GC)。在执行垃圾回收之后,仍没有足够的内存分配,也不能再扩展,将会抛出OutOfMemoryError:Java Heap Space异常。

       老年代(Old Generation):旧生代用于存放新生代多次回收依然存活的对象,如缓存对象。当旧生代满了的时候就需要对旧生代进行回收,旧生代的垃圾回收称作Major GC(标记-压缩算法也称作Full GC)。

       持久代(Permanent Generation):在Sun 的JVM中就是方法区的意思,尽管大多数JVM没有这一代。

以下三个是线程同步,生命周期随着线程销毁而销毁,不需要回收

2.3 本地方法栈

2.4 虚拟机栈

2.5 程序计数器

3. 算法

两种查找算法

3.1. 引用计数法

对象被引用+1,失去引用-1 ,为0时就可以回收,但是相互引用的对象不能处理

3.2. 根搜索算法

从GC Roots的根节点出发,向下搜索,如果一个对象不能达到GC Roots的时候,说明该对象不再被引用,可以被回收,就解决了引用计数算法的缺陷。

3.3 强引用、软引用、弱引用、虚引用。

       强引用:new出来的对象都是强引用,GC无论如何都不会回收,即使抛出OOM异常。

       软引用:只有当JVM内存不足时才会被回收。

       弱引用:只要GC,就会立马回收,不管内存是否充足。

       虚引用:可以忽略不计,JVM完全不会在乎虚引用,唯一的作用就是做一些跟踪记录,辅助finalize函数的使用。

GC算法

3.3 复制

从根集合进行扫描,将存活的对象移动到另一块空闲的区域,存活较少时算法效率高,但是成本时一块的空闲区域和对象移动

3.4 标记-清除

从根集合开始扫描,存活的进行标记,再扫描整个空间,未被标记的清除,扫描耗时

3.5 标记-压缩

与标记清除类似,再加上整理碎片,进行移动。

4. 垃圾收集器

4.1 串行收集器

4.2 并行收集器

4.3 CMS收集器

4.4 G1收集器

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值