垃圾回收(GC)

一、垃圾回收算法

1、可达性分析法

使用可达性分析法判断对象是否可以被回收

将对象分两类:

垃圾回收的根对象(GC Root)和普通对象,即

  • 线程Thread对象,引用线程栈帧中的方法参数、局部变量等。

  • 系统类加载器加载的java.lang.Class对象,引用类中的静态变量。

  • 监视器对象,用来保存同步锁synchronized关键字持有的对象。

  • 本地方法调用时使用的全局对象。

对象与对象之间的引用关系。

2、垃圾回收工作

找到内存中存活的对象,释放不在存活对象的内存,使得程序能再次利用这部分空间。

3、算法类别

标记 - 清除算法 ------ 复制算法 ------ 标记 - 整理算法 ------ 分代GC

4、STW

Java垃圾回收过程会通过单独的GC线程来完成,但是不管使用哪一种GC算法,都会有部分阶段需要停止所有的用户线程。这个过程被称之为Stop The World 简称STW,如果STW时间过长则会影响用户的使用。

5、G1(Garbage First)垃圾回收器

优点:

支持巨大的对空间回收,并且有较高的吞吐量 ②支持多CPU并行垃圾回收 ③允许用户设置最大暂停时间

区域划分

G1的整个堆会被划分成多个大小相等的区域,称之为区Region,区域不要求是连续的。分为Eden(伊甸园区)、Survivor(幸存者区)、Old(老年代)区。Region的大小通过堆空间大小/2048计算得到,也可以通过参数-XX:G1HeapRegionSize=32m指定(其中32m指定region大小为32M),Region size必须是2的指数幂,取值范围从1M到32M。

混合回收

混合回收分为:初始标记(initial mark)、并发标记(concurrent mark)、最终标记(remark或者Finalize Marking)、并发清理(cleanup)

G1对老年代的清理会选择存活度最低的区域来进行回收,这样可以保证回收效率最高。

注意:如果清理过程中发现没有足够的空Region存放转移的对象,会出现Full GC。单线程执行标记-整理算法,此时会导致用户线程的暂停。所以尽量保证应该用的堆内存有一定多余的空间。

设置参数

参数1: -XX:+UseG1GC 打开G1的开关,JDK9之后默认不需要打开

参数2:-XX:MaxGCPauseMillis=毫秒值 最大暂停的时

相关推荐
青 春 记 忆2 小时前
LeetCode 21. 合并两个有序链表|Python 解法详解
python·算法·leetcode·链表
Sagittarius_A*5 小时前
后量子密码|通识认知 03|量子威胁辟谣:Grover 算法对对称密码的影响与误区
算法·信息安全·密码学·量子计算·pqc·后量子密码
Patrick在香港5 小时前
Python Docker镜像从1.2GB到89MB:多阶段构建的完整优化实录
java·python·docker·信息可视化·容器·数据分析·ai编程
上海安当技术5 小时前
敏感数据怎么防拖库?信封加密(DEK+KEK 二层密钥)架构设计与 Java 实战
java·开发语言·python
我是唐青枫5 小时前
Java JCommander 实战详解:用注解解析命令行参数
java·开发语言
大鹏说大话5 小时前
C++ 内存布局详解:类、虚函数、虚表底层原理
java·开发语言
还是鼠鼠6 小时前
Spring AI连接DeepSeek与通义千问:application.yaml配置详解
java·通义千问·spring ai·deepseek
QAQo7T6 小时前
Python组蓝桥杯备赛超详细知识点总结笔记_排序算法篇
笔记·python·算法·蓝桥杯·排序算法
千里之行,始于足下sanhai6 小时前
P8686 [蓝桥杯 2019 省 A] 修改数组 - 数字魔法大冒险 题解
c++·算法·动态规划
小星星闪亮登场6 小时前
Codeforces Round 1115 ( Div. 2)
数据结构·c++·算法·贪心算法·排序算法·codeforces