当前位置: 首页 > news >正文

JVM垃圾回收机制

e64ca871c2f84c20a7c816ec443d8ae7.jpg垃圾回收机制(GC)

 

内存管理

Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放。

对象空间的分配:使用new关键字创建对象即可

对象空间的释放:将对象赋值null即可。垃圾回收器将负责所有“不可达”对象的内存空间。

垃圾回收过程

任何一种垃圾回收算法一般都要做两件基本事情:

 

发现无用的对象。

回收无用对象占用的内存空间。

垃圾回收机制保证可以将"无用的对象"进行回收。无用的对象指的就是没有任何变量引用该对象。java的垃圾回收器通过相关算法发现无用对象,并进行清楚和整理。

 

详细过程

 

新创建的对象,绝大多数都会存储在Eden中。

当Eden区满了(达到一定的比例)不能创建新对象。则会触发垃圾回收(GC),将无用对象清理掉,然后将剩余对象复制到某个Survivor中,同时清理Eden区。

当Eden区再次满时,会将Survivor1中的不能清空的对象,存放的Survivor2中,同时将Eden区中的不能清空的对象,也复制到S1中,保证Eden和S1,均被清空。

重复多次(默认15次)Survivor中没有被清理的对象,则会复制到年老去Old(Tenured)区中。

当OLd区满了,则会触发一次完整的垃圾回收(FullGc),之前新生代的垃圾回收称为(minorGC)

垃圾回收相关算法

引用计算法

 

堆中每个对象都用一个引用计数。被引用一次,计数加1,直接到计数为0,则表示变成无用对象。优点是算法简单,缺点是“循环引用的无用对象”无法被识别。

 

public class Student{

    String name;

    Student friend;

    Public static void main (String [] args){

        Student s1 = new Student();

        Student s2 = new Student();

        s1.friend = s2;

        s2.friend = s1;

        s1 = null;

        s2 = null;

      

    }

s1和s2互相引用对方,导致他们引用计数不为0,但是实际已经无用,但无法被识别。

 

引用可达法(根搜索算法)

 

程序把所有的引用关系看作一张图,从一个节点GC ROOT开始。寻找对应的引用节点,找到这个节点以后。继续寻找这个节点的引用及诶单。当所有的引用节点寻找完毕之后,剩余的节点则被任务是没有被引用的节点,即无用的节点。

 

垃圾回收机制关键点

 

• 垃圾回收机制只回收JVM堆内存里的对象空间。

 

• 对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力

 

• 现在的JVM有多种垃圾回收实现算法,表现各异。

 

• 垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行。

 

• 可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象。

 

• 程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有

 

一些效果,但是系统是否进行垃圾回收依然不确定。

 

• 垃圾回收机制回收任何对象之前,总会先调用它的finalize方法(如果覆盖该方法,让一 个新的引用变量重新引用该对象,则会重新激活对象)。

 

• 永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。

http://www.lryc.cn/news/12829.html

相关文章:

  • Java File类、IO流、Properties属性类
  • MySQL备份恢复(十二)
  • 【Java|golang】1792. 最大平均通过率---封装最小堆
  • PHP 页面静态化
  • 【Python】进制、计算机中的单位、编码、数据类型、索引、字符串切片、字符串的功能方法
  • 基于android的无人健身房
  • 带你Java基础入门
  • VNCTF 2023 - Web 象棋王子|电子木鱼|BabyGo Writeups
  • 「JVM 编译优化」插入式注解处理器(自定义代码编译检查)
  • 一文彻底理解大小端和位域 BIGENDIAN LITTLEENDIAN
  • 面试准备知识点与总结——(虚拟机篇)
  • spring cloud 集成 seata 分布式事务
  • k8s篇之概念介绍
  • JavaScript学习第1天:浏览器组成、JS的组成、变量、数据类型转化、运算符、while和do...while循环
  • 【Flutter入门到进阶】Dart进阶篇---Dart多线程异步原理
  • WEB系列(二)-----------XSS
  • [python入门㊾] - python异常中的断言
  • 一文告诉你什么是财务数据治理?
  • MySQL数据库调优————ORDER BY语句
  • Linux命令之grep
  • 一起学 pixijs(4):如何绘制文字md
  • mac m1设备上安装Qt并使用qt编程遇到的问题以及解决方式
  • tensorflow 学习笔记(二):神经网络的优化过程
  • 【Java】《Java8 实战》 CompletableFuture 学习
  • Vue3之条件渲染
  • 将Nginx 核心知识点扒了个底朝天(四)
  • 设计模式之工厂模式
  • 80.链表-由来
  • 元胞自动机
  • 设计模式之各种设计模式总结与对比