垃圾收集器
垃圾收集(Garbage Collection,GC)。当需要排查各种内存溢出、内存泄露问题时,当垃圾收集成为系统更高并发量的瓶颈时,我们需要去了解GC和内存分配。

检查对象的"存活"状态

  1. 引用计数法:每当有一个地方引用对象时,计数器加1;当引用值失效,减1;任何时刻计数器为0,则表示对象不可能再被使用。缺点就是很难解决对象之间相互循环引用的问题。(如a.instance=b;b.instance=a)
  2. 可达性分析算法:这个算法的思想是通过一系列成为“GC Roots”的对象作为起始点,从这些结点向下搜索,搜索走过的路径成为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明该对象不可用。在Java语言中,可作为GC Roots的对象包括下面几种:
    • 虚拟机栈(栈帧中的本地变量表)中引用的对象;
    • 方法区中静态属性引用的对象;
    • 方法区中常量引用的对象;
    • 本地方法中JNI(即一般说法中的Native方法)引用的对象。
  3. 再谈引用:之前两个方法中对象的存活时都是与“引用”相关。JDK1.2后,Java对引用概念进行了扩充,将引用分为强引用、软引用、弱引用、虚引用这四种,四种强度依次逐渐减弱。
    • 强引用是代码中普遍存在的,类似于Object o=new Object()这类引用,只要强引用还在,垃圾收集器就永远不会回收被引用的对象。
    • 软引用是描述一些还有用但非必须的对象,对于软引用关联的对象,在系统将要发生内存溢出异常之前,会把这些对象列入回收范围之中,并进行第二次回收。若是不行才会报内存溢出异常。
    • 弱引用是描述非必需对象的,它的强度比软引用更弱一些,被弱引用的对象只能生存到下一个垃圾收集之前(无论内存是否充足,都会被回收)。
    • 虚引用也被称为幽灵引用或者幻影引用,是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法对虚引用来获取一个对象的实例。为对象设置虚引用关联的唯一目的是能在这个对象能被收集器回收时收到一个系统通知。
  4. 生存还是死亡:在可达性分析中不可达对象也不是"非死不可",这时候它们处于缓刑阶段,要宣告一个对象的死亡,至少要经历两次标记过程。如果对象在进行可达性分析后没有与GC Roots相连的引用链,那它将会被第一次标记并且进行一次筛选,筛选条件是此对象中是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或finalize()方法已经被虚拟机调用过,虚拟机江浙两种情况都视为"没有必要执行"。如果这个对象被判定有必要执行finalize()方法,那这个对象会被放置在F-Queue的队列之中,稍后由虚拟机自动建立的、低优先级的Finalizer线程去执行(触发这个方法,但不能保证运行完,因为可能会有死循环或者执行速度缓慢)它。finalize()方法是对象摆脱被回收的最后一次机会(只要重新链接上引用链),这时若是没能拯救自己,就会被第二次标记。
  5. 回收方法区:Java虚拟机规范没有要求在方法区进行垃圾收集,而且在方法区回收垃圾效率比较低。永久代的垃圾收集主要分为2部分,废弃常量和无用的类。JDK8移除了了永久代,相对的元空间metaspace会不会有gc来收集垃圾呢?GC默认会在元空间变满时对其进行回收,它还会动态增加(如果允许)分配给元数据内存。由于元空间的动态扩展(这是permgen无法做到的),启用CMSClassUnloadingEnabled,会使得GC在元空间的效率比永久代更好。

