【JVM调优】Day01:Garbage的概念、垃圾回收的算法(标记清除、拷贝、标记压缩)、各种垃圾回收器(Serial、Parallel、CMS并发)及存在的问题
〇、前言
简历写上:熟悉GC常用算法,熟悉常见垃圾回收器、具有实际JVM调优实战经验
瞬间涨3k

一、什么是garbage
Java中垃圾回收器自动进行垃圾回收,不用自己回收
new 对象在内存中,c++/c手动删除,而java无需要写代码
判断什么是垃圾:
方法1:有无引用指向--reference count,是有问题的,无法解决循环引用(引用计数在Python中有使用)
方法2:从根上能找到的对象,即从main函数能找到的对象--根可达算法
二、GC算法-找到垃圾如何清除(提出五十多年未变过)

1、标记清除算法Mark-Sweep

缺陷:碎片化现象很严重
2、拷贝算法Copying
无论空间多大,全部空间一分为二
在某一个空间内调用程序,当程序调用结束,选择有用的对象,放到另一半
并将当前部分的那些没有用的对象,全部回收

优势:效率高,一次性清除很大的空间
缺陷:浪费空间,有一半用不了
3、标记整理Mark-Compact
标记的同时,把有用的对象排到前面
一边找,一遍标记,一边整理

三、垃圾回收器Garbage Collector
1、概述图示

用虚线连接,表示两个垃圾回收器有联系,可以配合使用
往往是上下配对
2、最古老的垃圾回收器:Serial-连续的,序列的,单线程的


Serial:单线程,Stop-the-world,简称STW,进行垃圾回收的时候,业务线程全部停止
垃圾回收开始干活,java程序变卡
对网站的影响:对用户的反馈不友好,容易出现卡顿现象
调优:STW的时间要短,让用户迅速得到反馈
3、内存变大时,可以多加几个线程-Parallel Scavenge(并行)

线程数量可以增多,但不能无限增多
当内存很多时,进行STW,仍然会浪费很多时间,多线程卡顿时间也会变长
实际1.8生产环境默认:PS+PO
Oracle jdk11收费,Open Jdk免费

调优:可以使用G1(jdk1.9后的默认)
4、Concurrent Mark Sweep,CMS-并发

(1)什么是并发:当垃圾回收线程和正在工作的线程同时开始工作时,叫做并发

一边丢线团,一边清理线程
小线团就是new出来的多个对象
从CMS之后都是并发
(2)存在的问题1
小线团之间会存在关联,过程很乱
业务线程不断运行,将其标记为不是垃圾,但下一秒就变成垃圾了,不再有引用
而垃圾回收线程从根上寻找时,两个线程在不同的CPU上运行,但垃圾回收却将其标记为有用,不会将其作为垃圾进行回收
会产生浮动垃圾:垃圾在这次回收中没有被清理掉,只能在下次回收
(3)存在的问题2
回收时标记为垃圾
但工作线程将其与现有对象建立连接
被回收后,再去访问,得到的是空值
(4)怎么建立连接-找到没有引用的对象
是算法带来的问题
标记过程分为多个阶段,标记完后会继续--三色标记算法
【JVM调优】Day01:Garbage的概念、垃圾回收的算法(标记清除、拷贝、标记压缩)、各种垃圾回收器(Serial、Parallel、CMS并发)及存在的问题的更多相关文章
- [转]JVM调优总结:一些概念
JVM调优总结:一些概念 原文出处: pengjiaheng 数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变 ...
- JVM调优总结:一些概念
数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本身, ...
- jvm 调优(1)概念
数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本身, ...
- JVM调优基础到进阶
GC和GC Tuning GC的基础知识 1.什么是垃圾 C语言申请内存:malloc free C++: new delete c/C++ 手动回收内存 Java: new ? 自动内存回收,编程上 ...
- JVM调优的几种策略
一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从J ...
- JVM调优方法
目 录 目 录 I 诠释JVM调优 1 第1章 JVM内存模型及垃圾收集算法 1 1.1 根据Java虚拟机规范,JVM将内存划分为 1 1.2 垃圾回收算法 1 第2章 内存泄漏及解决方法 2 2. ...
- JVM调优总结(九)-新一代的垃圾回收算法
垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限.但是他无法解决的一个问题,就是Full GC所带来的应用暂停.在一些对实时性要 ...
- java虚拟机学习-JVM调优总结-新一代的垃圾回收算法(11)
垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限.但是他无法解决的一个问题,就是Full GC所带来的应用暂停.在一些对实时性要 ...
- java虚拟机学习-JVM调优总结-分代垃圾回收详述(9)
为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...
- JVM调优总结(4):分代垃圾回收
为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...
随机推荐
- CentOS7.X yum安装MySQL8.0 数据表不区分大小写切换默认存储路径
查看当前系统版本的详细信息 # cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) yum源下载 地址:https://dev.m ...
- day05-离线留言和离线文件
多用户即时通讯系统05 4.编码实现04(拓展) 拓展功能: 实现离线留言,如果某个用户不在线 ,当登陆后,可以接收离线的消息 实现离线发文件,如果某个功能没有在线,当登录后,可以接收离线的文件 4. ...
- 关于使用AWS上的RHEL-8.x/Redhat系统使用自己单独购买的Redhat官网license导致的yum命令报错处理
我们在aws上使用市场提供的RHEL-8.x系统后,license相关的都是由aws官网一起提供了 最近笔者将aws上一台作过系统加固的RHEL-8.x导出到自己本地DC环境,也注册了Redhat官网 ...
- .Net WebApi 中的 FromBody FromForm FromQuery FromHeader FromRoute
在日常后端Api开发中,我们跟前端的沟通中,通常需要协商好入参的数据类型,和参数是通过什么方式存在于请求中的,是表单(form).请求体(body).地址栏参数(query).还是说通过请求头(hea ...
- 洛谷P2860 [USACO06JAN]Redundant Paths G (tarjan,边双缩点)
本题的大意就是加最少的边使得图成为边双. 多举例子,画图分析可得:最终答案就是叶子节点(度数为1的点)的个数加1在除以2. 那么我们的目的就转化为找叶子节点: 首先通过tarjan找到割边,再dfs将 ...
- 驱动开发:内核枚举PspCidTable句柄表
在上一篇文章<驱动开发:内核枚举DpcTimer定时器>中我们通过枚举特征码的方式找到了DPC定时器基址并输出了内核中存在的定时器列表,本章将学习如何通过特征码定位的方式寻找Windows ...
- IDEA插件MyBatisCodeHelper-Pro的破解与使用
0.前言 本文中的IDEA版本是2020.3,使用的插件版本是MyBatisCodeHelper-Pro 2.8.9,3.0+版本目前没找到激活的方式 和本文插件类似的还有mybatisX,但我不喜欢 ...
- Ansible 批处理实战
软件简介 Ansible 是一款自动化运维工具,基于 Python 开发,集合了众多运维工具(puppet.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功 ...
- 京东云开发者| Redis数据结构(二)-List、Hash、Set及Sorted Set的结构实现
1 引言 之前介绍了Redis的数据存储及String类型的实现,接下来再来看下List.Hash.Set及Sorted Set的数据结构的实现. 2 List List类型通常被用作异步消息队列.文 ...
- Vue3 企业级优雅实战 - 组件库框架 - 1 搭建 pnpm monorepo
前两篇文章分享了基于 vite3 vue3 的组件库基础工程 vue3-component-library-archetype 和用于快速创建该工程的工具 yyg-cli,但在中大型的企业级项目中,通 ...