GC 基础

如何定位垃圾

1. 引用计数法

为对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。

在两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收。正是因为循环引用的存在,因此 Java 虚拟机不使用引用计数算法。

2. 根可达算法(可达性分析算法)

以 GC Roots 为起始点进行搜索,可达的对象都是存活的,不可达的对象可被回收

Java 虚拟机使用该算法来判断对象是否可被回收,GC Roots 一般包含以下内容:

  • 虚拟机栈中局部变量表中引用的对象
  • 本地方法栈中 JNI 中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中的常量引用的对象

标记-清除算法 (mark - sweep)

在这里插入图片描述

标记阶段,会将要回收的算法进行标记(先判断是否要进行回收)
在清除阶段,会进行对象回收并取消标志位,另外,还会判断回收后的分块与前一个空闲分块是否连续,若连续,会合并这两个分块。回收对象就是把对象作为分块,连接到被称为 “空闲链表” 的单向链表,之后进行分配时只需要遍历这个空闲链表,就可以找到分块。

缺点

  • 标记和清除过程效率都不高
  • 会产生大量不连续的内存碎片,导致无法给大对象分配内存

标记-压缩 (mark - compact)

在这里插入图片描述

在标记的基础上,将未标记的对象(块)(不回收的存活对象)都向一端移动,然后清除标记的块。

优点

  • 不会产生内存碎片

缺点

  • 需要移动大量对象,处理效率比较低

拷贝算法 ( copying )

在这里插入图片描述
将内存划分为大小相等的两块,每次只使用其中一块,当这一块内存用完了就将还存活的对象复制到另一块上面,然后再把使用过的内存空间进行一次清理。

  • 主要不足是只使用了内存的一半。

现在的商业虚拟机都采用这种收集算法回收新生代,但是并不是划分为大小相等的两块,而是一块较大的 Eden 空间和两块较小的 Survivor 空间,每次使用 Eden 和其中一块 Survivor。在回收时,将 Eden 和 Survivor 中还存活着的对象全部复制到另一块 Survivor 上,最后清理 Eden 和使用过的那一块 Survivor。

HotSpot 虚拟机的 Eden 和 Survivor 大小比例默认为 8:1,保证了内存的利用率达到 90%。如果每次回收有多于 10% 的对象存活,那么一块 Survivor 就不够用了,此时需要依赖于老年代进行空间分配担保,也就是借用老年代的空间存储放不下的对象。

  • 存放不下的对象会存放在老年代。

JVM 内存分代模型(用于分代垃圾回收算法)

部分垃圾回收器使用的模型

一般将堆分为新生代和老年代

  • 新生代使用:复制算法

  • 老年代使用:标记 - 清除 或者 标记 - 压缩 算法 (g1 使用 copy算法)

  • 永久代 (1.7) / 元数据(1.8)

    1. 永久代和元数据都是存放 class 的
    2. 永久代必须指定大小限制。元数据可以设置也可以不设置,无上限(受限于物理内存)
    3. 字符串常量 1.7版本存储在 永久代,1.8版本存储在 堆 中。
    4. 方法区是逻辑上的概念, 1.7时 方法区对应 永久代,1.8时 方法区对应 元数据。

在这里插入图片描述
新生代

新生代 = 1个eden 区 + 2 个 survivor 区 ,一次YGC(对新生代堆进行gc,频率比较高)后,新生代大部分对象都将被回收,所以使用copy算法,将不回收的对象丢到 一个 survivor 中,然后清除另外一个survivor (如果有的话)和 eden。多次YGC之后,年龄足够(不同的回收器年龄不同 CMS 6 岁,有些回收器是15)的对象 进入 老年代。(拷贝不下的对象直接丢给老年代)
默认 新 new 的对象 会在 eden 区,放不下的话直接丢入 老年代 。
FGC = Minor GC

老年代

  1. 老年代存放的是顽固分子(一直没有被回收的),以及新生代放不下的。
  2. 老年代满了 FGC(Full GC = YGC + old GC ,FGC = Major GC)

GC Tuning (Generation GC调优)

  1. 尽量减少 FGC

垃圾回收器

