JVM及垃圾回收算法

一、JVM

1、jvm的内存组成

五大内存区域,分1.7和1.8

1.堆内存:引用类型的数据,内部组成:1.新生代(伊甸区和幸存者区)2.老年代。该区域经常发生垃圾回收的操作

堆是JVM中最大的一块内存区域,用于存储对象实例和数组。堆被 所有线程 共享,用于 动态分配 内存。堆被分为新生代(Young Generation)和老年代(Old Generation)两部分,新生代又被分为Eden空间和两个Survivor空间。

2.虚拟机栈:方法在运行时,需要存储一些内容,存储到栈

虚拟机栈用于 存储方法的 局部变量、操作数栈、方法调用 和 返回等信息。每个线程在运行时都会有一个对应的 虚拟机栈,每个方法在执行时 都会 创建一个 栈帧(Stack Frame)。

3.本地方法栈:本地方法(被native修饰的方法),方法运行时,保存的一些信息

4.程序计数器:针对线程的,记录每个线程当前的执行的行数 每个线程都有一个独立的程序计数器。

5.元空间(1.7叫做方法区):存放已被加载的类信息、常量、静态变量等信息.

JDK 1.8 同 JDK 1.7 比,最大的差别就是:元数据区 取代了 永久代。元空间的 本质 和永久代类

似,都是对 JVM 规范中方法区的实现。不过元空间与永久代之间最大的 区别 在于:

元数据空间 并 不在 虚拟机 内存 中,而是 使用 本地内存

2、JVM的堆内存

堆内存:分为两块:1.新生代 2.老年代

新生代:内部又分为 伊甸园区 和 幸存者区 伊甸园区:幸存者区:幸存者区 = 8:1:1

创建新对象,默认进入到伊甸区,GC在运行时,会将存活的对象放在幸存者区,如果对象存活超过15次,存储到老年代

老年代:存活时间长的对象或者大对象

新生代、老年代 所占 比例 2:1

3、jvm内存模型

Java 内存模型(下文简称 JMM)就是在底层处理器内存模型的基础上,定义自己的多线程语义。它明确指定了一组排序规则,来保证线程间的可见性。

这一组规则被称为 Happens-Before, JMM 规定,要想保证 B 操作能够看到 A 操作的结果(无论它们是否在同一个线程),那么 A 和 B 之间必须满足 Happens-Before 关系

  • 单线程规则:一个线程中的每个动作都 happens-before 该线程中后续的每个动作

  • 监视器锁定规则:监听器的解锁动作 happens-before 后续对这个监听器的锁定动作

  • volatile 变量规则:对 volatile 字段的写入动作 happens-before 后续对这个字段的每个读取动作

  • 线程 start 规则:线程 start() 方法的执行 happens-before 一个启动线程内的任意动作

  • 线程 join 规则:一个线程内的所有动作 happens-before 任意其他线程在该线程 join() 成功返回之前

  • 传递性:如果 A happens-before B, 且 B happens-before C, 那么 A happens-before C

Java 提供了几种语言结构,包括 volatile, finalsynchronized, 它们旨在帮助程序员向编译器描述程序的并发要求,其中:

  • volatile - 保证可见性有序性

  • synchronized - 保证可见性有序性; 通过管程(Monitor)保证一组动作的原子性

  • final - 通过禁止在构造函数初始化给 final 字段赋值这两个动作的重排序,保证可见性(如果 this 引用逃逸就不好说可见性了)

编译器在遇到这些关键字时,会插入相应的内存屏障,保证语义的正确性。

有一点需要注意的是,synchronized 不保证同步块内的代码禁止重排序,因为它通过锁保证同一时刻只有一个线程访问同步块(或临界区),也就是说同步块的代码只需满足 as-if-serial 语义 - 只要单线程的执行结果不改变,可以进行重排序。

所以说,Java 内存模型描述的是多线程对共享内存修改后彼此之间的可见性,另外,还确保正确同步的 Java 代码可以在不同体系结构的处理器上正确运行。

二、什么是STW

STW: Stop-The-World: 是在垃圾回收算法执⾏过程当中,将JVM内存冻结、应用程序停顿的⼀种状态。

  • 在STW 状态下,JAVA的所有线程都是停⽌执⾏的 -> GC线程除外

  • 一旦Stop-the-world发生,除了GC所需的线程外,其他线程都将停止工作,中断了的线程直到GC任务结束才继续它们的任务

  • STW是不可避免的,垃圾回收算法执⾏一定会出现STW,我们要做的只是减少停顿的时间

  • GC各种算法优化的重点,就是 减少STW(暂停) ,同时这也是JVM调优的重点

三、垃圾回收的相关算法:

1、GC常用算法

标记清除算法

第一步:利用可达性去遍历内存,把存活对象、需要回收的对象标记出来;第二步:在遍历一遍,把标记过的对象回收掉。缺点:效率不高,无法清除垃圾碎片

