JVM(二):垃圾回收
三个问题:
那些内存需要回收? -- 对象是否存活判断
什么时候回收? --垃圾回收触发条件
如何回收? --垃圾回收算法
垃圾回收应用 -- 理解GC日志、使用垃圾回收命令和工具
1. 判断对象是否存活
- 引用计数法
- 可达性分析算法
引用计数法:给对象增添一个计数器,每当被引用一次,计数器数值+1;引用失效则-1;当计数器为0时,该对象不再被使用。
优点:实现简单,判定效率高。
缺点:不能解决对象之间相互循环引用问题。
VM参数配置 -Xms100m -Xmx100m -XX:+PrintGCDetails(打印GC日志)
public class LeetCode {
public Object instance = null;
public static void main(String[] args){
testGC(); } public static void testGC(){
LeetCode leetCode1 = new LeetCode();
LeetCode leetCode2 = new LeetCode(); leetCode1.instance = leetCode2;
leetCode2.instance = leetCode1; leetCode1 = null;
leetCode2 = null; System.gc(); } }
GC日志:
这两个互相引用的对象被回收了,说明采用的不是引用计数法
可达性分析算法:
GCRoots:
- 虚拟机栈中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中JNI(即一般说的Native方法)引用的对象
判断对象的引用链是否能够到达GC Roots,能到达则为存活,不能则是已经死亡
2. 回收步骤、
2.1 是否可达
2.2 标记,然后筛选 是否有必要执行finalize()方法
2.3 有必要的话,放置到F-Queue队列,由虚拟机自动建立一个低优先级的Finalizer线程去执行每个对象的finalize();
2.4 GC回对F-queue的对象进行二次标记,finalize是对象逃脱死亡的最后一次机会。
3.回收算法
3.1 标记-清除算法
3.2 复制算法-被商业虚拟机广泛采用收集新生代的算法
将内存分为两块,每次只用其中一块,当这块内存用完了,将仍然存活的对象复制到另外一块上面,然后把已使用的内存空间一次清理。
实现简单,运行高效,但是会浪费一部分内存空间
记住一个比例 8:1:1 Eden:From Survivor: To Survivor
3.3 标记整理算法
3.4 分代收集算法 (新生代:复制算法 老年代:标记-清理算法)
并没有创新的算法,而是在合适的区域采用合适的回收算法。
JVM(二):垃圾回收的更多相关文章
- JVM总括二-垃圾回收:GC Roots、回收算法、回收器
JVM总括二-垃圾回收:GC Roots.回收算法.回收器 目录:JVM总括:目录 一.判断对象是否存活 为了判断对象是否存活引入GC Roots,如果一个对象与GC Roots没有直接或间接的引用关 ...
- jvm的垃圾回收算法
一.对象存活判断判断对象是否存活一般有两种方式:1.引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.此方法简单,无法解决对象相互循环引用的问题.2 ...
- JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)
相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技术 ...
- 扒一扒JVM的垃圾回收机制,下次面试你准备好了吗
相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技 ...
- JVM的垃圾回收机制
JVM的垃圾回收机制:(GC通过确定对象是否被活动对象引用来确定是否收集该对象.) 1.触发GC(Garbage Collector)的条件. (1.GC在优先级最低的线程中运行,在未运行的线程中进行 ...
- 2.1.JVM的垃圾回收机制,判断对象是否死亡
因为热爱,所以坚持. 文章下方有本文参考电子书和视频的下载地址哦~ 这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么.然后触发条件是什么.最后虚拟机如何判断对象是否死亡. 一.前言 我们 ...
- JVM中垃圾回收机制如何判断是否死亡?详解引用计数法和可达性分析 !
因为热爱,所以坚持. 文章下方有本文参考电子书和视频的下载地址哦~ 这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么.然后触发条件是什么.最后虚拟机如何判断对象是否死亡. 一.前言 我们 ...
- JVM虚拟机垃圾回收(GC)算法及优缺点
一.什么是GC GC是jvm的垃圾回收,垃圾回收的规律和原则为: 次数上频繁收集新生区(Young) 次数上较少收集养老区(Old) 基本上不动永久区(Perm) 二.GC算法(分代收 ...
- JVM学习——垃圾回收GC(学习过程)
JVM学习-垃圾回收(GC) 2020年02月19日06:03:56,开始学习垃圾回收,学习资料来源(张龙老师的JVM课程) JVM内存数据区域知识复习 学习垃圾回收之前,要对JVM内部的内存区域有详 ...
- JVM的垃圾回收机制详解和调优
JVM的垃圾回收机制详解和调优 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都 ...
随机推荐
- 第四篇 express 安装esasticsearch
1.首先,我们创建一个Express应用程序!我将使用express.js生成器. npm install -g express-generator express ./autocompleter c ...
- p2345 奶牛集会
传送门 题目 约翰的N 头奶牛每年都会参加“哞哞大会”.哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨栅栏,摸牛仔的屁股等等.它们参加活动时会聚在一起,第i 头奶牛的坐标为Xi,没有两头奶 ...
- Java基础之cmd入门操作笔记
前提:jdk已安装且环境变量配置成功,参考上文jdk 安装及环境变量配置 入门操作步骤: 1.打开记事本或者notepad,编写Abc代码,具体如下: public class Abc{ pub ...
- StringBuffer输出
public class Test { public static void main(String[] args) { StringBuffer a = new StringBuffer(" ...
- Note: Improving Restore Speed for Backup Systems that Use Inline Chunk-Based Deduplication
思路/方法 Measuring restore speed 提出了speed-factor,用以衡量存储速度. Container capping 限制恢复文件时使用的container个数,为了保证 ...
- FreeSql 新功能介绍:贪婪加载五种方法
前言 FreeSql 在经过6个月的开发和朋友们的工作实践,不断的改进创新,目前拥有1500个左右单元测试方法,且每个方法内又复盖不同的测试面. 今天介绍 FreeSql 各种贪婪加载的姿势,作下总结 ...
- Unix Tutorial Eight
1.UNIX 变量 变量是在运行时将信息从shell传递到程序的一种方式.程序在特定的变量中查找“在环境中”,如果发现它们将使用存储的值.有些是由系统设置的,另一些是由你设置的,还有一些是由shell ...
- 求组合数 C(n,m)
下面内容转自: http://blog.csdn.net/zengaming/article/details/63681754 一.求解C(n, m) 公式一: 公式二: 公式二可以这么理解,从n个物 ...
- 洛谷P3380 【模板】二逼平衡树(树套树)(线段树+树状数组)
P3380 [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数 ...
- 洛谷P2474 [SCOI2008]天平
P2474 [SCOI2008]天平 题目背景 2008四川NOI省选 题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A ...