本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片、视频等原文的内容)

若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cnblogs.com/wengshuhang/p/10123903.html

一、垃圾回收---对象存活算法:

    1、引用计数器法:在对象身上放上一个计数器,当有引用则加一,引用失效则减一,为零则可回收。(无法解决对象相互引用)

    2、可达性分析法(java),GC roots为起始点,从节点向下搜索,搜索路径为引用链,不在引用链的对象则是可回收的对象。

      在Java语言里,可作为GC Roots对象的包括如下几种:

        a.虚拟机栈(栈桢中的本地变量表)中的引用的对象 
        b.方法区中的类静态属性引用的对象 
        c.方法区中的常量引用的对象 
        d.本地方法栈中JNI(native方法)的引用的对象

      就算被Gc标记可回收,也未必死亡,第二次标记则死亡,在第二次标记途中,只要触发了对象的finalize()方法则可不用被回收,这个方法一个对象只能触发一次。

      永久代也可被回收

二、四种引用类型:

  1.强引用。对形如Object obj = new Object()产生的引用都是都是强引用,只要强引用还存在,jvm就永远不会回收该对象

  2.软引用。软引用主要用来指向一些有用但不重要的对象。如果内存足够,jvm不会回收软引用指向的对象,如果内存紧张,在发生溢出错误之前,jvm会回收该对象。

  3.弱引用:弱引用也是用来描述非必需对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。

  4.虚引用也称为幽灵引用或者幻影引用。它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。在JDK 1.2之后,提供了PhantomReference类来实现虚引用

  

三、垃圾回收---对象收集算法:

  1、标记清楚算法(1、标记清除效率不高,2、产生大量不连续空间)

  2、复制算法:将内存划分为大小相等的两块,每次只使用其中的一块。当这块内存用完了,就将还存活的对象复制到另一块内存上,然后把已使用过的内存空间一次清理掉。

    优点:每次只对其中一块进行GC,不用考虑内存碎片的问题,并且实现简单,运行高效

    缺点:内存缩小了一半

  

  3、标记-整理算法:复制算法不适用年老代的存活情况,存活率高时候需要进行较多的复制操作。让所有存活对象都向一端移动,然后直接清理掉端边界以外的所有内存。

  

   4、分代收集算法:根据对象的存活周期的不同将内存划分为几块,一般就分为新生代和老年代,根据各个年代的特点采用不同的收集算法。新生代(少量存活)用复制算法,老年代(对象存活率高)“标记-清理”算法

 四、垃圾收集器:

  JVM(HotSpot) 7种垃圾收集器的特点及使用场景

五、内存分配与回收策略:

  新生代中有一个Eden区跟两个Survicor区, -XX:SurvivorRatio=8 的 10M新生代空间

表示8M的eden区跟两个 1M的Survivor区(复制算法)。

  超过1m的的对象则直接通过担保分配机制放入年老代

  -XX:PertenureSizeThreshold参数可以直接将大于该值得对象直接放入老年代,避免大对象在survivor区相互复制

  -XX:MaxTenuringThreshold参数可规定survivor区存活复制的次数进入年老代的阈值,默认为15.

  动态对象判定: 相同survivor年龄的所有对象空间大于survivor空间的一半,则大于等于该年龄的对象全部进入年老代。

  

