垃圾收集器
垃圾收集(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. call、apply、bind三者比较

    var obj={a:1}; var foo={ getA:function(item1,item2){ return this.a+item1+item2 } } // apply绑定参数为数组,一 ...

  2. Java 语法学习2

    Java基础语法二 类型转换 public class demo03 { public static void main(String[] args) { int i=128; byte a=(byt ...

  3. TP6自带的跨域中间件无法使用的个人解决方法

    使用TP6,因为需要跨域上传图片,一直不成功,网上搜了好久,方法都没解决跨域上传文件 比如下面的方式没成功 $this->app = $app; $this->request = $thi ...

  4. css定位,class属性之间有空格与无空格的区别

    中间有空格的情况 是选择到.class1类下的.class2类子节点,即.class2类的节点要是.class1类子节点 <style> .class1 { color: black; } ...

  5. Python return self

    在Python中,return self的作用为: Returning self from a method simply means that your method returns a refer ...

  6. 入坑Java的自学之路

    # 入坑Java的自学之路 ## 基础知识 - 编程语言:Java python c- 基本算法- 基本网络知识 tcp/ip http/https- 基本的设计模式 ------ ## 工具方面 - ...

  7. WPF进阶技巧和实战07--自定义元素01

    完善和扩展标准控件的方法: 样式:可使用样式方便地重用控件属性的集合,甚至可以使用触发器应用效果 内容控件:所有继承自ContentControl类的控件都支持嵌套的内容.使用内容控件,可以快速创建聚 ...

  8. 技术与艺术的结合,HMS Core让手机主题趣味丛生

    在9月23日晚举办的华为nova9系列新品发布会上,华为在发布nova9系列新机之外,还为观众展示了多款Harmony OS趣味主题.其中一款名为"翻滚吧牛奶"的应用主题看起来十分 ...

  9. strategy策略模式个人理解

    首先了解策略模式的主要作用:能够把算法进行封装和动态传递: 可能听上去很抽象,我们引入一个方便理解的案例来解释: 给定一个数组 int[] array = {32,12,42,26,-23,0,-2, ...

  10. RuntimeError: DataLoader worker (pid 18255) is killed by signal: Killed.

    RuntimeError: DataLoader worker (pid 18255) is killed by signal: Killed. 通过观察内存发现,数据加载过程中内存会被耗尽.