垃圾收集器CMS-JVM(十一)

Jvm类的创建过程包括类的加载,类的验证,准备,分析,初始化。

验证是不是.class文件。

准备过程则是先赋值初始化的值,并不是直接赋值原始值。

分析比较复杂,会有静态链接处理和动态链接处理。

最后就是类的初始化。

前面还有一个类的加载没说,类的加载则需要考虑到双亲委派,有三个类自带的核心加载器,bootStrap加载器,扩展加载器,app加载器,后面则有自定义加载器。

前面则说了垃圾收集器有复制,标记整理,标记清除。Serial,parallel,ParNew。

垃圾收集器ParNew-JVM(十)

  • CMS(Concurrent Mark Sweep)

cms收集器是一种考虑用户体验的收集器,以最短停顿为目的而设计的,它是第一个真正意义上实现用户线程与垃圾收集器并行工作。从mark sweep可以看出来它是标记清除算法,整体来说比前面介绍的都复杂点。

  1. 初始标记:暂停所有其他用户线程STW,并可达性算法记录GC roots直接能引用的对象,速度很快,用户基本无感知。

(因为速度必须要快,所以要STW,不然一直新增对象一直标记难以保证速率)

  1. 并发标记:并发标记就是开始遍历整个对象图的过程,这个过程耗时长,但不会暂停线程(不需要STW),垃圾线程和用户线程一起执行。

已经标记过的状态可能会发生变化,之前是垃圾变为对象,是对象的变为垃圾。

初始标记只标记一个直接引用对象,并发标记会从这个引用对象一直找,直到找完堆。

(为了用户体验,耗时长,所以不STW)

  1. 重新标记:重新标记主要是为了修改并发标记期间改变的对象状态,这个耗时会稍微长点,但远远比并发标记耗时短,这里主要用到三色标记里的增量更新算法
  2. 并发清理:开启用户线程,同时GC线程对未标记的做清理。新增的对象则标记为黑色(三色标记)不做任何处理。
  3. 并发重置:重置本次GC过程的标记数据。

其中并发标记占用时间最长,约占收集过程中百分之80的时间。

整个STW只有初始标记和重新标记部分,这两部分耗时非常低,所以用户体验基本无感知。

可以看出来cms是一个优秀的垃圾收集器,优点是:并发收集、停顿低。但他也是有缺点的:

  1. 对CPU资源敏感,会和服务抢资源。
  2. 浮动垃圾无法清理。(前面说了在并发标记和并发清理阶段是和用户线程并行的,这时候有新的用户对象则不会清理,会等到下次GC再清理)
  3. 因为他使用的标记清除,所以导致会有大量碎片,必须和JVM参数一起用

-XX:UseCMSCompactAtFullCollection

可以让jvm在执行完标记清除后整理碎片空间。

  1. 执行过程又不确定性,当垃圾还没收集完,用户线程又有新的对象进入,特别是并发阶段并发标记和并发清理,触发fullGC,这时候会触发concurrent mode failure,此时会进入全部的STW,用Serail old垃圾收集器。

(ParNew并发处理年轻代,CMS并发处理老年代,内存不够用,于是就用serial old单线程运行)

那么如何避免垃圾收集器用serial old收集呢?

1、启动CMS参数:-XX:+UseConcMarkSweep

(jdk1.8是可以用的,1.9之后则会提示过时(可以用),默认用的G1)

  1. -XX:+ConcGCThreads:并发线程数
  2. -XX:+UseCMSCompactAtFullCollection:fullGC之后减少碎片,整理。
  3. -XX:+CMSFullGCsBeforeCompaction:多少次fullGC才会压缩整理碎片,默认是0。
  4. -XX:+CMSInitiatingOccupancyFraction:当老年代使用达到该比例才出发fullGC,默认是达到百分92才fullGC。

(这个参数就是解决执行的不确定性,防止concurrent mode failture,保证剩余空间继续收集,如果系统大对象太多,则考虑调整小,调整为90,80或者75)

  1. -XX:+UseCMSInitiatingOccupancyOnly:只使用设定的回收阀值,

