垃圾收集器与内存分配策略

  一、判断对象是否已死

  1、垃圾收集器在对堆进行回收前,要先判断对象是否已死。而判断的算法有引用计数算法和可达性分析算法;

  2、引用计数算法是给对象添加引用计数器,有地方引用就加1,当引用失效就减1,任何时刻计数器为0的对象就是不可能再被引用的。但是它很难解决对象之间相互循环引用。所以在主流的Java虚拟机里没有用引用计数算法来管理内存。

  3、可达性分析算法是通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。在Java语言中,可作为GC Roots的对象包括下面几种:虚拟机栈(栈帧中的本地变量表)中引用的对象;方法区中类静态属性引用的对象;方法区中常量引用的对象;本地方法栈中JNI(即一般说的Native方法)引用的对象。

  4、引用在JDK1.2之后分为强引用,软引用,弱引用,需引用。

  5、即使在可达性分析后不可达的对象也至少要经历两次标记过程,第一次是可达性分析后没有与GC Roots相关联的引用链,就会被标记进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法,当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,那么就被是为“没有必要执行”,如果执行的对象与引用链上的任何一个对象建立了关联即可拯救自己。

  二、垃圾收集算法

  1、标记-清除算法、标记-整理算法、复制算法、分代收集算法;

  2、分代收集算法是根据对象存活周期的不同来划分为老年代和新生代(默认是15个周期);在新生代中因为有大量对象会死去所以采用的复制算法,在新生代区域中分为一个Eden和两个Survivor区域,新建对象分配到Eden和其中一个Survivor中,每次清理后将活着的对象复制到Survivor区域;HotSpot虚拟机的默认比例是8:1;而老年代中对象存活率高,一般采用标记-清除或者标记-整理算法来进行GC。

  三、HotShot算法实现

  1、枚举根节点:进行可达性分析,从可作为GC Roots的节点查找引用链,可达性分析时会产生GC停顿。并且使用OopMap的数据结构来使得虚拟机可以直接得知哪里存放着对象的引用。HotShot在安全点会停下进行GC。而为了让所有线程在安全点停顿,有两种方案,抢先式中断和主动式中断。还有安全区域概念。

  四、垃圾收集器

  1、Serial收集器时最基本、发展历史最悠久的收集器,单线程收集器。

  2、ParNew收集器其实就是Serial收集器的多线程版本

  3、Parallel Scavenge收集器是一个新生代收集器,它也是使用复制方法的收集器又是并行的多线程收集器。它不同于CMS等收集器的关注点是减少停顿时间,他的目标是达到一个可控制的吞吐量。

  4、Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整理”算法。

  5、Parallel Old是Parallel Scavenge的老年代版本,使用多线程和“标记-整理”算法。

  6、CMS收集器是一种以获取最短回收停顿时间为目标的收集器,使用“标记-清除”算法。

  7、G1收集器是当今收集器技术发展的最前沿成果之一,G1具有以下特点:并行与并发;分代收集;空间整合;可预测的停顿。

  五、内存分配与回收策略

  1、在Serial/Serial Old收集器下,大多数情况下,对象在新生代Eden区中分配,当Eden区没有足够内存是,发起一次Minor GC。

  2、大对象直接进入老年代。通过-XX:pretenureSizeThreshold参数来设置对象大小的界限,这样做的目的是避免在Eden区及两个Survivor区之间发生大量的内存复制

  3、长期存活的对象将进入老年代 默认经历过15次Minor GC后进入老年代

  4、动态对象年龄判定如果在Survivor空间中相同的年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或者等于该年龄的对象可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄

  5、空间分配担保:发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,不安全的话会再计算之前每一次回收晋升到老年代对象容量的平均大小之作为经验值,与老年代的剩余空间进行比较,决定是否进行Full GC来让老年代腾出更多空间。