深入理解java虚拟机---3垃圾回收机制GC的更多相关文章

  1. 【java虚拟机】垃圾回收机制详解

    作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/6486852.html 一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分 ...

  2. 深入理解Java虚拟机之垃圾回收篇

    垃圾回收简介 ​ Java 会对内存进行自动分配与回收管理,使上层业务更加安全,方便地使用内存实现程序逻辑.在不同的 JVM 实现及不同的回收机制中,堆内存的划分方式是不一样的. ​ 简要地介绍下垃圾 ...

  3. 深入理解java虚拟机【垃圾回收算法】

    Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...

  4. java虚拟机 之 垃圾回收机制

    一.如何判断对象已死 垃圾回收器并不是java独有的,垃圾回收器的作用就是回收对象释放内存空间,那么如何判断哪些对象应该被回收呢? 在Java语言中是采用GC Roots来解决这个问题.如果一个对象和 ...

  5. 深入理解java虚拟机(二)-----垃圾回收

    做一个java程序员很是幸福,不用管不用的对象如何被回收,但是我认为了解一下也不是坏事. 一.如何判断对象已经死亡? 在进行垃圾回收之前,第一件事肯定是判断对象是否已经死亡.1.引用计数算法给对象添加 ...

  6. java虚拟机(五)--垃圾回收机制GC5

    什么样的对象需要回收 如果对象已经死亡了,就可以进行回收,判断方式如下 1).引用计数器:给对象添加一个计数器,有地方引用,就+1,当引用失效,就-1.当计数器为0时,判断对象不能再使用,但是当对象相 ...

  7. java虚拟机之垃圾回收机制

    一.需要回收的内存区域     程序计数器.虚拟机栈.本地方法栈 3 个区域随线程生灭(因为是线程私有),栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作.而 Java 堆和方法区则不一 ...

  8. 深入理解Java虚拟机(三)——垃圾回收策略

    所谓垃圾收集器的作用就是回收内存空间中不需要了的内容,需要解决的问题是回收哪些数据,什么时候回收,怎么回收. Java虚拟机的内存分为五个部分:程序计数器.虚拟机栈.本地方法栈.堆和方法区. 其中程序 ...

  9. 【深入理解Java虚拟机】垃圾回收

    引用计数算法 给对象加一个计数器,引用一次+1,引用时效就-1,当计数器=0时对象就不能再被使用: 实现简单,判定效率高:Java虚拟接没有使用,主要原因是很难解决对象之间循环引用问题: GC算法: ...

随机推荐

  1. Python测试 ——开发工具库

    Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. mechanize- Python中有状态的程序化Web浏 ...

  2. java和js获取当前天之后或之前7天(任意)日期

    一.获取过去第几天的日期(- 操作) 或者 未来 第几天的日期( + 操作) /** * 获取过去第几天的日期(- 操作) 或者 未来 第几天的日期( + 操作) * * @param past * ...

  3. C++ 操作符、局部 全局变量及自动转换原则

    1.&:表示与操作,eg:2&1=2&&:表示and操作,eg:1&&0=0|:表示或操作,eg:2|1=3||:表示or操作,eg:1||0=12.全 ...

  4. vim常用命令总结(转)

    vim常用命令 -------------------------------------------------------------------------------------------- ...

  5. Python+selenium+webdriver 安装与环境配置

    1.python安装:访问python.org/download,下载最新版本,安装过程与其他windows软件类似.记得下载后设置path环境变量,然后Windows命令行就可以调用: 2.Sele ...

  6. 利用:before和:after伪类制作CSS3 圆形按钮 含demo

    要求 必备知识 基本了解CSS语法,初步了解CSS3语法知识. 开发环境 Adobe Dreamweaver CS6 演示地址 演示地址 预览截图(抬抬你的鼠标就可以看到演示地址哦): 制作步骤: 一 ...

  7. JAVA中 XML与数据库互转 学习笔记三

    要求 必备知识 JAVA基础知识,XML基础知识,数据库的基本操作. 开发环境 MyEclipse10/MySql5.5 资料下载 源码下载   数据库在数据查询,修改,保存,安全等方面与其他数据处理 ...

  8. PHP设计模式:观察者模式

    示例代码详见https://github.com/52fhy/design_patterns 观察者模式 观察者模式(Observer)是对象的行为模式,又叫发布-订阅(Publish/Subscri ...

  9. HYPER-V的安装和双机调试的配置(一)

    在上一篇文章中,我们已经安装好了VS2017以及WDK,现在我们就需要创建双机调试的环境, 因为本人的工作环境问题,不能使用WMWARE进行虚拟机的安装,因此就针对HYPER-V这个的虚拟机来进行双机 ...

  10. spring boot 与 thymeleaf (4): 基本对象、工具类对象

    如果在前台, 我需要获取session中的信息, 或者需要获取url中的参数信息, 是不是需要在后台手动处理好, 然后放到Model中去, 在前台通过${}来取呢? 当然, 这种方式, 是可以的, 但 ...