jvm垃圾处理

news2024/11/27 12:40:56

1.什么是垃圾

垃圾:没有引用指向的一个对象或者多个对象循环引用但是没有引用指向

申请内存方式

c语言:malloc free
c++:new delete
java:new 对象

2、垃圾是如何产生的

垃圾一般在发生引用传递时产生。一块堆内存可以被不同的栈内存所引用,每一块栈内存都会表示一个堆内存的地址
信息,并且一块栈内存只能保存一个堆内存的地址信息,所以当一块栈内存已经保存了一个堆内存的地址信息,
这个时候如果想要改变这个栈内存的引用指向时,就必须抛弃原来保存的地址信息,再保存新的堆内存的地址信息,
而这个时候就发生了引用传递。

3、垃圾定位算法

1.引用计数
2.根可达算法:由根对象引用开始自顶向下寻找,找不到的对象就是垃圾对象

4、垃圾回收算法

Mark_Sweep(标记清除)
图片: https://uploader.shimo.im/f/AzE7G93NnsP6N0AZ.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NzA5MjIzMDYsImZpbGVHVUlEIjoiOE5rNk1venpNNXVibjBxTCIsImlhdCI6MTY3MDkyMjAwNiwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo2ODc4NjUwN30.rnL_2NzMIKSEbYnhoH39Q5GiOxYjsXRmAIhCd3QsO8s

绿色代表没有使用,灰色代表正在使用,黑色代表垃圾部分,标记清除就是找出垃圾把其标记为非垃圾区域
缺点:位置不连续 产生碎片
Copying(拷贝)
图片: https://uploader.shimo.im/f/Ioyjc4H9RlkCzbfy.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NzA5MjIzMDYsImZpbGVHVUlEIjoiOE5rNk1venpNNXVibjBxTCIsImlhdCI6MTY3MDkyMjAwNiwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo2ODc4NjUwN30.rnL_2NzMIKSEbYnhoH39Q5GiOxYjsXRmAIhCd3QsO8s

缺点:没有碎片,浪费空间(内存的拷贝速度是非常快的)
Mark-Compact(标记压缩)
图片: https://uploader.shimo.im/f/7XRMm9qdqbp0oOaJ.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NzA5MjIzMDYsImZpbGVHVUlEIjoiOE5rNk1venpNNXVibjBxTCIsImlhdCI6MTY3MDkyMjAwNiwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo2ODc4NjUwN30.rnL_2NzMIKSEbYnhoH39Q5GiOxYjsXRmAIhCd3QsO8s

缺点:没有碎片,效率偏低(与copy一样需要进行对象地址的挪动,这就涉及到线程同步,线程同步的开销就非常大)

5、jvm内存分代模型

1.部分垃圾回收器使用模型

2.新生代+老年代+永久代(1.7以前)/元数据区(1.8 Metaspace)

永久代与元数据区的比较

永久代必须指定大小限制,所以后面当内存满了就会成为性能的上限
元数据可以设置也可以不设置,无上限(受限于物理内存)
字符串常量1.7-永久代 1.8-放在堆中
MethodArea逻辑概念-永久代、元数据

3.新生代=Eden+2个suvivor区
图片: https://uploader.shimo.im/f/0cZLqOZRwORHm5KR.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NzA5MjIzMDYsImZpbGVHVUlEIjoiOE5rNk1venpNNXVibjBxTCIsImlhdCI6MTY3MDkyMjAwNiwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo2ODc4NjUwN30.rnL_2NzMIKSEbYnhoH39Q5GiOxYjsXRmAIhCd3QsO8s

YGC回收后,eden区中大多数对象会被回收,活着的进入s0
再次YGC,eden+s0中活着的对象进入s1;
再次YGC,eden+s1中活着的对象进入s0(s0 与s1不断交换)

出现以下两种情况会进入老年代
年龄足够—>老年代
s区装不下–>老年代

问题一:为什么eden:s0:s1=8:1:1 :
答:eden中90%的对象会被回收,10%进入s区中
问题二:为什么有两个s区:
答:为了提高GC的效率,分开管理刚new出来的对象,当前没有被YGC清理的对象以及需要进入老年代的对象
4、老年代存储顽固分子,老年代满了 进行FGC(full gc)

5.GC Tuning(gc调优)

1、尽量减少FGC
2、minorGC = YGC
3、MajorGC = FGC

6、常见的垃圾回收器

图片: https://uploader.shimo.im/f/aNJ5oDlQMacVi6qP.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NzA5MjIzMDYsImZpbGVHVUlEIjoiOE5rNk1venpNNXVibjBxTCIsImlhdCI6MTY3MDkyMjAwNiwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo2ODc4NjUwN30.rnL_2NzMIKSEbYnhoH39Q5GiOxYjsXRmAIhCd3QsO8s
1.Serial年轻代 单线程串行回收
2.PS年轻代 多个线程并行回收
3.ParNew 年轻代 配合CMS的并行回收
4.SerialOld Serial回收算法放在老年代
5.ParallOld PS并行回收算法放在老年代
6.ConcurrentMarkSweep 老年代 并发的,垃圾回收和应用程序同时运行,降低STW(Stop the word 垃圾回收停顿时间)的时间(200ms左右)
7.G1(garbage first garbage collector)(10ms)
8.ZGC(1ms) PK c++
9.Shenandoah
10.Eplison
大多数gc调优是1,2,4,5,原因:1.8默认垃圾回收器 PS+ParalleOld

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