标记整理算法

首先,把存活对象和垃圾对象进行标记,然后将所有的存活对象向一端进行移动,然后直接清除端以外的内存。特点:适用于存活对象多,垃圾少的情况;需要整理的过程,无空间碎片产生;

标记复制算法

按照容量复制两个大小相等的内存空间,当有一个用完以后,就把还存活着对象复制到另一个区域中,在清除掉用完的区域,缺点:内存使用率低,只有原来的一半空间

分代收集算法

根据内存对象的存活周期不同,将内存划分成几块,一般为新生代、老年代。

新生代一般采用复制算法,老年代一般采用标记整理算法。

2、GC如何判定对象是否回收

引用计数法

使用可达性分析算法来判定:GC Roots

3、如何判断一个对象是否存活?( 判断一个对象是不是垃圾 )

判断一个对象是否存活,分为两种算法1:引用计数法;2:可达性分析算法;

引用计数法: 给每一个 对象设置 一个引用计数器,当有一个地方 引用该对象 的时候,引用计数器就+1,引用失效时,引用计数器就-1;当引用计数器为0的时候,就说明这个对象没有被引用,也就是垃圾对象,等待回收; ​ 缺点:无法解决 循环引用 的问题,当A引用B,B也引用A的时候,此时AB对象的引用都不为0,此时也就无法垃圾回收,所以一般主流虚拟机都不采用这个方法;

可达性分析法 从一个被称为 GC Roots的对象向下搜索 ,如果一个对象到GC Roots 没有任何 引用链 相连接时,说明此对象不可用,在java中可以作为GC Roots的对象有以下几种:

  • 虚拟机栈 中引用的对象

  • 方法区 类静态属性 引用的变量

  • 方法区 常量池 引用的对象

  • 本地方法 栈 JNI 引用的对象

但一个对象满足上述条件的时候,不会马上被回收,还需要进行 两次标记; 第一次标记:判断当前对象是否有 finalize()方法 并且 该方法 没有被执行过,若 不存在标记为垃圾对象,等待回收;若的话,则进行 第二次标记; 第二次标记将当前对象放入 F-Queue队列,并生成一个finalize线程去执行该方法,虚拟机不保证该方法一定会被执行,这是因为如果线程执行缓慢或进入了死锁,会导致回收系统的崩溃;如果 执行了finalize方法之后仍然没有与GC Roots有直接或者间接的引用,则该对象会被回收;

4、被引用的对象就一定能存活吗?

不一定,看 Reference 类型,弱引用在 GC 时会被回收,软引用在内存不足的时候,即 OOM 前会被回收,但如果没有在 Reference Chain 中的对象就一定会被回收

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

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

相关文章

mac安全干净卸载Anaconda3

使用which python显示当前使用的是/Users/username/anaconda3/bin/python 现在想卸载Anaconda,恢复使用mac系统自带的Python 删除隐藏文件目录 rm -rf ~/.anaconda修改~/.bash_profile文件,将anaconda相关删除 也有可能不是~/.bash_profile而是~/.zs…

声卡喊话IP喇叭,IP网络吸顶天花喇叭

声卡喊话IP喇叭,IP网络吸顶天花喇叭 SV-7043VP是一款ip/sip网络吸顶喇叭,具有10/100M以太网接口,从网络接口接收网络的音频数据后播放。本网络吸顶喇叭可以与其他广播主机、服务器软件和采播主机配合使用,实现音频的播放&#xf…

【DL经典回顾】深度学习概述

深度学习概述 一、引言 在过去的几年里,深度学习已经从学术研究的领域走向了主流,彻底改变了我们对人工智能的认识和应用。这种强大的技术,以其独特的能力模仿人脑处理和分析复杂数据的方式,不仅在科学界引起了革命,…

ThingsBoard Edge 安装部署

文章目录 一、概述1.官方文档2.部署说明3.安装准备3.1. 克隆服务器3.2.安装 Docker3.3.安装 Java 113.4.安装 PostgreSQL3.5.下载安装包 二、安装部署1.创建 Edge 实例2.创建数据库3.Edge 服务安装3.1.安装服务3.2.配置 Edge3.3.运行安装脚本3.4.重新启动服务 4.访问 Edge5.故障…

基于PHP的数字化档案管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的数字化档案管理系统 一 介绍 此数字化档案管理系统基于原生PHP,MVC架构开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 php(mvc)mysqlbootstrapphpstudyvscode 二 功能 …

django-comment-migrate 模型注释的使用

django-comment-migrate 的使用 django-comment-migrate 是一个 Django 应用,用于将模型注释自动迁移到数据库表注释中。它可以帮助您保持数据库表注释与模型定义的一致性,并提高代码的可读性。 安装 要使用 django-comment-migrate,您需要…

Arcgis新建位置分配求解最佳商店位置

