JVM:垃圾收集器与对象的"存活"问题
垃圾收集器
垃圾收集(Garbage Collection,GC)。当需要排查各种内存溢出、内存泄露问题时,当垃圾收集成为系统更高并发量的瓶颈时,我们需要去了解GC和内存分配。
检查对象的"存活"状态
- 引用计数法:每当有一个地方引用对象时,计数器加1;当引用值失效,减1;任何时刻计数器为0,则表示对象不可能再被使用。缺点就是很难解决对象之间相互循环引用的问题。(如a.instance=b;b.instance=a)
- 可达性分析算法:这个算法的思想是通过一系列成为“GC Roots”的对象作为起始点,从这些结点向下搜索,搜索走过的路径成为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明该对象不可用。在Java语言中,可作为GC Roots的对象包括下面几种:
- 虚拟机栈(栈帧中的本地变量表)中引用的对象;
- 方法区中静态属性引用的对象;
- 方法区中常量引用的对象;
- 本地方法中JNI(即一般说法中的Native方法)引用的对象。
- 再谈引用:之前两个方法中对象的存活时都是与“引用”相关。JDK1.2后,Java对引用概念进行了扩充,将引用分为强引用、软引用、弱引用、虚引用这四种,四种强度依次逐渐减弱。
- 强引用是代码中普遍存在的,类似于Object o=new Object()这类引用,只要强引用还在,垃圾收集器就永远不会回收被引用的对象。
- 软引用是描述一些还有用但非必须的对象,对于软引用关联的对象,在系统将要发生内存溢出异常之前,会把这些对象列入回收范围之中,并进行第二次回收。若是不行才会报内存溢出异常。
- 弱引用是描述非必需对象的,它的强度比软引用更弱一些,被弱引用的对象只能生存到下一个垃圾收集之前(无论内存是否充足,都会被回收)。
- 虚引用也被称为幽灵引用或者幻影引用,是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法对虚引用来获取一个对象的实例。为对象设置虚引用关联的唯一目的是能在这个对象能被收集器回收时收到一个系统通知。
- 生存还是死亡:在可达性分析中不可达对象也不是"非死不可",这时候它们处于缓刑阶段,要宣告一个对象的死亡,至少要经历两次标记过程。如果对象在进行可达性分析后没有与GC Roots相连的引用链,那它将会被第一次标记并且进行一次筛选,筛选条件是此对象中是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或finalize()方法已经被虚拟机调用过,虚拟机江浙两种情况都视为"没有必要执行"。如果这个对象被判定有必要执行finalize()方法,那这个对象会被放置在F-Queue的队列之中,稍后由虚拟机自动建立的、低优先级的Finalizer线程去执行(触发这个方法,但不能保证运行完,因为可能会有死循环或者执行速度缓慢)它。finalize()方法是对象摆脱被回收的最后一次机会(只要重新链接上引用链),这时若是没能拯救自己,就会被第二次标记。
- 回收方法区:Java虚拟机规范没有要求在方法区进行垃圾收集,而且在方法区回收垃圾效率比较低。永久代的垃圾收集主要分为2部分,废弃常量和无用的类。JDK8移除了了永久代,相对的元空间metaspace会不会有gc来收集垃圾呢?GC默认会在元空间变满时对其进行回收,它还会动态增加(如果允许)分配给元数据内存。由于元空间的动态扩展(这是permgen无法做到的),启用CMSClassUnloadingEnabled,会使得GC在元空间的效率比永久代更好。
JVM:垃圾收集器与对象的"存活"问题的更多相关文章
- JVM垃圾收集器与内存分配策略(一)
在前面的Java自动内存管理机制(上)和Java自动内存管理机制(下)中介绍了关于JVM的一些基础知识,包括运行时数据区域划分和一些简单的参数配置,而其中也谈到了GC,但是没有深入了解,所以这里开始简 ...
- 7种JVM垃圾收集器特点,优劣势、及使用场景
今天继续JVM的垃圾回收器详解,如果说垃圾收集算法是JVM内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. 一.常见的垃圾收集器有3类 1.新生代的收集器包括 Serial PraNew Pa ...
- 【006】【JVM——垃圾收集器总结】
Java虚拟机学习总结文件夹 JVM--垃圾收集器总结 垃圾收集器概览 收集算法是内存回收的方法论.垃圾收集据是内存回收的详细实现.Java虚拟机规范中对垃圾收集器应该怎样实现没有规定.不同的厂 ...
- 第五章 JVM垃圾收集器(1)
说明:垃圾回收算法是理论,垃圾收集器是回收算法的实现,关于回收算法,见<第四章 JVM垃圾回收算法> 1.七种垃圾收集器 Serial(串行GC)-- 复制 ParNew(并行GC)-- ...
- 第六章 JVM垃圾收集器(2)
上一章记录了几种常见的垃圾收集器,见<第五章 JVM垃圾收集器(1)> 1.G1 说明: 从上图来看,G1与CMS相比,仅在最后的"筛选回收"部分不同(CMS是并发清除 ...
- JVM垃圾收集器(1)
此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 说明:垃圾回收算法是理论,垃圾收集器是回收算法的实现,关于回收算法,见<第四章 JVM垃圾回收算法& ...
- 5种JVM垃圾收集器特点和8种JVM内存溢出原因
先来看看5种JVM垃圾收集器特点 一.常见垃圾收集器 现在常见的垃圾收集器有如下几种: 新生代收集器: Serial ParNew Parallel Scavenge 老年代收集器: Serial O ...
- 7种 JVM 垃圾收集器特点、优劣势及使用场景(多图)
7种 JVM 垃圾收集器特点.优劣势及使用场景(多图) mp.weixin.qq.com 点击上方"IT牧场",选择"设为星标"技术干货每日送达! 一.常见垃 ...
- JVM垃圾收集器-Parallel Scavenge收集器
今天我给大家讲讲JVM垃圾收集器-Parallel Scavenge收集器 Parallel Scavenge收集器 Parallel Scavenge收集器也是一个新生代收集器,它也是使用复制算法的 ...
随机推荐
- 注释swap分区
grep "#" fstab |grep "swap" >/dev/null || sed -i 's/^.*swap/#&/g' fstab
- 建立 F103C8T6 HAL库 Makefile FreeRTOS 工程
F103C8T6 HAL库 Makefile FreeRTOS 工程模板 环境 该工程的开发平台为 ARM-GCC 工具链和 Make > arm-none-eabi-gcc -v gcc ve ...
- PHP获取当前网址路径
$_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] // 获取来源 function ...
- 网页兼容最新IE声明meta方法
第三种,总是使用最新版本文档模式. 以下是例子: <meta http-equiv="X-UA-Compatible" content="IE=edge" ...
- Java基础系列(1)- JDK、JRE、JVM
Java三大版本(Write Once:Run Anywhere) JavaSE:标准版 JavaME:嵌入式开发 JavaEE:E企业级开发 JDK.JRE.JVM JDK是开发工具包 JRE是编译 ...
- Shell系列(39) - dirname
dirname作用 dirname实际工作中常常是跟$0一起使用 用于获取当前运行脚本的绝对路径 这个命令要放在shell脚本中使用,在命令行使用意义不大 [yutao@master01 ~]$ di ...
- shell脚本中 /dev/null 的用途
/dev/null 是一个特殊的设备文件,它丢弃一切写入其中的数据 可以将它 视为一个黑洞, 它等效于只写文件, 写入其中的所有内容都会消失, 尝试从中读取或输出不会有任何结果,同样,/dev/nul ...
- SonarScanner扫描Maven项目使用说明
最近在学习使用sonar扫描代码,已经成功扫描python项目,而扫描java代码不成功. 在网上找到的扫描java项目文章,经过尝试之后也没有成功. 本人自己研究了sonar官方的使用说明文章,将其 ...
- CF1511G-Chips on a Board【倍增】
正题 题目链接:https://www.luogu.com.cn/problem/CF1511G 题目大意 给出\(n*m\)的棋盘上每一行有一个棋子,双方轮流操作可以把一个棋子向左移动若干步(不能不 ...
- MFC修改窗口图标
Visual Studio写MFC应用程序,默认的程序左上角图标是自带的(如下图),想要自己个性化定制一个新的图标则需要以下几个步骤. 一.准备工作(icon图标) 首先准备一个自己个性化定制的图片, ...