jvm垃圾收集算法
简介
由于《分代收集理论》和不同垃圾收集算法,Java堆应该被划分为不同区域,一般至少会把Java堆划分为新生代(Young Generation)和老年代(Old Generation)两个区域。
垃圾收集器可以只回收其中某一个或者某些部分的区域对应不同的垃圾回收:
“Minor GC”:新生代的垃圾收集
“Major GC”:老年代垃圾收集
“Full GC”:整个Java堆和方法区的垃圾收集
默认的,新生代( Young ) 与老年代( Old ) 的比例的值为 1:2即:新生代( Young ) = 1/3 的堆空间大小。 老年代( Old ) = 2/3 的堆空间大小 ( 该值可以通过参数–XX:NewRatio 来指定)
新生代又划分为一块Eden和两块Survivor(占比新生代的80%、10%、10%)

标记-清除算法
算法分为“标记”和“清除”两个阶段:
“标记”:标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象(标记过程就是对象是否属于垃圾的判定过程)
“清除”:回收标记对象
两大缺点
1、执行效率不稳定
如果Java堆中包含大量对象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量增长而降低。
2、内存空间的碎片化
标记、清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
标记-复制算法
标记-复制算法常被简称为复制算法,为了解决标记-清除算法面对大量可回收对象时执行效率低的问题。
将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
存在问题
如果内存中多数对象都是存活的,这种算法将会产生大量的内存间复制的开销。
但对于多数对象都是可回收的情况,算法需要复制的就是占少数的存活对象,而且每次都是针对整个半区进行内存回收,分配内存时也就不用考虑有空间碎片的复杂情况,只要移动堆顶指针,按顺序分配即可。(实现简单、运行高效)
是将可用内存缩小为了原来的一半,会造成空间浪费。
实际上
新生代分为一块较大的Eden空间和两块较小的Survivor空间,每次分配内存只使用Eden和其中一块Survivor。
发生垃圾回收时,将Eden和Survivor中仍然存活的对象一次性复制到另外一块Survivor空间上,然后直接清理掉Eden和已用过的那块Survivor空间。
新生代中垃圾回收时,如果有多于10%对象存活,此时一个Survivor空间不足以容纳一次Minor GC之后存活的对象,就需要依赖其他内存区域(实际上大多就是老年代)。
标记-整理算法
标记-复制算法在对象存活率较高时就要进行较多的复制操作,效率将会降低。如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法。
“标记-整理”(Mark-Compact)算法:
“标记”:标记出所有需要回收的对象
“整理”:让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存
标记-清除算法与标记-整理算法的本质差异在于前者是一种非移动式的回收算法,而后者是移动式的。
存在问题
移动存活对象,尤其是在老年代这种每次回收都有大量对象存活区域,移动存活对象并更新所有引用这些对象的地方是一种极为负重的操作,而且这种对象移动操作必须全程暂停用户应用程序才能进行,像这样的停顿被最初的虚拟机设计者形象地描述为“Stop The World”。
垃圾收集的停顿时间来看,不移动对象停顿时间会更短,甚至可以不需要停顿,但是从整个程序的吞吐量来看,移动对象会更划算。
不移动对象会使得收集器的效率提升一些,但因内存分配和访问相比垃圾收集频率要高得多,这部分的耗时增加,总吞吐量仍然是下降的。
“和稀泥式”解决方案
让虚拟机平时多数时间都采用标记-清除算法,暂时容忍内存碎片的存在,直到内存空间的碎片化程度已经大到影响对象分配时,再采用标记-整理算法收集一次,以获得规整的内存空间。
CMS收集器面临空间碎片过多时采用的就是这种处理办法。
相关文章:
jvm垃圾收集算法
简介 由于《分代收集理论》和不同垃圾收集算法,Java堆应该被划分为不同区域,一般至少会把Java堆划分为新生代(Young Generation)和老年代(Old Generation)两个区域。 垃圾收集器可以只回收其中某一个或者…...
Arm机密计算架构技术(Armv9 CCA) 白皮书
1. 概述 在本篇文章中,我们将介绍机密计算(Confidential Computing)在现代计算平台中扮演的角色,并解释机密计算的原理。然后我们将说明 Arm 机密计算架构 (Arm CCA) 如何在 Arm 计算平台中实现机密计算。 看完本文后,您将能够: 定义机密计算描述复杂的系统信任链了解R…...
Magisk Delta以及EdXposed工具在逍遥模拟器上安装教程
材料准备: 1,逍遥模拟器 安卓9的镜像 2,EdXpose 的apk以及对应的zip文件 3,riru框架 zip文件 4,magisk delta 的apk文件以及magisk manager的apk文件 放心 这些我都打包放好了,还有已经打包好的逍遥模拟器镜…...
The Reversal Curse: LLMs trained on “A is B“ fail to learn “B is A“
(not an original, only classified as one to avoid cramming reference links) paper: https://owainevans.github.io/reversal_curse.pdf blog with interactions with the authors: Paper: LLMs trained on “A is B” fail to learn “B is A” — LessWrong This is a…...
专栏更新情况:华为流程、产品经理、战略管理、IPD
目录 前言 01 华为流程体系入门课 CSDN学院 02 产品经理进阶课 CSDN学院 03 BLM 战略方法论进阶课 04 IPD 进阶 100 例专栏 作者简介 前言 已上线四大课程专栏更新情况: 01 华为流程体系入门课(视频图文); 02 硬件产品经…...
微软(TTS)文本转语音服务API实现
此博客实现与java实现微软文本转语音(TTS)经验总结_java tts_${简简单单}的博客-CSDN博客之上,首先感谢博客源码的提供,本人在上面添加了一些详细的注释,方便大家跟好的理解和使用,毕竟我已经用原文调试了一…...
防火墙firewalld
title: 防火墙firewalld createTime: 2020-10-29 18:05:52 updateTime: 2020-10-29 18:05:52 categories: linux tags: centos7上的firewalld 的使用 一、firewalld的基本启动关闭命令 启动服务------systemctl start firewalld关闭服务------systemctl stop firewalld查看状…...
SW线光源是真实的(点光源)
点光源在渲染下真实 点光源地板反射是对的...
Vue Router的安装
安装 在我们使用脚手架搭建项目的时候,默认是没有帮我们安装的。需要自己手动进行安装。安装的 Vue-Router 插件时需要注意版本信息,Vue2.0 使用的是 Vue-Router3.x ,而 Vue3.0 使用的是 Vue-Router4.x。 通过命令安装 vue-router3 插件 $…...
ROS架构设计
ROS架构如图所示,可以将其分为三个层次:OS层、中间层和应用层。 1.OS层 ROS并不是一个传统意义上的操作系统,无法像Windows、Linux一样直接运行在计算机硬件之上,而是需要依托于Linux系统。所以在OS层,我们可以直接使…...
JSON.toJSONString() 解析之后 出现“$ref“:“$[x].xxx“
原因:JSON在处理数据时出现了相同数据,JSON自动将相同节点的数据使用引用方式代替。 解决方式: String jsonString JSON.toJSONString(params, SerializerFeature.DisableCircularReferenceDetect); SerializerFeature.DisableCircularRefer…...
2023研究生数学建模E题思路+模型+代码+论文(持续更新中) 出血性脑卒中临床智能诊疗建模
目录 E题思路 出血性脑卒中临床智能诊疗建模 完整思路代码模型论文获取见文末名片 完整思路代码模型论文获取见此 E题思路 出血性脑卒中临床智能诊疗建模 完整思路代码模型论文获取见文末名片 一、 背景介绍 出血性脑卒中指非外伤性脑实质内血管破裂引起的脑出血࿰…...
云可观测性安全平台——掌动智能
云可观测性安全平台是一个跨架构、跨平台的可观测性方案,实现对云环境下的细粒度数据可视化,满足安全部门对云内部安全领域的多场景诉求,包括敏感数据动态监管、云网攻击回溯分析、攻击横移风险监控、云异常流量分析。本文将介绍掌动智能云可…...
[ruby on rails] postgres sql explain 优化
一、查看执行计划 sql User.all.to_sql # 不会实际执行查询 puts ActiveRecord::Base.connection.explain(sql)# 会实际执行查询,再列出计划 User.all.explain# 会实际执行查询,再列出计划ActiveRecord::Base.connection.execute(EXPLAIN ANALYZE sql…...
YOLOv7改进:GAMAttention注意力机制
1.背景介绍 为了提高各种计算机视觉任务的性能,人们研究了各种注意机制。然而,以往的方法忽略了保留通道和空间方面的信息以增强跨维度交互的重要性。因此,我们提出了一种全局调度机制,通过减少信息缩减和放大全局交互表示来提高深…...
83、SpringBoot --- 下载和安装 MSYS2、 Redis
启动redis服务器: 打开小黑窗: C:\Users\JH>e: E:>cd E:\install\Redis6.0\Redis-x64-6.0.14\bin E:\install\Redis6.0\Redis-x64-6.0.14\bin>redis-server.exe redis.windows.conf 启动redis客户端: 小黑窗:redis-cli …...
用css画一个半圆弧(以小程序为例)
一、html结构 圆弧的html结构是 两个块级元素嵌套。 <View classNamewrap><View className"inner">{/* 图标下的内容 */}</View></View>二、css样式:原理是两个半圆叠在一起,就是一个半圆弧。那么,如何画一…...
redis介绍
一、简介 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,…...
数学建模常用模型
作为数学建模的编程手还掌握一些各类模型常用算法,数学建模评价类模型、分类模型、预测类模型比较常用的方法总结如下: 接下来对这些比较典型的模型进行详细进行介绍说明。 一、评价模型 在数学建模中,评价模型是比较基础的模型之一&#x…...
Linux 基本语句_5_创建静态库|动态库
静态库 创建主函数:main.c 应用函数:add.c、sub.c、mul.c 创建calc.h文件作为头文件 生成可执行文件*.o文件 gcc -c add.c -o add.o ....包装*.o文件为静态库 ar -rc libmymath.a add.o sub.o mul.o编译静态库并指明创建静态库的位置 sudo gcc mai…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