背景 借用Arcgis帮助文档中的说明:在本练习中,您将为连锁零售店选择可以获得最大业务量的商店位置。主要目标是要将商店定位在人口集中地区附近,因为这种区域对商店的需求量较大。设立这一目标的前提是假设人们往往更多光顾附近的商店,而对于距离较远的商店则较少光顾。您…

C++学习随笔(5)——类和对象的深窥

本章我们来学习一下更深入了解一下类和对象! 目录 1.类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 5.3 前置和后置重载…

一键切割,激发无限创意:体验全新图片批量编辑器

在数字创意的时代,图片编辑成为了表达个性和创造力的关键。然而,传统的图片编辑工具常常让人望而生畏,复杂的操作和高门槛的技术要求使得许多人望而却步。现在,我们为您带来一款全新的图片批量编辑器,只需一键切割&…

vivo统一接入网关VUA转发性能优化实践

作者:vivo 互联网服务器团队 - Qiu Xiangcun 本文将探讨如何通过使用Intel QuickAssist Technology(QAT)来优化VUA的HTTPS转发性能。我们将介绍如何使用QAT通过硬件加速来提高HTTPS转发的性能,并探讨QAT在不同应用场景中的表现。最…

Abaqus三维梯度泰森多边形插件:Voronoi FGM 3D(Mesh)- AbyssFish

插件介绍 Voronoi FGM 3D (Mesh) V1.0 - AbyssFish 插件可在Abaqus软件内生成梯度分布的三维泰森多边形长方体模型。插件可用于梯度功能材料(Functionally Gradient Materials)、梯度纳米金属材料、梯度金属结构等梯度晶体模型的建立。模型基于背景网格实现,通过单…

分布式数据处理MapReduce简单了解

文章目录 产生背景编程模型统计词频案例 实现机制容错机制Master的容错机制Worker的容错机制 产生背景 MapReduce是一种分布式数据处理模型和编程技术,由Google开发,旨在简化大规模数据集的处理。产生MapReduce的背景: 数据量的急剧增长&…

RAID技术知识详解到RAID 10的linux实现过程

1.RAID技术简介 RAID(Redundant Array of Independent Disks)独立磁盘冗余阵列。通俗来说就是将多个硬盘通过软件或硬件结合成虚拟单台大容量的硬盘使用。 RAID技术的特点: 可以自动检测故障硬盘; 可以重建硬盘坏道的资料&…

深度学习模型部署-番外-TVM机器学习编译

什么是机器学习编译器/AI编译? 图片来自知乎大佬的文章 机器学习编译是指:将模型从训练形式转变为部署模式 训练模式:使用训练框架定义的模型部署模式:部署所需要的模式,包括模型每个步骤的实现代码,管理资…

html--宠物

文章目录 htmljscss html <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>CodePen - Spaceworm</title><script> window.requestAnimFrame (function() {return (window.requestAnimat…

简单的思考(一):MATLAB实现心形线

今天刷B站的时候看见了&#xff1a; 于是想着自己能不能也做出来 clc;clear; % 定义x的范围 x -2:0.01:2;% 初始化图形 figure; set(gcf,position,[0,0,800,600],color,w); h1 plot(x,abs(x).^(2/3) (0.9*sqrt((3.3-x.^2))).*sin(0.1*pi*x),r,LineWidth,3); hold on xlim(…

HAProxy——高性能负载均衡器

目录 一.常见的Web集群调度器 二.HAProxy基本介绍 1.HAProxy是什么&#xff1f; 2.HAProxy的特性 3.HAProxy常用的8种负载均衡调度算法 3.1 轮询&#xff1a;RR&#xff08;Round Robin&#xff09; 3.2 最小连接数&#xff1a;LC&#xff08;Least Connections&#xff…

基于JAVA的教务系统小程序的设计与实现【附项目源码】分享

基于JAVA的教务系统小程序的设计与实现: 源码地址&#xff1a;https://download.csdn.net/download/qq_41810183/88842782 一、引言 随着信息技术的不断发展&#xff0c;教务管理工作逐渐走向数字化、智能化。为了提高教务管理效率&#xff0c;方便师生查询教务信息&#xff…

ChatGPT 插件Plugin集合

ChatGPT的插件功能推出一段时间了&#xff0c;陆陆续续的上架了得有200了。 但是其中大部分都不是很好用&#xff0c;并且找起来也复杂。 推荐一个不知名热心人做的导航页。 ChatGPT Plugins Overview 基本上集合了所有的插件&#xff0c;并且还在实时更新中。 需要升级4.0&a…

机器学习 Python库 乱记录

MLFlow—模型实验和跟踪 MLflow是一个平台&#xff0c;帮助你从头到尾管理你的机器学习实验&#xff0c;确保可追溯性和可重复性。它提供了一个集中的存储库&#xff0c;用于存储你的代码、数据和模型工件&#xff0c;以及一个跟踪系统&#xff0c;记录你所有的实验&#xff0c…