垃圾回收基础了解(一)

  1. 垃圾回收的区域

运行时区域:程序计数器、虚拟机栈、本地方法栈生命周期随着线程的创建而创建,随着线程的结束而死亡堆区(线程共享)、方法区(线程共享)。

        其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生、随线程而灭,Java堆区和方法区则不一样,这部分内存的分配和回收是动态的,正是垃圾收集器所需关注的部分,JDK1.8方法区改为元空间。

程序计数器:字节码解释器读取程序计数器来知道程序下一条需要执行的字节码指令,实现代码的流程控制(顺序执行、选择、循环、异常处理等);在多线程下记录当前线程执行的位置,当线程切换时知道上次运行位置。

虚拟机栈(栈):为虚拟机执行Java方法服务线程私有,生命周期与线程相同,存储局部变量表(基本数据类型/对象引用)、操作数栈、动态链接、方法出口(方法返回地址)等信息。

本地方法栈:为虚拟机使用到底native(Java调用非Java代码的接口)方法服务;

:存储对象实例,几乎所有的对象实例以及数组都在这里分配内存一般基本采用分带收集算法回收;

方法区:存储类信息、常量、静态变量、即时编译器编译后的代码等数据;

2、判断对象存活的算法

     引用计数法(无法检测出循环引用。如父对象有一个对子对象的引用,子对象反过来引用父对象。这样,他们的引用计数永远不可能为0):

              堆中每个对象实例都有一个引用计数,当对象被创建时,就将该对象实例分配给一个变量,该变量计数设置为1。当任何其他变量被赋值为这个对象的引用时,计数+1(a=b,将变量b的值赋值给a时,a计数器+1),当一个对象实例的某个引用超过类声明周期或者设置为一个新值时,计数器-1。计数器为0的对象实例可以被当做垃圾收集。当一个对象实例被垃圾收集时,它引用的任何对象实例的引用计数器减1。


     可达性分析算法:

            可达性分析算法是从离散数学中的图论引入的,程序把所有的引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点,无用的节点将会被判定为是可回收的对象。

3、Java中的引用

  • 强引用

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

  • 软引用

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

  • 弱引用

  也是用来描述非必需对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。

  • 虚引用

  也叫幽灵引用或幻影引用(名字真会取,很魔幻的样子),是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。它的作用是能在这个对象被收集器回收时收到一个系统通知。

引用计数算法还是可达性分析算法都是基于强引用而言的。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值