在这里插入图片描述

  1. Serial 新生代 串行回收

  2. Parallel Scavenge 新生代 并行回收

  3. ParNew 新生代 配合CMS的并行回收 (Parallel Scavenge 无法配合 CMS)。

  4. Serial Old 老年代 串行回收

  5. Parallel Old 老年代 并行回收

  6. CMS(Concurrent Mark Sweep)老年代的,并发的 垃圾回收和应用程序同时运行,降低STW(Stop The World)的时间(200ms)

    1. CMS(Concurrent Mark Sweep),Mark Sweep 指的是标记 - 清除算法。

    分为以下四个流程:

    • 初始标记:仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快,需要停顿。
    • 并发标记:进行 GC Roots Tracing 的过程,它在整个回收过程中耗时最长,不需要停顿。
    • 重新标记:为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,需要停顿。
    • 并发清除:不需要停顿。
      在整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,不需要进行停顿。

    具有以下缺点:

    • 吞吐量低:低停顿时间是以牺牲吞吐量为代价的,导致 CPU 利用率不够高。
    • 无法处理浮动垃圾,可能出现 Concurrent Mode Failure。浮动垃圾是指并发清除阶段由于用户线程继续运行而产生的垃圾,这部分垃圾只能到下一次 GC 时才能进行回收。由于浮动垃圾的存在,因此需要预留出一部分内存,意味着 CMS 收集不能像其它收集器那样等待老年代快满的时候再回收。如果预留的内存不够存放浮动垃圾,就会出现 Concurrent Mode Failure,这时虚拟机将临时启用 Serial Old 来替代 CMS。
    • 标记 - 清除算法导致的空间碎片,往往出现老年代空间剩余,但无法找到足够大连续空间来分配当前对象,不得不提前触发一次 Full GC。
  7. G1 (STW 10ms)

  8. ZGC (STW 1ms 都可以PK c++ )

  9. Shenandoah
    10.Eplison

JDK1.8 默认的垃圾回收: Parallel Scavenge + Parallel Old

JVM调优第一步,了解生存环境下的垃圾回收器组合

  • JVM的命令行参考
  • JVM参数分类

    标准 : - 开头,所以的HotSpot都支持
    非标准:-X 开头 ,特定版本HotSpot支持特定命令
    不稳定: -XX 开头,下个版本可能取消

比如 java -version 就是标准命令
输入 java -X 可以看到 非标准命令列表
在这里插入图片描述
输入 java -XX:+PrintFlagsFinal 可以设置值(最终生效值)
java -XX:+PrintFlagslnitial 默认值
java -XX:+PrintCommandLineFlags 命令行参数
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

离线部署 CDH 6.2 及使用 CDH 部署 Hadoop3 大数据平台集群服务

Cloudera Manager Cloudera Manager 分为两个部分:CDH和CM。 CDH是Cloudera Distribution Hadoop的简称,顾名思义,就是cloudera公司发布的Hadoop版本,封装了Apache Hadoop,提供Hadoop所有的服务,包括HDFS…

玛酷机器人课程视频_建阳玛酷机器人丨2019WRO机器人比赛凯旋而归!

2019年7月福州WRO青少年机器人交流RA 7月27-28日,经过角逐, WRO华南赛区(福州站)在福州中加学校顺利落幕。 本次大赛设置了山火营救、无人速递、城市救援、RA常规赛、足球世界杯、WEDO常规项目、WEDO小手拼出大世界等七个单项比赛。 …

kindeditor图片批量上传失败问题

2019独角兽企业重金招聘Python工程师标准>>> 问题:在演示版中批量上传没有问题,放到我们后台系统中,就上传不成功。 排查:逐步验证发现根本没有http到upload上传文件中,往上找。。。终于碰到是后台管理员验…

presto集群安装

presto集群安装 整合hive 张映 发表于 2019-11-07 分类目录: hadoop/spark/scala 标签:hive, presto Presto是一个运行在多台服务器上的分布式系统。 完整安装包括一个coordinator(调度节点)和多个worker。 由客户端提交查询&…

wps 复制流程图_简单三步,用WPS轻松完成一个又大气又好看的流程图!

流程图是工作中经常需要用到的图形,使用 WPS 可以方便地创建流程图。创建的流程图保存在云文档后,可以随时插入 WPS 的其他组件。新建流程图文件流程图可以从 WPS 的其他组件中创建,如 WPS 文字、WPS 表格等,也可以单独创建。流程…

Tez 0.9安装部署+hive on tez配置 + Tez-UI

