当前位置:网站首页>JVM GC垃圾回收简述
JVM GC垃圾回收简述
2022-07-07 17:52:00 【whiteye太白】
GC
针对java堆的回收。
可达性分析算法:从gc root搜索引用链。
Eden区满时触发minor gc,存活的对象进入survivor区(复制算法),年龄加1,当对象年龄大于阈值(默认15)时,进入老年代。可以通过参数设置阈值,虚拟机运行过程中会进行动态调整。当某个年龄大小超过survivor区一半(默认50%)时,取这个年龄和MaxTenuringThreshold中最小的作为新的阈值。
新生代(标记-复制算法)
- 标记存活对象-因为存活对象较少
- 内存大小eden:to:from = 8 : 1 : 1
- minor gc后,Eden区存活的对象被复制到“survivor To”;“survivor From”区中存活的对象,年龄达到阈值就进入年老代,否则被复制到“survivor To”中。survivor From 和survivor To互换。
- survivor From空间不够用,则放不下的部分会提前进入老年代。
老年代(标记-清除-整理算法)
老年代内存不够时进行full gc(标记-清除),多次full gc后进行整理。次数参数CMSFullGCsBeforeCompaction默认为0次。
强引用:gc不回收。
软引用:内存不足时才回收。
弱引用:gc回收。
虚引用:用于回收前,得到系统通知,可以在回收前进行一些处理。
java内存模型
- 程序计数器:控制程序执行。
- Java虚拟机栈:存储局部变量表、操作数栈、动态连接、方法出口等。
- 本地方法栈:存储本地(native)方法信息。
- Java堆:存储对象实例。
- 方法区:存储静态数据(常量、静态变量等)。包含运行时常量池:存储常量。
Java堆回收算法
- 引用计数法(多数虚拟机不用)
- 可达性分析算法
根据“根对象”搜索其“引用链”判断某对象是否可达,对不可达对象进行筛选,若该对象存在finalize()方法,并且finalize()方法没被执行过,则将该对象放置于队列中,由Finalizer线程执行其finalize()方法来释放该对象。如果队列中的对象在执行finalize()释放前被重新引用,就会移出释放队列。JDK9后被移除。
回收对象判断
- 回收不存在引用的字符串常量(字符串常量池在堆中,运行时常量池在方法区)
- 不在被使用的类,仅仅是“被允许回收”
同时满足:
该类所有实例都被回收;
该类的类加载器已被回收;
该类的Class对象不存在被引用,无法进行发射访问。
GC触发条件
Minor GC触发条件:Eden区满时。
Full GC触发条件:
- 调用System.gc时,系统建议执行Full GC,但是不必然执行。
- 老年代空间不足。
- 方法区空间不足。
- 通过Minor GC后进入老年代的平均大小大于老年代的可用内存。
- 由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小。
【补充】 JDK 7 之前,HotSpot 使用永久代来实现方法区的时候,实现是完全符合这种逻辑概念的。 而在 JDK 7 及之后,HotSpot 已经把原本放在永久代的字符串常量池、静态变量等移动到堆中,这个时候类变量则会随着 Class 对象一起存放在 Java 堆中。
边栏推荐
- R language dplyr package select function, group_ The by function, filter function and do function obtain the third largest value of a specific numerical data column in a specified level in a specified
- 索引总结(突击版本)
- Notes...
- Navicat连接2002 - Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘解决
- RESTAPI 版本控制策略【eolink 翻译】
- IP 工具类
- 8 CAS
- 【剑指offer】剑指 Offer II 012. 左右两边子数组的和相等
- ant desgin 多选
- LeetCode 648(C#)
猜你喜欢
多个线程之间如何协同
8 CAS
Ways to improve the utilization of openeuler resources 01: Introduction
LeetCode力扣(剑指offer 36-39)36. 二叉搜索树与双向链表37. 序列化二叉树38. 字符串的排列39. 数组中出现次数超过一半的数字
2022.07.04
Flink并行度和Slot详解
openEuler 资源利用率提升之道 01:概论
华南X99平台打鸡血教程
Le PGR est - il utile au travail? Comment choisir une plate - forme fiable pour économiser le cœur et la main - d'œuvre lors de la préparation de l'examen!!!
Experiment 1 of Compilation Principle: automatic implementation of lexical analyzer (Lex lexical analysis)
随机推荐
Kunpeng developer summit 2022 | Kirin Xin'an and Kunpeng jointly build a new ecosystem of computing industry
2022.07.02
The strength index of specialized and new software development enterprises was released, and Kirin Xin'an was honored on the list
R语言ggplot2可视化:使用ggpubr包的ggviolin函数可视化小提琴图、设置palette参数自定义不同水平小提琴图的填充色、add参数在小提琴图添加箱图
吞吐量Throughout
LC:字符串转换整数 (atoi) + 外观数列 + 最长公共前缀
AD域组策略管理
Ucloud is a basic cloud computing service provider
IP 工具类
Navicat连接2002 - Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘解决
R language ggplot2 visualization: use the ggstripchart function of ggpubr package to visualize the dot strip plot, set the position parameter, and configure the separation degree of different grouped
Sword finger offer II 013 Sum of two-dimensional submatrix
Make insurance more "safe"! Kirin Xin'an one cloud multi-core cloud desktop won the bid of China Life Insurance, helping the innovation and development of financial and insurance information technolog
Nunjuks template engine
R语言ggplot2可视化:使用ggpubr包的ggqqplot函数可视化QQ图(Quantile-Quantile plot)
ant desgin 多选
R语言ggplot2可视化:使用ggpubr包的ggecdf函数可视化分组经验累积密度分布函数曲线、linetype参数指定不同分组曲线的线型
R语言ggplot2可视化:使用ggpubr包的ggdensity函数可视化分组密度图、使用stat_overlay_normal_density函数为每个分组的密度图叠加正太分布曲线
R语言使用ggplot2函数可视化需要构建泊松回归模型的计数目标变量的直方图分布并分析构建泊松回归模型的可行性
R language uses ggplot2 function to visualize the histogram distribution of counting target variables that need to build Poisson regression model, and analyzes the feasibility of building Poisson regr