JVM垃圾回收机制二
对象的回收
垃圾的回收涉及的几个问题:何时回收,由谁回收,怎样回收。这几个问题我们一一来解决。
1、何时回收----对象的生死判定
对象达到什么条件才能判断这个对象已经无用了。常见的判断对象生死的方法有两种:
(1)引用计数法
给每个对象添加一个引用计数器,只要有地方引用到这个对象,这个对象的计数器就会加1,当引用失效时,计数器就相应的减1。
引用计数法的问题:当两个对象互相引用,并且其他任何地方都没有引用这两个对象,那么根据引用计数法判定就永远无法回收这两个对象。
(2)可达性分析
通过一系列的成为GC Roots的对象作为起点,然后向下搜索,搜索的路径成为引用链,当一个对象到GC Roots没有任何引用链时,那么就说明次对象不可达。
GCRoots对象包括:
方法区:类静态属性引用的对象
方法区:常量引用的对象
虚拟机栈:局部变量表中存储的对象引用引用的对象
本地方法栈:JNI方法引用的对象
关于可达性分析和GC Roots有很多可说的,详细请点-------------------------------
2、怎样回收----垃圾回收算法
通过对象的生死判定算法我们已经知道那些对象已经死了,那我们怎样才能将这些对象回收呢?垃圾回收算法告诉我们这些无用的对象应该怎样回收。垃圾回收算法大体分为三种:复制算法,标记-清除算法,标记整理算法。其中复制算法常用于对新生代的收集,标记清除和标记整理用于对老年代的收集,具体的原因下文会介绍。
(1)复制算法
将可用的内存划分成大小相等的两块,每次只是用其中的一块,当这一块内存使用完了之后,就将还存活的对象复制到另一块内存上,然后把已经使用过的内存空间统一清理掉。

该回收算法的效率虽高,但内存空间的使用效率并不高,因为总是有一般的内存时间使用不上。所以现在商用的JVM虚拟机一般不会将内存空间划分为两个相等的两块,而是划分成一个较大的Eden区和两块较小的Survivor区,Eden和Survivor的比例大小为8:1:1。具体的分代请看https://www.cnblogs.com/ozho/p/10589077.html
(2)标记清除算法
标记清除算法分为标记阶段和清除阶段。
标记阶段:通过可达性分析将需要清除的对象标记
清除阶段:将标记的对象清除。
标记清除算法的问题:效率不高并且会产生大量不连续的内存碎片

(3)标记整理算法
是对标记清除优化的一种算法。在清除阶段之后,会将所有存活的对象移动到内存的一端,然后清理掉剩余可用的内存空间

再谈分代收集
上文已经提到新生代收集由复制算法实现,老年代由标记清除或者标记整理算法实现。新生代收集只能由复制算法实现,老年代只能由标记清除或者标记整理算法实现的原因:
新生代中大多数对象都是“朝生夕死”的,每经过一次Minor GC都会有一大批对象死去,只有少量的对象存活。所以这些少量存活对象复制成本很低,但是在老年代中对象的存活率很高,如果采用Eden区:Suvivor=8:1的比例分配,没有足够的分配空间分配。
永久代的垃圾回收;
永久代的垃圾回收主要为两部分:无用的类和废弃的常量。
关于“由谁回收”的问题下篇继续分析:垃圾回收器
参考:《深入理解JVM虚拟机》
JVM垃圾回收机制二的更多相关文章
- JVM内存管理和JVM垃圾回收机制
JVM内存管理和JVM垃圾回收机制(1) 这里向大家描述一下JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆.栈.本地方法栈.方法区等部分组成,另外JVM分别对新生代和旧生代采 ...
- JVM 垃圾回收机制和常见算法和 JVM 的内存结构和内存分配(面试题)
一.JVM 垃圾回收机制和常见算法 Sun 公司只定义了垃圾回收机制规则而不局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同.GC(Garbage Collector)在回收对象前首先必 ...
- 真的可惜,四面阿里,结果我被JVM垃圾回收机制与 OOM异常卡住了
前言 为什么需要垃圾回收 首先我们来聊聊为什么会需要垃圾回收,假设我们不进行垃圾回收会造成什么后果,我们举一个简单的例子 我们住在一个房子里面,我们每天都在里面生活,然后垃圾都丢在房子里面,又不打扫, ...
- JVM垃圾回收机制总结:调优方法
转载: JVM垃圾回收机制总结:调优方法 JVM 优化经验总结 JVM 垃圾回收器工作原理及使用实例介绍
- JVM垃圾回收机制概述
JVM垃圾回收机制概述 1.定义 是指JVM用于释放那些不再使用的对象所占用的内存. 2.方式 2.1引用计数(早期) 当引用程序创建引用以及引用超出范围时,JVM必须适当增减引用数.当某个对象的引用 ...
- Java虚拟机学习笔记——JVM垃圾回收机制
Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...
- JVM基础系列第8讲:JVM 垃圾回收机制
在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由<Java 虚拟机规范>指定的,每个 Java 虚拟机可能都有不同的实现.其实涉及到 Java 虚拟机的内存, ...
- JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代
内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...
- JVM垃圾回收机制和常用算法
由于疫情的原因,所以目前一直在家远程办公,所以很多时间在刷面试题,发现2019大厂的面试虽然种类很多,但是总结了一下发现主要是这几点:算法和数据结构. JVM.集合.多线程.数据库这几点在面试的时候比 ...
随机推荐
- luogu 3812 【模板】 线性基
线性基是一个支持在集合里插入数并查询最大子集异或值 #include<iostream> #include<cstdio> #include<cstring> #i ...
- 1.SJ-SLAM-14
1.引言 SLAM:Simultaneous Localization and Mapping 同时定位与地图构建 搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估 ...
- mysql 三存储引擎
一 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型 ...
- CCF 201512-1 数位之和 (水题)
问题描述 给定一个十进制整数n,输出n的各位数字之和. 输入格式 输入一个整数n. 输出格式 输出一个整数,表示答案. 样例输入 20151220 样例输出 13 样例说明 20151220的各位数字 ...
- windows ping得通,连接不上网
这是被电脑安装的软件拦截的现象,我们只需要使用. netsh winsock reset 重启电脑即可
- tp5 验证码功能实现
视图层 <div class="loginbox-textbox"> <input class="form-control" placehol ...
- Shiro 权限管理框架
一.什么是Shiro Apache Shiro是一个强大易用的java安全框架,提供认证.授权.加密和会话管理等功能 · 认证:用户身份识别,俗称“登录”: · 授权:访问控制 · 密码加密:保护或隐 ...
- docker Mac安装和使用
1.安装docker brew cask install docker 2.安装后可以用命令查看版本 docker --version 3.build java 项目(jar) docker buil ...
- java多线程模拟红绿灯案例
代码Lighter.java: package pack1; /** * 灯线程 * @author Administrator * */ public class Lighter extends T ...
- iOS蓝牙传输数据演示-3
蓝牙传输数据演示 在上一小节中,我们一起开发了基于蓝牙通讯的工具类,该类中详细的实现蓝牙连接流程中的每一个环节 本小节我们就以给小米手环发送数据使其震动来演示我们工具类的用法 工具类本身具有通用性,属 ...