JVM:垃圾收集器与对象的"存活"问题的更多相关文章

  1. JVM垃圾收集器与内存分配策略(一)

    在前面的Java自动内存管理机制(上)和Java自动内存管理机制(下)中介绍了关于JVM的一些基础知识,包括运行时数据区域划分和一些简单的参数配置,而其中也谈到了GC,但是没有深入了解,所以这里开始简 ...

  2. 7种JVM垃圾收集器特点,优劣势、及使用场景

    今天继续JVM的垃圾回收器详解,如果说垃圾收集算法是JVM内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. 一.常见的垃圾收集器有3类 1.新生代的收集器包括 Serial PraNew Pa ...

  3. 【006】【JVM——垃圾收集器总结】

     Java虚拟机学习总结文件夹 JVM--垃圾收集器总结 垃圾收集器概览 收集算法是内存回收的方法论.垃圾收集据是内存回收的详细实现.Java虚拟机规范中对垃圾收集器应该怎样实现没有规定.不同的厂 ...

  4. 第五章 JVM垃圾收集器(1)

    说明:垃圾回收算法是理论,垃圾收集器是回收算法的实现,关于回收算法,见<第四章 JVM垃圾回收算法> 1.七种垃圾收集器 Serial(串行GC)-- 复制 ParNew(并行GC)-- ...

  5. 第六章 JVM垃圾收集器(2)

    上一章记录了几种常见的垃圾收集器,见<第五章 JVM垃圾收集器(1)> 1.G1 说明: 从上图来看,G1与CMS相比,仅在最后的"筛选回收"部分不同(CMS是并发清除 ...

  6. JVM垃圾收集器(1)

    此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 说明:垃圾回收算法是理论,垃圾收集器是回收算法的实现,关于回收算法,见<第四章 JVM垃圾回收算法& ...

  7. 5种JVM垃圾收集器特点和8种JVM内存溢出原因

    先来看看5种JVM垃圾收集器特点 一.常见垃圾收集器 现在常见的垃圾收集器有如下几种: 新生代收集器: Serial ParNew Parallel Scavenge 老年代收集器: Serial O ...

  8. 7种 JVM 垃圾收集器特点、优劣势及使用场景(多图)

    7种 JVM 垃圾收集器特点.优劣势及使用场景(多图)  mp.weixin.qq.com 点击上方"IT牧场",选择"设为星标"技术干货每日送达! 一.常见垃 ...

  9. JVM垃圾收集器-Parallel Scavenge收集器

    今天我给大家讲讲JVM垃圾收集器-Parallel Scavenge收集器 Parallel Scavenge收集器 Parallel Scavenge收集器也是一个新生代收集器,它也是使用复制算法的 ...

随机推荐

  1. selenium用css、xpath表达式进行元素定位

    绝对路径选择 从根节点开始的,到某个节点,每层都依次写下来,每层之间用 / 分隔的表达式,就是某元素的 绝对路径 Xpath : /html/body/div CSS : html>body&g ...

  2. symfony中模板生成路径两种方式

    1. 使用url('route_a_b_c')  这种方式会是全路径 : http://www.test.com/a/b/c 2. 使用path('route_a_b_c') 这种方式只是路径: /a ...

  3. nginx 禁止某IP访问

    首先建立下面的配置文件放在nginx的conf目录下面,命名为blocksip.conf: deny 95.105.25.181; 保存一下. 在nginx的配置文件nginx.conf中加入:inc ...

  4. 华为云计算IE面试笔记-FusionCompute上的虚拟机A和虚拟机B不能正常通信,请描述可能的故障点和排除方法(分析虚拟机A和虚拟机B不通)

    *快速定位故障点:(考到) ARP:同一二层内可以通过ARP -a命令查询到要访问的主机IP(ARP表项中记录了同一二层中的IP和MAC的对应关系),若查询不到,说明二层出现问题(Vlan 间不通)或 ...

  5. jenkin—持续集成

    jenkins与持续集成 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.(百度百科) 持续集 ...

  6. 51nod1355-斐波那契的最小公倍数【min-max容斥】

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1355 题目大意 定义\(f_i\)表示斐波那契的第\(i\)项,给出一个 ...

  7. python 包(package)和模块(module)的创建和引入(import)

    python 包(package)和模块(module)的创建和引入(import) 名词解释 实际上,Python中的函数(Function).类(Class).模块(Module).包库(Pack ...

  8. tomcat unkonwhost

    服务器能ping通域名,tomcat死活不行,重启tomcat解决

  9. 面试官:为什么需要Java内存模型?

    面试官:今天想跟你聊聊Java内存模型,这块你了解过吗? 候选者:嗯,我简单说下我的理解吧.那我就从为什么要有Java内存模型开始讲起吧 面试官:开始你的表演吧. 候选者:那我先说下背景吧 候选者:1 ...

  10. Vulnhub实战-DockHole_1靶机👻

    Vulnhub实战-DockHole_1靶机 靶机地址:https://www.vulnhub.com/entry/darkhole-1,724/ 1.描述 我们下载下来这个靶机然后在vmware中打 ...