深入理解Java虚拟机--阅读笔记二的更多相关文章

  1. 深入理解Java虚拟机--阅读笔记一

    Java内存区域 一.java运行时数据区域 1. 程序计数器:程序计数器占据的内存空间较小,是当前运行线程执行的字节码的计数:分支.循环.跳转.异常处理.线程恢复等都要依赖技术器来对执行的字节码进行 ...

  2. 深入理解JAVA虚拟机阅读笔记4——虚拟机类加载机制

    虚拟机把描述类的Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言中,类型的加载.连接和初始化过程都是 ...

  3. 深入理解JAVA虚拟机阅读笔记1——JAVA内存区域

    一.Java内存区域 1.程序计数器 线程私有. 当前线程所执行的字节码的行号指示器.由于JAVA是多线程的,因此每个线程都独立的程序计数器. 异常:没有规定任何OutOfMemeryError情况的 ...

  4. 深入理解Java 虚拟机阅读笔记(一)

    1.程序计数器- 占用空间:较小 作用:字节码行号指示器 作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复) 特点:线程私有(每个计数器独立计算,上下文相互独立). 2. ...

  5. 深入理解java虚拟机阅读笔记(1)运行时数据区域

    java虚拟机所管理的内存区域主要分为方法区.堆:虚拟机栈.本地方法栈.程序计数器,如图: 1.程序计数器是当前线程所执行的字节码行号指示器,用以记录当前指令执行的位置.程序计数器是线程私有的,每个线 ...

  6. 深入理解Java虚拟机阅读心得(二)

    垃圾收集 程序计数器.虚拟机栈.本地方法栈三个区域随线程而生,随线程而灭:这几个区域的内存分配和回收都具备稳定性,不需要过多的考虑回收的问题.而Java堆和方法区则不一样. Java堆中存储了几乎所有 ...

  7. 深入理解JAVA虚拟机阅读笔记6——线程安全与锁优化

    线程安全:如果一个对象可以安全的被多个线程同时使用,那它就是线程安全的. 一.Java中的线程安全 1.不可变 不可变的对象一定是线程安全的.String.枚举类型.java.lang.Number的 ...

  8. 深入理解JAVA虚拟机阅读笔记3——垃圾回收器

    一.垃圾收集器总览 新生代:Serial. ParNew. Parallel Scavenge 老年代:CMS.Serial Old. Parallel Old 最新的:G1 并行和并发的区别: 并行 ...

  9. 深入理解JAVA虚拟机阅读笔记2——垃圾回收

    线程私有的程序计数器.虚拟机栈和本地方法栈随线程而生,随线程而灭.栈中的栈帧随方法的进入和退出有条不紊的入栈和出栈. 而Java堆和方法区因为需要多大内存.创建多少对象都是不确定的,因此这两个区域是垃 ...

随机推荐

  1. .net图表之ECharts随笔03-热力地图

    基于01和02 要得到如图所示的热力地图(我从NuGet上下载的包没有heatmap.js文件,没法直接搞热力图,只好暂时先搞着地图.后面尽量搞一下),一般要设置四个参数——title.tooltip ...

  2. Android开发教程 - 使用Data Binding(五)数据绑定

    本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fr ...

  3. nginx,gunicorn常用命令

    nginx 启动: 在下载nginx的目录下直接输入nginx回车 停止: nginx -s stop 重启: nginx -s reload 查看当前运行进程: ps -ef | grep ngin ...

  4. mongoose入门

    概述 像Mysql和Mongodb这样的数据库,一般都是在命令行或者工具里面进行操作,如果想在node搭建的服务器上面操作,就必须要利用特殊的模块的.其中操作Mongodb数据库需要用到mongoos ...

  5. a 便签实现 下载

    如果想通过纯前端技术实现文件下载,直接把a标签的href属性设置为文件路径即可,如下: <a href="https://cdn.shopify.com/s/files/1/1545/ ...

  6. 机器学习基石笔记:16 Three Learning Principles

    三个理论上界: 三个线性模型: 三个关键工具: 三条学习规则: 1.奥卡姆剃刀定律 先从简单模型开始, 训练后出现欠拟合, 再尝试复杂点模型. 2.采样误差 训练.验证.测试数据尽量同分布. 3.数据 ...

  7. django基础之二

    一.什么是架构? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所有的We ...

  8. Vue2.5开发去哪儿网App 第二章笔记

    Vue完成  TodoList 1.默认方式 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  9. odoo开发笔记 -- wkhtmltox打印不显示中文 --ubuntu字体安装

    wkhtmltox 是一个开源的将网页内容转换成PDF的软件包,常嵌套在网页页面里边做打印功能. 以微软雅黑字体为例(其他的宋体.黑体等点阵字体都一样的),我们的雅黑字体文件是:Yahei.ttf(放 ...

  10. android屏幕密度规律及dp px转换

    px和dp(sp) 之间转化公式: 1  乘以(dp转px)或者除以(px转dp) scal缩放因子,在上浮0.5f /** * 密度转换像素 * */ public static int dip2p ...