后端开发技能学习(五)java垃圾回收机制

本文详细介绍了Java的垃圾回收机制,包括垃圾的定义、引用计数法和可达性分析算法。接着探讨了Java内存区域,如虚拟机栈、堆区、方法区等,并讲解了对象的访问方式和内存分配机制。文章还提到了新生代和老年代的GC处理机制,以及不同类型的GC策略。
摘要由CSDN通过智能技术生成

后端开发技能学习(五)java垃圾回收机制

垃圾的定义

本章介绍怎样判别一个对象是否是垃圾。

引用计数法

引用计数法通过在对象头中分配一个空间来保存该对象被引用的次数。
若该对象被其它对象引用,则引用计数+1;
若删除该对象的引用,则引用计数-1;
当引用计数为0时,就会回收该对象。
缺点:当有两个对象相互引用时将导致引用计数永不为0。

可达性分析算法

可达性分析算法的基本思路是,通过一些被称为GC Roots的对象作为起点进行搜索,当一个对象无法到达GC Roots时,则证明该对象不可用。如图所示:
在这里插入图片描述可达性方法解决了上述的"互相依赖"问题,但同时引申除了另一个问题,哪些属于GC Roots?

垃圾的清理

java内存区域

在java中,以下对象可作为GC Roots:

  1. 虚拟机栈中引用的对象
  2. 方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中JNI引用的对象

这里顺便了解一下jvm中内存区域的划分
在这里插入图片描述如上图所示,java运行时内存被划分为5部分,其中:
1.程序计数器(program counter register):程序计数器是一个较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,可以理解为是当前线程的行号指示器。字节码解释器在工作时,会通过改变这个计数器的值来取下一条语句指令。每个程序计数器用来记录一个线程的行号,所以是线程私有。
2.虚拟机栈(jvm stack):一个线程的每个方法在执行的同时都会创建一个栈帧,存储局部变量表、操作站、动态链接、方法出口等,当方法被调用时,栈帧入栈,执行完成时出栈。
当内存不足时,会抛出OutOfMemoryError异常。且虚拟机栈也是线程私有的。
3.本地方法栈:虚拟机栈用于执行java方法,而本地方法栈用来执行native方法。也是线程私有。
4.堆区(heap):堆区时最大的一块,也是java gc机制所管理的主要内存区域。堆区由所有线程共享,在虚拟机启动时创建,用于存储对象实例。当执行垃圾回收之后,仍没有足够的内存分配,也不能扩展,将会抛出OutOfMemoryError:Java heap space异常。
5.方法区(method area):方法区是各个线程共享的区域,用于存储已经被虚拟机加载的类信息、final常量、静态变量、编译器即时编译的代码等。一般的,方法区上执行的垃圾收集是很少的,这也是方法区被称为永久代的原因之一(HotSpot),但这也不代表着在方法区上完全没有垃圾收集,其上的垃圾收集主要是针对常量池的内存回收和对已加载类的卸载。在方法区上定义了OutOfMemoryError:PermGen space异常,在内存不足时抛出。
6.直接内存(direct memory):直接内存不是jvm管理的内存,而是jvm以外的机器内存,JDK中有一种基于通道(Channel)和缓冲区(Buffer)的内存分配方式,将由C语言实现的native函数库分配在直接内存中,用存储在JVM堆中的DirectByteBuffer来引用。由于直接内存收到本机器内存的限制,所以也可能出现OutOfMemoryError的异常。

java对象的访问方式

待更新。。。

java内存分配机制

在Java中,开发人员无法直接在程序代码中清理内存,而是由垃圾回收器自动寻找不必要的垃圾对象,并且清理掉他们。垃圾回收器会在下面两种假设(hypotheses)成立的情况下被创建(称之为假设不如改为推测(suppositions)或者前提(preconditions))。

大多数对象会很快变得不可达
只有很少的由老对象(创建时间较长的对象)指向新生对象的引用

这些假设我们称之为弱年代假设( weak generational hypothesis)。为了强化这一假设,HotSpot虚拟机将其物理上划分为两个–新生代(young generation)和老年代(old generation)。
  新生代(Young generation): 绝大多数最新被创建的对象会被分配到这里,由于大部分对象在创建后会很快变得不可到达,所以很多对象被创建在新生代,然后消失。对象从这个区域消失的过程我们称之为”minor GC“。

老年代(Old generation): 对象没有变得不可达,并且从新生代中存活下来,会被拷贝到这里。其所占用的空间要比新生代多。也正由于其相对较大的空间,发生在老年代上的GC要比新生代少得多。对象从老年代中消失的过程,我们称之为”major GC“(或者”full GC“)
在这里插入图片描述

新生代的gc处理机制

1.绝大多数刚刚被创建的对象会存放在伊甸园空间。
2.在伊甸园空间执行了第一次GC之后,存活的对象被移动到其中一个幸存者空间。
3.此后,在伊甸园空间执行GC之后,存活的对象会被堆积在同一个幸存者空间。
4.当一个幸存者空间饱和,还在存活的对象会被移动到另一个幸存者空间。之后会清空已经饱和的那个幸存者空间。
在以上的步骤中重复几次依然存活的对象,就会被移动到老年代。

老年代gc处理机制

老年代的gc处理机制较为复杂,基本上是在空间已满时发生,而且有不同的gc类型

jdk7一共有5种GC类型:
1.Serial GC
2.Parallel GC
3.Parallel Old GC
4.Concurrent Mark & Sweep GC (CMS)
5.Garbage first GC (G1 GC)

详情待更新。。。

referece:https://zhuanlan.zhihu.com/p/73628158

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值