jvm的命令参数参考: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
jvm的命令类
标准命令:-开头,所有的HotSpot都支持
非标准命令:-X开头,特定版本HotSpot支持特定命令
不稳定命令:-XX开头,下个版本可能取消
图片: https://uploader.shimo.im/f/vzaht8LO8amUchpt.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NzA5MjIzMDYsImZpbGVHVUlEIjoiOE5rNk1venpNNXVibjBxTCIsImlhdCI6MTY3MDkyMjAwNiwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo2ODc4NjUwN30.rnL_2NzMIKSEbYnhoH39Q5GiOxYjsXRmAIhCd3QsO8s

-XX:+PrintCommandLineFlags 查询项目中有哪些参数
-XX:+PrintFlagsFinal最终参数值
-XX:+PrintFlagsInitial 默认参数值

8.从线程角度理解垃圾回收

CMS回收的四个过程:初始标记、并发标记、重新标记、并发清理
图片: https://uploader.shimo.im/f/IXxVa0EuLr2Zu7oj.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NzA5MjI0MTcsImZpbGVHVUlEIjoiV3IzRFZkTnhsNGZtVjdrSiIsImlhdCI6MTY3MDkyMjExNywiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo2ODc4NjUwN30.39WEhSdiVeKcpHE4PJMdYHDBFW75CgbfFrk38jWST3E

(蓝色箭头代表程序或者程序的进程线程,黄色代表垃圾回收线程,两条竖线之间表示STW)
初始对象:标记root对象产生的对象,(遍历后找不到的为垃圾对象)
并发标记:找到根上能够联系到的对象,并开始快速标记,可能会漏标,可能会有一个新的引用指向以前垃圾对象(变为不是垃圾)
重新标记:都STW,然后对漏标和变化后的对象进行标记
并发清理:开始垃圾回收,这个过程可能会产生新的垃圾成为浮动垃圾floating garbage,这些垃圾下次继续重复上面四个过程

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

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

相关文章

DBCO-PEG-SPDP,SPDP-PEG-DBCO,DBCO-聚乙二醇-3-(2-吡啶二硫代)丙酸N-羟基琥珀酰亚胺

一、试剂基团反应特点(Reagent group reaction characteristics): DBCO-PEG-SPDP中无铜点击反应一直是无催化剂生物共轭的有力工具。 DBCO试剂在水性缓冲液中具有稳定性,可用于以高特异性和反应性标记叠氮化物修饰的生物分子&…

【知识图谱】(task3)知识图谱的存储和查询

note 用图数据库的场景: 高性能关系查询:需要快速遍历许多复杂关系的任何用例,如欺诈检测,社交网络分析,网络和数据库基础设施等;模型的灵活性:任何依赖于添加新数据而不会中断现有查询池的用例…

Linux Kernel 6.0 CXL Core Regs.c 详解

前言 CXL 是一个比较新的技术,所以我研究的内核源码是选了当前比较新的内核版本 linux 6.0。打算将内核关于 CXL 的驱动进行解析一遍,一步一步慢慢来。 在阅读之前,希望读者能有一定的 PCIe 基础知识,精力有限,不能把…

C++ 不知算法系列之聊聊希尔、归并排序算法中的分治哲学

1. 前言 排序算法中,冒泡、插入、选择属于相类似的排序算法,这类算法的共同点:通过不停地比较,再使用交换逻辑重新确定数据的位置。 希尔、归并、快速排序算法也可归为同一类,它们的共同点都是建立在分治思想之上。把…

Linux基本工具——gcc/g++与make/Makefile

