深入理解java虚拟机之——JVM垃圾回收策略总结
- 如何判断一个对象是否存活
引用计数算法:给对象中添加一个引用计数器,每当有引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用。
Java虚拟机里面没有选用引用计数算法来管理内存,其中主要原因是他很难解决对象之间相互引用的问题。
例如:对象objA和objB都有字段instance字段,且互相赋值,但实际上这两个对象已经不可
能被访问了,但因为他们互相引用着对方,导致他们的引用计数都不为0,于是导致他们无法回收。
(Java中这种情况是可以回收的)
public class ReferenceGC {
public Object instance = null;
public static void testGC(){
ReferenceGC objA = new ReferenceGC();
ReferenceGC objB = new ReferenceGC();
objA.instance = objB;
objB.instance = objA;
objA = null;
objB = null;
}
}
可达性分析算法:通过一系列的称为"GC Root"的对象作为起点,从这些节点开始向下搜索,
搜素所走过的路径称为引用链(Reference Chain),当一个对象到GC Root没有任何的引用链
相连,就判定对象可以被回收。Java, C#等语言都是使用这种算法判读对象的存活的。
GC Root的对象包括下面几种:
虚拟机栈(栈帧中的本地变量表)中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI(Native方法)引用的变量
- 引用
Java1.2后对引用进行扩充,分为:
强引用:类似 Object obj = new Object()这类引用,垃圾收集器永远不会进行回收
软引用:用来描述一些还有用但非必须的对象。系统在内存溢出异常之前,将会把这些
对象列入回收范围之中进行。二次回收。如果这次回收还没有足够的内存,才会抛出内存异常。
SoftReference类实现。
弱引用:比软引用更弱一些,也是用来描述非必须对象。回收发生在下次垃圾收集器回收时。
WeakReference类实现。
虚引用:最弱一种引用,虚引用无法影响对象其生存时间,也无法通过虚引用获得
对象,唯一目的就是对象被垃圾收集器回收时,收到一个系统通知。PhantomReference类实现。
- 对象生存还是死亡
如果对象在进行可达性分析后发现没有与GC Roots相连的引用链,那么它将会被第一次标记并且进行
一次筛选,筛选条件是该对象是否覆盖finalize()方法,是否执行过finalize()方法。如果为覆盖或执行过则
对象死亡。
如果覆盖finalize()且有必要执行finalize(),则对象放入F-Queue的队列中,之后由虚拟机自动建立,
低优先级的Finalizer线程去执行。这里的执行是指虚拟机会触发这个方法,但不承诺会等待它运行结束。
(该方法不建议使用)
- 方法区回收
方法区主要回收:废弃常量和无用的类
废弃常量:例如一个字符串"abc"已经进入常量池中,但是当前系统没有其他地方引用这个字面量。
无用的类:
该类的所有实例都已经被回收,也就是Java堆中不存在该类的任何实例
加载该类的ClassLoader已经被回收
该类对应的Java.lang.Class对象没有在任何地方被引用,无法再任何地方通过反射访问该类的
方法。
- 垃圾收集算法
标记-清除算法:首先标记出所有需要回收的对象,在标记完成后统一回收所有标记的对象,标记过
程在上面提过。
不足:1.效率问题,标记和清除两个过程效率不高
2.空间问题,标记清楚产生大量内存碎片
复制算法:将内存安装容量分为大小相等的两块,每次使用其中一块。当回收时,将存活的对象复制到
为使用的内存中,清楚已使用过的内存。
不足:内存缩小到运来的一半
Java在新生代中采用这种算法,不过是将内存分为Eden和两块Survivor,每次使用Eden和其中的Suvivor
当回收时,将Eden和Suvivor存活的内存复制到未使用的Suvivor空间。HotSpot默认Eden与Suvivor比例为
8:1,相当于可以使用90%的内存,如果存活的内存超过Suvivor空间,就是用老年代进行分配担保。
标记-整理算法:过程与标记-清除算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活
的对象向一端移动,然后清理掉端边界以外的内存。
分代收集算法:将内存划分成几块,各个区域采用最适当的收集算法。Java一般把Java堆分为新生代和老年代,
按各个年代特点采用适当的算法。
垃圾收集器:
新生代:Serial收集器,ParNew收集器,Parallel Scavenge收集器
老年代:CMS, Seral Old(MSC), Parallel Old收集器
GI收集器
深入理解java虚拟机之——JVM垃圾回收策略总结的更多相关文章
- 深入理解Java虚拟机之JVM垃圾回收随笔
1.对象已经死亡? 1.1引用计数法:给对象中添加一个引用计数器,每当有一个地方引用他时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器都为0的对象就是不可能再被使用 的.但是它很难解决 ...
- 《深入理解 Java 虚拟机》学习 -- 垃圾回收算法
<深入理解 Java 虚拟机>学习 -- 垃圾回收算法 1. 说明 程序计数器,虚拟机栈,本地方法栈三个区域随线程而生,随线程而灭,这几个区域的内存分配和回收都具备确定性 Java 堆和方 ...
- 深入理解java虚拟机---读后笔记(垃圾回收)
运行时数据区,主要包括方法区.虚拟机栈.本地方法栈.堆.程序计数器,该部分内存都是线程隔离的. 然后和其交互的有执行引擎.本地库接口,此部分线程之间是可以共享的. 1. 引用计数算法 给对象添加一个引 ...
- 【转】Java虚拟机的JVM垃圾回收机制
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp43 1.JVM内存空间 JVM堆(Heap)= 新生代 ...
- 深入理解Java虚拟机-内存分配与回收策略
一.内存分配策略 新生代中98%的对象都是"朝生夕死"的,所以并不需要按照1:1的比例来划分内存空间,而是将内存(新生代内存)分为一块较大的Eden(伊甸园)空间和两块较小的Sur ...
- 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载
<深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...
- 读书笔记-《深入理解Java虚拟机:JVM高级特性与最佳实践》
目录 概述 第一章: 走进Java 第二章: Java内存区域与内存溢出异常 第三章: 垃圾收集器与内存分配策略 第四章: 虚拟机性能监控与故障处理 第五章: 调优案例分析与实战 第六章: 类文件结构 ...
- Java内存管理 -JVM 垃圾回收
版权声明:本文为博主原创文章,未经博主允许不得转载 一.概述 相比起C和C++的自己回收内存,JAVA要方便得多,因为JVM会为我们自动分配内存以及回收内存. 在之前的JVM 之内存管理 中,我们介绍 ...
- Java虚拟机四:垃圾回收算法与垃圾收集器
在Java运行时的几个数据区域中,程序计数器,虚拟机栈,本地方法栈3个区域随着线程而生,随线程而灭,因此这几个区域的内存分配和回收具有确定性,不需要过多考虑垃圾回收问题,因为方法结束或者线程结束时,内 ...
随机推荐
- MyBatis 一对多关联查询
sqlxml文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC ...
- spring的value,null标签
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://ww ...
- OVS vxlan 底层结构分析 - 每天5分钟玩转 OpenStack(148)
上一节创建了 vxlan100_net 并部署 instance,今天我们来分析底层网络结构. 控制节点 执行 ovs-vsctl show: br-int br-int 连接了如下 port: ta ...
- 很傻很二很简单的一个问题,json键值为变量如何取值
js里的json的键值是变量的话,那么传统的做法似乎不管用了. 例如: var json={'a':'123','b':'999'} json.a得到123,如果a用变量表示呢,有笨法for循环 ...
- 二叉搜索树Java实现(查找、插入、删除、遍历)
由于最近想要阅读下 JDK1.8 中 HashMap 的具体实现,但是由于 HashMap 的实现中用到了红黑树,所以我觉得有必要先复习下红黑树的相关知识,所以写下这篇随笔备忘,有不对的地方请指出- ...
- 一个想法(续五):IT联盟创业计划:现阶段进度公示、疑问解答及进行中的计划
前言: 首先今天是元宵节,先祝大伙元宵节快,单纯的快乐! 然后看看开展中的计划: IT联盟创业计划众筹发起:一个想法(续三):一份IT技术联盟创业计划书,开启众筹创业征程 IT联盟创业计划众筹进度:一 ...
- 【踩坑速记】MIUI系统BUG,调用系统相机拍照可能会带给你的一系列坑,将拍照适配方案进行到底!
一.写在前面 前几天也是分享了一些学习必备干货(还没关注的,赶紧入坑:传送门),也好久没有与大家探讨技术方案了,心里也是挺痒痒的,这不,一有点闲暇之时,就迫不及待把最近测出来的坑分享给大家. 提起An ...
- 告诉你 IOS9.0 之后的Bitcode到底是什么!!
用Xcode 7 beta 3在真机(iOS 8.3)上运行一下工程,结果发现工程编译不过.看了下问题,报的是以下错误: ld: ‘/Users/**/Framework/SDKs/PolymerPa ...
- 封装keyframes插件
模仿jquery,使用简单,自动添加浏览器前缀 var keyframes = new SHBKerframes(); keyframes.define([{ name:'myAnimate', 0% ...
- 小米wifi局域网下播放硬盘影片使用方法
因为家里没开网,看视频都要缓存到手机上. 后来听说小米wifi可以做为一个局域网服务器来用,没忍住就买了一个. 但是下载app之后才发现被坑. 小米路由器需要登录帐号之后才可以使用,而且每次开启都要登 ...