与-XX:+CMSInitiatingOccupancyFraction连用,如果不指定,则只在第一次生效,后续则会自动调整,比较智能化。

  1. -XX:+CMSScavengeBeforeRemark:配置之后,会在fullGC前启动一次minor GC,会提高效率,先减少一部分垃圾对象。
  2. -XX:+CMSParallellnitialMarkEnabled:表示初始化也并行,缩短STW。
  3. -XX:+CMSParallelRemarkEnabled:重新标记的时候也是多线程并行,缩短STW。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uni-app:scroll-view滚动盒子,实现横(纵)向滚动条

参照&#xff1a;scroll-view | uni-app官网 (dcloud.net.cn) 样式&#xff1a; 代码&#xff1a; <template><view class"box"><scroll-view scroll-x"true" class"scroll"><view class"box1"> <view c…

使用Vue + FormData + axios实现图片上传功能实战

前言 上节回顾 上一小节中,我们添加了Vue-router的路有数据,这些数据都将是后续实战课程中的真实路由数据了。同时引入了ElementUI的el-menu做为左侧菜单的组件,但本专栏的特点就是遇到第三方功能和组件,自己尽量也要实现一遍,所以,在文章末尾又自己实现了一个tg-menu的…

Docker 安装 Nginx,并实现负载均衡

1、获取 nginx 的镜像 # 默认是latest版本docker pull nginx 2、运行 nginx 容器 docker run --name nginx-80 -p 80:80 --rm -d nginx# --name nginx-80 设定容器的名称# -p 80:80 端口进行映射&#xff0c;将本地的80端口映射到容器内部的80端口# --rm 表示容器退出后直接…

gogs的自定义配置

在 GOGS 下载并安装后&#xff0c;在程序目录下建立一个custom/conf/app.ini的配置文件&#xff0c;内容如下&#xff1a; APP_NAME Gogs # APP名字 RUN_USER git # 启动用户&#xff0c;设置后只能以此账号启动gogs RUN_MODE prod[database] DB_TYPE mysql HOST 1…

热门二叉树面试题

606. 根据二叉树创建字符串 - 力扣&#xff08;LeetCode&#xff09; 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 "()" 表示&a…

SpringCloud整合Sentinel

文章目录 1、Sentinel介绍2、安装Sentinel控制台3、微服务整合Sentinel 1、Sentinel介绍 阿里开源的流量控制组件官网&#xff1a;https://sentinelguard.io/zh-cn/index.html承接了阿里双十一大促流量的核心场景&#xff0c;如秒杀、消息削峰填谷、集群流量控制、实时熔断下游…

vue+relation-graph绘制关系图实用组件

先在终端执行命令 vue create relationgraph创建一个vue2的项目 然后在编辑器中打开新创建的项目 在终端中执行命令 npm install relation-graph --save引入依赖 这样 我们relation-graph就进来了 然后 我们在需要使用的组件中编写代码如下 <template><div>&…

MyBatis 系列2 -- 增加、删除、修改操作

1. 前言 上一系列介绍了MyBatis的背景,以及为什么我们使用MyBatis进行操作数据库,还实现了使用MyBatis进行查询数据库的,接下来我们继续将使用MyBatis操作数据库的其他三种基本操作进行总结. 目录 1. 前言 2. 增加用户操作 3. 修改用户操作 4. 删除用户操作 5. 多表查询操…

3. CSS-定位

absolute和relative依据什么定位? relative依据自身定位,absolute 依据最近一层的定位元素定位 (定位元素是指开启了absolute relative fixed的父元素,没有就是根元素body) 居中对齐的实现方式:详情看这篇博客

webpack-theme-color-replacer+elementui自定义配置主题色

webpack-theme-color-replacer原理是通过获取到配置数组里的颜色值&#xff0c;在触发换色方法时&#xff0c;elementui使用的颜色值存在与配置表中颜色一致的颜色&#xff0c;则改颜色会被替换成新的颜色值。 若是自定义的css文件&#xff0c;需要配置css文件路径 若是需要修…