Linux编译器,项目构成工具gcc/g程序翻译过程选项的含义动态链接静态链接如何识别静态链接和动态链接Linux项目自动化构建工具——make/Makefilemake/Makefile是什么make/Makefile的使用伪目标make/makefile推导过程gcc/g 程序翻译过程 预处理(去掉注释…

当了10年程序员,我开窍了

有人说,程序员的高收入和工作年限成正比,认为自己的薪资应该如此计算: private static boolean 计算工资() { //years工作时长(年) int years 5; while(years-- > 0){ 做项目(); 团建活动(); 涨工资(); 拿年终奖(); } return 跳槽() &…

12、后渗透测试--meterpreter使用

Post后渗透模块&#xff1a;在meterpreter > 中我们可以使用以下的命令来实现对目标的操作。一、基本系统命令 sessions # sessions –h 查看帮助sessions -i <ID值> # 进入会话 -k 杀死会话background # 将当前会话放置后台info # 查看已有模块信息getuid …

CSS之段落样式

1、文本缩进 标签&#xff1a;text-indent &#xff08;indent v. 缩进&#xff09;含义&#xff1a;首行缩进和字体大小有关&#xff1a;1个em等于一个字体大小 2、文本对齐方式 标签&#xff1a;text-align (align v. 调整&#xff0c;使一致)种类&#xff1a;左对齐、右对…

AFDet: Anchor Free One Stage 3D Object Detection

论文链接&#xff1a;https://arxiv.org/pdf/2006.12671v1.pdf 前言 在嵌入式系统上操作的高效点云3D目标检测对于包括自动驾驶在内的许多机器人应用来说都是重要的。 大多数以前的工作都试图使用基于Anchor的检测方法来解决这个问题&#xff0c;这些方法有2个缺点&#xff1…

《MySQL的基础语法》

【一】现实当前的数据库 show databases:记住这里的databases是复数形式&#xff0c;你可以简单理解为它不仅仅含有一个数据库&#xff0c;所以需要用到可数名词复数形式。 【二】创建数据库 create database 数据库的名字&#xff1a;记住这里的database用的是单数形式&#…

Django demo项目搭建

安装 Django 在应用程序开发中&#xff0c;分别创建env文件夹和wordspace文件夹。 env文件夹用于存放创建的虚拟环境&#xff0c;wordspace用于存放项目代码&#xff0c;至此实现虚拟环境和应用程序代码的分隔。 步骤1&#xff1a;创建文件夹&#xff0c;创建命令为mkdir en…

静态链接:空间与地址分配

前言 我们终于走到了链接这一步&#xff0c;对于链接这一步&#xff0c;它是将多个输入目标文件链接后输出一个可执行文件。我们拿两个程序a.c和b.c来举例说明链接的过程。 a.c&#xff1a; /* a.c */ extern int shared;int main(){int a 100;swap(&a,&shared); }…

从Mybatis到Mybatis-Plus学习

从Mybatis到Mybatis-PlusMybatis的入门Mybatis的配置解析核心配置文件分页配置注解开发mybatis的执行流程多对一一对多动态SQLmybatis 的缓存Mybatis-plus快速入门mybatis-plus的框架结构图分页查询和删除执行SQL分析打印条件构造器Wrapper代码生成器Mybatis的入门 环境&#…

io复用函数的使用

目录 一、概念 二、使用 1.select系统调用 代码实现 前言&#xff1a; 一般多客户端在和服务器通信时&#xff0c;服务器在执行recv时会先阻塞&#xff0c;然后按照顺序依次处理客户端&#xff0c;无论客户端有无数据都会被处理&#xff0c;这样大大降低了执行效率。此时就引…

代理 模式

代理模式 Proxy Pattern 为其他对象提供一个代理以控制对这个对象的访问 可以详细控制访问某个&#xff08;某类&#xff09;对象的方法&#xff0c;在调用这个方法前做前置处理&#xff0c;调用这个方法后做后置处理。 静态代理 直接写死的代码的代理逻辑 动态代理 动态…

12.2、后渗透测试--令牌窃取

攻击机kali&#xff1a;192.168.11.106靶机windows server 2008 R2&#xff1a;192.168.11.134&#xff08;包含ms17_010漏洞&#xff09;一、令牌简介与原理 令牌(Token) 就是系统的临时密钥&#xff0c;相当于账户名和密码&#xff0c;用来决定是否允许这次请求和判断这次请求…

二进制搭建k8s——部署node节点

上篇&#xff1a;二进制搭建k8s——部署etcd集群和单master 二进制搭建k8s——部署node节点二进制搭建k8s——部署node节点环境部署node节点部署网络组件方法一&#xff1a;部署Flannel方法二&#xff1a;部署 CalicoCNI网络插件介绍Kubernetes的三种网络K8S 中 Pod 网络通信&a…

浅浅讲解下Linux内存管理之CMA

说明&#xff1a; Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 Contiguous Memory Allocator, CMA&#xff0c;连续内存分配器&#xff0c;用于分配连续的大块内存。CMA…

c语言内存和文件处理有关知识

内存 分配内存的函数calloc&#xff0c;malloc 定义于头文件 <stdlib.h>功能malloc分配内存(函数)calloc分配并清零内存(函数)realloc扩充之前分配的内存块(函数)free归还还之前分配的内存(函数)aligned_alloc(C11)分配对齐的内存(函数) 函数原型 void *malloc(unsigne…

Java基础之Collection的ArrayList

Java基础之Collection的ArrayList一、add()与addAll()二、remove()三、trimToSize()1、案例一、add()与addAll() 跟C 的vector不同&#xff0c;ArrayList没有push_back()方法&#xff0c;对应的方法是add(E e)&#xff0c;ArrayList也没有insert()方法&#xff0c;对应的方法是…