Tez说明 将xyz替换为您正在使用的tez发行版号。例如0.5.0。对于Tez版本0.8.3和更高版本,Tez需要Apache Hadoop版本为2.6.0或更高版本。对于Tez版本0.9.0及更高版本,Tez需要Apache Hadoop版本为2.7.0或更高版本。 关于版本 1.Hadoop 2.7.0(我…

启动成功浏览器显示不了_移动端利用chrome浏览器在PC端进行调试方法

由于最近工作中遇到需要在电脑上调试手机端的功能和样式,之前也没有遇到过,所以就各种百度和试验。最后终于功夫不负有心人,成功了。(那一刻心情真滴很鸡冻啊~~~~~~~~~)。所以暂时记录下来。以免鸡冻过度再给忘记了。好,接下来就是…

在maven本地仓库导入jar包

# Dfile jar包所在位置 DgroupId 指定groupId DartifactId 指定artifactId Dversion 指定版本 mvn install:install-file -DfileC:\Users\zlf\Desktop\mybatis-main\target\mybatis.jar -DgroupId"cn.bugstack.middleware" -DartifactIdmybatis -Dversion"1.0.…

Flink完全分布式集群安装

Flink支持完全分布式模式,这时它由一个master节点和多个worker节点构成。在本节,我们将搭建一个如下的三个节点的Flink集群。 一、Flink集群安装、配置和运行 Flink完全分布式集群搭建步骤如下: 1、配置从master到worker节点的SSH无密登录&…

一个4体低位交叉的存储器_前交叉韧带术后关节粘连的康复策略

ACL术后粘连的康复现状在国外,前交叉韧带ACL重建术后关节粘连的发生率为1%。在国内,由于多数医院在行前交叉韧带重建术后,对患者缺少及时、系统、科学的康复治疗,大部分患者由此易发生关节粘连,而往往关节粘连造成的功…

Maven多模块打包

在类似如下的场景中进行打包 lottery-rpc 将出现报错&#xff0c;原因是没办法将 lottery-common 一起打包进去。 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://…

hadoop 2.6.5 + hive 集群搭建

Hadoop 搭建&#xff1a;https://blog.csdn.net/sinat_28371057/article/details/109135056 hive 搭建 1. 系统环境 centos 7.3 Hadoop 2.7.3 jdk 1.8 MySQL安装在master机器上&#xff0c;hive服务器也安装在master上 hive版本: https://mirrors.cnnic.cn/apache/hive/hive…

光耦和开关频率

为什么80%的码农都做不了架构师&#xff1f;>>> TLP250&#xff0c;HCPL3120都可以 直接驱动小型IGBT&#xff0c;不需要加推挽管 6N137&#xff0c;没有推挽&#xff0c;OC上拉&#xff0c;到最后可能驱动速度还上不去 我们6N137&#xff0c;是用来驱动IPM的 电压…

配置babel_Babel 7 下配置 TypeScript 支持

本文将展示&#xff0c;如何使用 babel/preset-typescript 和 babel/preset-env 配置一个最小但完整的编译环境&#xff0c;打包工具使用 webpack4.41.2插件集 preset-typescriptpreset-typescript 是 Babel 提供的预设插件集之一&#xff0c;Babel 官方对其有一篇简短的介绍&a…

jQuery 计时器(jquery timers)简单应用

jquery timers 代码&#xff08;版本1.2&#xff09;&#xff1a; jquery timers /** * jQuery.timers - Timer abstractions for jQuery * Written by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com) * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/). …

服务器改用ssh文件登录

首先在服务器生成密钥 ssh-keygen -t rsa -b 4096 将 id_rsa.pub的内容导入到 authorized_keys文件中&#xff0c;这样远程登录时用id_rsa文件登录会与authorized_keys中的文件进行验证。 cat id_rsa.pub >> authorized_keys 关闭ssh密码登录 在 /etc/ssh 下的sshd_conf…

Spark集群完全分布式安装部署

Spark集群完全分布式安装部署下载安装配置Spark 1spark-envsh配置2slaves配置3profile配置复制到其他节点测试总结 Spark集群完全分布式安装部署 本文中所提到的Spark集群所用的系统环境是Centos6.5&#xff0c;共4个节点&#xff0c;前提是Hadoop、JDK都已经安装配置好了&…

抛出错误_不用try catch,如何机智的捕获错误

这是多个feature组合使用后实现的神奇效果&#xff0c;在React源码中被广泛使用。当我读源码看到这里时&#xff0c;心情经历了&#xff1a;懵逼 -- 困惑 -- 沉思 -- 查文档 -- 豁然开朗看完此文&#xff0c;相信你也会发出感叹&#xff1a;还能这么玩&#xff1f;起源我们知道…

使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建

使用Jenkins从gitlab上拉取代码&#xff0c;使用ssh。 创建Jenkins服务器的SSH密钥对&#xff1b;为相应的Gitlab用户添加密钥对的公钥&#xff0c;相当于Jenkins拉取代码时&#xff0c;使用的是该Gitlab用户&#xff0c;拥有其相应的代码克隆权限&#xff1b;Jenkins添加密钥…

CentOS7.0下Hadoop2.7.3的集群搭建

集群服务器规划 使用3台CentOS-6.8虚拟机进行集群搭建 服务ip主机名称用户HDFSYARNhadoop1192.168.1.40hadoop1root NameNode,Datenode,SecondaryNameNodeResourceManager,NodeManager,hadoop2192.168.1.39hadoop2rootDatenodeNodeManagerhadoop3192.168.1.38hadoop3rootDate…