如何应对黑产进行验证图片资源遍历

第一期&#xff0c;我们分享的攻防点是&#xff1a;验证图片资源遍历。 “遍历”指黑产通过穷举法获得所有验证码图片的答案&#xff0c;以便能在未来彻底无视验证码。由于验证码主要是通过图片语义答案来识别人机&#xff0c;因此攻破这层防御最有效的方式就是遍历该验证码图…

【数据结构】二叉树的前中后序遍历(C语言)

文章目录 什么是二叉树树相关的概念树的表示形式特殊的二叉树如何创造出一棵二叉树二叉树的遍历先序遍历(前序遍历)中序遍历后序遍历 总结 什么是二叉树 [二叉树] 顾名思义就是有两个分支节点的树&#xff0c;不仅如此&#xff0c;除了叶子外的所有节点都具有两个分支节点&…

matlab入门

命名规则&#xff1a; clc&#xff1a;清除命令行的所有命令 clear all&#xff1a;清除所有工作区的内容 注释&#xff1a;两个% 空格 %% matlab的数据类型 1、数字 3 3 * 5 3 / 5 3 5 3 - 52、字符与字符串 s a %% 求s的ascill码 abs(s) char(97) num2str(65) str I…

curl: (56) Recv failure : Connection reset by peer

文章目录 背景原因可能如下1. 服务器端关闭了连接2. 网络问题3. 防火墙或代理问题4. 服务器负载过高 解决办法 背景 docker容器里有http服务&#xff0c;今天在docker容器重启时&#xff0c;去调用http接口&#xff0c;出现了以下错误&#xff1a; curl: (56) Recv failure :…

记一次ruoyi中使用Quartz实现定时任务

一、首先了解一下Quartz Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目&#xff0c;它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个&#xff0c;百个&#xff0c;甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标…

Deepin/UOS Linux 桌面自定义 IDEA/DataGrip 应用程序图标

在 $HOME/Desktop目录下编辑 vim jetbrains.intelij.idea.desktop [Desktop Entry] TypeApplication NameIntelij IDEA Icon/opt/module/idea-IU-203.8084.24/bin/idea.png Exec/opt/module/idea-IU-203.8084.24/bin/idea.sh Terminalfalse CategoriesDevelopment;IDE;vim je…

自动化运维工具——Ansible学习(二)

目录 一、handlers和notify结合使用触发条件 1.新建httpd.yml文件 2.复制配置文件到ansible的files目录中 3.卸载被控机已安装的httpd 4.执行httpd.yml脚本 5.更改httpd.conf配置文件 6.使用handlers 7.重新执行httpd.yml脚本 8.检查被控机的端口号是否改变 9.handle…

Block

文章目录 前言Block本质Block循环引用解决循环引用1.__weak __strong协作2.__block3.参数传递 Block中对象的引用计数Block Copy__blockBlock的分类 前言 之前学过Block了&#xff0c;那就在学学 之前学习Block的博客 参考 提示&#xff1a;以下是本篇文章正文内容&#xff…

AtcoderABC249场

A - JoggingA - Jogging 题目大意 高桥和青木一起慢跑&#xff0c;高桥每隔 ACAC 秒钟走 BB 米&#xff0c;然后休息 CC 秒钟&#xff0c;青木每隔 DFDF 秒钟走 EE 米&#xff0c;然后休息 FF 秒钟。现在已经过去了 XX 秒钟&#xff0c;问谁跑得更远。 思路分析 模拟来解决这…

【广州华锐互动】智慧交通3D可视化交互平台

智慧交通3D可视化交互平台由广州华锐互动开发&#xff0c;是一种基于现代科技的智能交通管理系统&#xff0c;它能够实现对车站内部人员和车辆的实时监控和管理。该平台采用了先进的三维可视化技术&#xff0c;将车站内部的结构和设备以立体、直观的方式呈现在用户面前&#xf…