【4】JVM-GC设计思路分析
Java中将内存的控制交给JVM来实现,方便了JAVA程序猿,当然牺牲了一部分效率,不过总体来看是值得的。那么JVM中是如何设计GC的呢,本文从几个问题入手,然后分析了一下设计思路,如果有理解错误的地方,请批评指正!主要参考了《深入理解JAVA虚拟机》这本书,图是盗来的,图的内容和书上一样。
在JVM的内存模型中,堆内存是JAVA内存区域中最大的一部分,GC主要就是发生在堆中,用来回收那些无用的对象。这样直接就引申出了第一个问题:什么样的对象需要被回收?判断条件是什么?如何判断?
- 引用计数算法:这个非常容易理解,给每个对象添加一个引用计数器,对象每被引用一次,引用计数器就+1,引用失效时就-1。那么判断一个对象是否有用的条件就变成了对这个计数器值得判断了,如果为0,那么被回收,如果为>0,那么保留。但是这种方式会产生一个问题,就是对象之间的循环引用无法被识别,即使这两个对象不能被访问,但是它们之间互相引用着对方,故而计数器肯定>0,那么就不能被回收。JVM中并没有使用引用计数算法,而是使用了根搜索算法。
- 根搜索算法:这个算法也不难理解,通过条件,选择一系列的对象成为“GC Roots"对象,然后将”GC Roots"对象作为起始点开始向下搜索,搜索所有走过的路径成为“引用链”。在这个引用链上的对象就保留,而如果一个或多个互相引用的对象不在这个引用链上,或者说对象到“GC Roots"不可达,那么这些就是无用的对象,都需要被回收。
注:Java语言中,可作为GC Roots的对象包括下面几种:
1) 虚拟机栈(栈帧中的本地变量表)中引用的对象
2) 方法区中类静态属性引用的对象
3) 方法区中常量引用的对象
4) 本地方法栈中JNI(即一般说的Native方法)引用的对象
从JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用,软引用,弱引用,虚引用,这四种引用的强度依次减弱
1) 强引用就是指在程序代码之中普遍存在的,类似 “Object obj = new Object()” 这类的引用,只要强引用还存在,垃圾回收器永远不会回收被引用的对象。我们也正是利用这个原理来重现了OOM异常。
2) 软引用(SoftReference类)是用来描述一些还有用但并非需要的对象,对于软引用关联着的对象,在系统将要发生内存异常之前,将会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存异常
3) 弱引用(WeakReference类)也是用来描述非必需对象的,被弱引用关联的对象只能生存到下一次GC发生之前,当垃圾收集器工作时,无论当前内存释放足够,都会回收掉只被弱引用关联的对象
4) 虚引用(PhantomReference类)也称为幽灵引用或者幻影引用,它是最弱的一种引用关系,一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例,对一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知
那么上述内容看完之后想必都知道了什么样的对象会被GC了吧,那么JVM又是通过什么方式来回收这些内存的呢?下面就需要了解一下垃圾的回收算法了。
- 标记-清除算法
试着想一想,如果要你要设计一个算法清除满足收集条件的对象来释放内存的时候你该怎么做呢?最简单的是不是就是把需要回收的对象标记一下,然后直接全部回收就行了?照着这个思路就是”标记-清除算法”的思想了,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。想法很简单,实际也就是这么做的。但是呢,这种方式是不是最好的?有什么缺陷?
- 复制算法
- 分代收集算法
【4】JVM-GC设计思路分析的更多相关文章
- iOS 组件化 —— 路由设计思路分析
原文 前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高.为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,VIPER等复杂架构.更换适合业 ...
- laravel开发大型电商网站之异常设计思路分析
令人讨厌的异常 提起异常,大家都很反感,当信心满满的写完一段代码,刷新页面发现上面写着大大的 Exception 是最心烦的时候了.模块给领导演示的时候,如果报了异常,也是最让人崩溃的时候了. 在一般 ...
- Sizzle源码分析:一 设计思路
一.前言 DOM选择器(Sizzle)是jQuery框架中非常重要的一部分,在H5还没有流行起来的时候,jQuery为我们提供了一个简洁,方便,高效的DOM操作模式,成为那个时代的经典.虽然现在Vue ...
- 记录一次JVM调优【GC日志的分析】
首先查看服务器版本默认信息: 修改tomcat/bin/catalina.sh,在最顶端加入JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCDetails -Xloggc ...
- TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析
TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...
- druid 源码分析与学习(含详细监控设计思路的彩蛋)(转)
原文路径:http://herman-liu76.iteye.com/blog/2308563 Druid是阿里巴巴公司的数据库连接池工具,昨天突然想学习一下阿里的druid源码,于是下载下来分析了 ...
- Backbone设计思路和关键源码分析
一. Backbone的江湖地位: backbone作为一个老牌js框架为大规模前端开发提供了新的开发思路:前端MVC模式,这个模式也是前端开发演变过程中的一个重要里程碑,也为MVVM和Redux等开 ...
- 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路
最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...
- 如何避免后台IO高负载造成的长时间JVM GC停顿(转)
译者著:其实本文的中心意思非常简单,没有耐心的读者建议直接拉到最后看结论部分,有兴趣的读者可以详细阅读一下. 原文发表于Linkedin Engineering,作者 Zhenyun Zhuang是L ...
随机推荐
- FullWebBrowserCookie 取得WebBrowser的完整Cookie
using System; using System.ComponentModel; using System.Net; using System.Runtime.InteropServices; u ...
- Android异步载入学习笔记之四:利用缓存优化网络载入图片及ListView载入优化
假设不做不论什么处理.直接用网络载入图片在网速快的情况下可能没什么不好的感觉.可是假设使用移动流量或是网络不好的时候.问题就来了,要么用户会抱怨流量使用太多.要么抱怨图片载入太慢.如论从哪个角度出发, ...
- HTML5学习笔记(二):HTML基础学习之一
元素.属性和格式化 元素是指开始标签到结束标签之前的所有代码,如: <p>this is my page!</p> <!-- 下面的可以称为空元素 --> < ...
- 菜鸟学Java(十)——分页查询
今天继续跟大家说说一些非常基础的东西,这次我们说说分页查询.说到分页,可能很多人都听说过什么真分页.假分页的.简单解释一下,拿第二页,每页20条为例:真分:数据库里取 的就是21-40条:假分:数据库 ...
- Flink SQL与 SQL Parser ,calcite
http://vinoyang.com/2017/06/12/flink-table-sql-source/ Flink Table&Sql 如何结合Apache Calcite http:/ ...
- vim学习笔记(12):在vim中修改文件编码,解决vim 打开乱码
在linux 中查看文件编码可以通过以下几种方式: 一.查看文件编码 1.查看文件编码file命令 :file ip.txt ip.txt: UTF-8 Unicode text, with esca ...
- convert2utf8withbom
很久以前给同事要的转码bash 当时windows和mac总是出现中文注释乱码的情况,让人心塞的难过.又因为是老项目,现有源码太多了,不可能改模板重新创建.只能跑一遍这个玩意儿了…… #!/bin/b ...
- LeetCode: Pascal's Triangle 解题报告
Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, given ...
- Android 两级菜单栏
这里来记录下,android 的两级菜单栏,就是顶部切换,和底部的切换.因为在这个上面整了太久的时间,所以特此记录下. 第一种: 先介绍一个网上别人写出来的效果吧,这个当时积分真的很高..CSDN30 ...
- Android 下拉刷新上啦加载SmartRefreshLayout + RecyclerView
在弄android刷新的时候,可算是耗费了一番功夫,最后发觉有现成的控件,并且非常好用,这里记录一下. 原文是 https://blog.csdn.net/huangxin112/article/de ...