浅谈JVM垃圾回收有哪些常用算法
作者:亭中独酌 发布时间:2022-02-28 16:51:56
一、前言:
垃圾回收:
在未来的JDK中可能G1会为ZGC所取代
先问自己几个问题:
什么是垃圾?
垃圾就是堆内存中(范指)没有任何指针指向的对象实体。不具有可达性。
为什么要回收垃圾?
因为我们的内存是有限的,内存长时间不清理就会导致内存溢出,OOM;
只要是程序正在跑,那么就不断生成新的对象,我们需要GC开辟新的空间分配给新的对象。
我们怎么回收垃圾?
依靠Java的自动内存回收机制,机制的优劣由算法决定;
或者说是机制的适配度由算法和应用场景共同决定。
什么时候回收垃圾?
当堆中的实体对象没有任何指针指向的时候
二、GC的标记阶段算法:
标记&清除
1、引用计数(Reference Counting):
Java已经摈弃了这种算法,因为此算法需要的额外处理过多
【优】效率高,python也在用,就像论文的引用因子一样,没有用的文章就应该多多回收,清理学术垃圾。
【缺】无法处理对象的相互“循环引用”,一旦形成了引用环,就没有办法去解决。进而造成内存泄漏。
2、可达性分析⭐(根搜索、Tracing Garage Collection):
GC Roots = 起始节点集,从GC Roots开始向下搜索,连接的路径为引用链,GC Roots不可达的对象被判为不可用。
哪些是GC Roots?
虚拟栈上的栈帧的局部变量表引用的对象;
方法区上常量引用
方法区上静态变量
被同步锁修饰的对象
除了堆区,和堆有联系的都是起始节点……
【优】解决了循环引用的缺点
【缺】需要遍历
三、垃圾收集算法:
标记清除算法
复制算法
标记清除整理算法
标记-清除算法:
先mark可达对象,从根节点开始进行线性遍历。
【优】够平均
【缺】效率不高,GC的时候导致STW,清楚后存在内存碎片(会存在一个空闲列表)
这是最快的清除算法
复制算法
先把空间分为两个部分,把标记的对象规整地移到另一个空间中(指针碰撞的方式)
【优】高效,无需mark/sweep;没有内存碎片;
【缺】牺牲了大量的空间,”最好你们全部是垃圾!“
标记-清除-整理算法
在标记之后清除完了再进行整理,属于标记清除算法的优化版,无空闲列表
【优】无空闲列表,无内存碎片;空间开销低
【缺】时间慢,需要进行多次操作。
四、finalize&内存分析工具
finalization——免死金牌
finalize是给GC调用的
【问】回收的时候会涉及到哪些操作?会伴随着什么状态?
可触及:正常状态,在GC Roots的引用链上;
可复活:需要重写finalize方法才有的,“皇帝赐给你的重写finalize方法”
不可触及:finalize免死金牌只能用一次,如果没有重写的finalize方法,那么就直接挂了。
MAT & GC Roots:
Memory Analyzer Tools 内存分析工具
分析dump文件:根据GC Roots去溯源,监控内存泄漏→ JProfiler
分区算法
将堆空间分成小空间是为了降低停顿时间,降低延迟
实际的使用都是复合算法。
String
final是写死的,不能继承也不能做任何修改;
Serializable修饰是跨进程
Comparable可比较的
来源:https://blog.csdn.net/weixin_43801418/article/details/117932532


猜你喜欢
- 1,MainActivity的xml布局<?xml version="1.0" encoding="ut
- where 子句用于指定类型约束,这些约束可以作为泛型声明中定义的类型参数的变量。1.接口约束。例如,可以声明一个泛型类 MyGeneric
- 前言Spring 事务注解 @Transactional 本来可以保证原子性,如果事务内有报错的话,整个事务可以保证回滚,但是加上try c
- 释一:属性的访问器包含与获取(读取或计算)或设置(写)属性有关的可执行语句。访问器声明可以包含 get 访问器或 set 访问器,或者两者均
- 本文实例讲述了C#简单聊天程序实现方法。分享给大家供大家参考。具体如下:假如有服务器端程序,ChatServer和客户端程序ChatClie
- 把C#编译成DLL或者Axtive控件,再由C调用!比如使用C++调用C#的DLL。SwfDotNet是.net下输出flash的类库。Sw
- 前言在我们公司里,不同的服务之间通过Feign进行远程调用,但是,我们在尝试使调用可重试时遇到了一个小问题,Feign框架本身可以配置的自己
- 机器跑了一晚上,发现有崩溃现象,由于页面内有动态绘图功能,我怀疑是绘图原因,但是今天上午有人提醒我才想到,是不是间隔调用时DWR产生了内存泄
- 汉诺塔游戏一旦掌握了规律,其实是有点单调和无聊的,不过却是学习递归的一个绝佳例子,想当初学习老谭C的时候,就卡在这儿好长时间。对初学编程的人
- 一、分步骤集成1.1 整合连接池hikariCP介绍:HikariCP 是一个高性能的 JDBC 连接池组件,可以避免连接频繁建立、关闭的开
- 大家在登录网站的时候,大部分时候是通过一个表单提交登录信息。但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用HTTP基本认证。
- 一、语音聊天说专业点就是即时语音,是一种基于网络的快速传递语音信息的技术,普遍应用于各类社交软件中,优势主要有以下几点:(1)时效性:视频直
- 方法1:C#Label1.Text = Request.Form["txtName"].ToString();vb.ne
- 基本结构我们先来看一段最基本的代码,分析这段代码在RxJava中是如何实现的。Observable.OnSubscribe<Strin
- 1.前提已经配置Sleuth,可参考2.什么是Zipkin?官网:https://zipkin.io/大规模分布式系统的APM工具( App
- 网上搜集了java的学习思维导图,分享给大家。01.Java程序设计(基础)02.Java程序设计(专题)03.客户端网页编程04.Java
- 本文实例为大家分享了Android读写文件工具类的具体代码,供大家参考,具体内容如下public class Utils { p
- 1.简介这是一个用于实现像微信朋友圈和微博的类似的九宫格图片展示控件,通过自定义viewgroup实现,使用方便。 多图根据屏幕适配,单张图
- 接口:红色;实现类:黑色字体一、 Collection集合 Collection |_____Set(HashSet)&
- 之前我们借助一个SuperSocket实现了一个简易版的服务器, 但是不管是Server还是Session都是使用框架的,本篇博客我们要实现