JVM:自动垃圾回收
文章目录
- 一、C/C++的内存管理
- 二、Java的内存管理
- 1、方法去的回收
- 2、堆回收
- (1)引用计数法和可达性分析法
- (2)五种对象引用
- (3)垃圾回收算法
一、C/C++的内存管理
- 在C和C++没有自动垃圾回收机制,一个对象如果不在使用需用手动释放,否则会出现内存泄漏。
- 内存泄漏指的是不再使用的对象在系统中未被回收,内存泄漏的积累可能会导致内存溢出。
二、Java的内存管理
Java为了简化对象释放,引入了自动的垃圾回收(Garbage Collection简称GC)机制。通过垃圾回收器来对不再使用的对象完成自动的回收,垃圾回收器主要负责对堆上的内存进行回收。其他很多现代语言比如C#、Python、Go都拥有自己的垃圾回收器。
1、方法去的回收
方法区中能回收的内容主要是不再使用的类。判定一个类可以被卸载,需要同时满足下面三个条件:
- 此类所有实例对象都已经被回收,在堆中不存在任何该类的实例对象以及子类对象。
- 加载该类的类加载器已经被回收。
- 该类对应的java.lang.Class对象没有任何地方被引用。
手动触发回收:
- 如果需要手动触发垃圾回收,可以调用System.gc()方法。
- 语法:System.gc()。
- 注意事项:调用System.gc()方法并不一定会立即回收垃圾,仅仅是向Java虚拟机发送一个垃圾回收的请求,具体是否需要执行垃圾回收Java虚拟机会自动判断。
打印类的加载和卸载信息配置:
- -XX:+TraceClassLoading
- -XX:+TraceClassUnloading
2、堆回收
Java中对象是否能被回收,是根据对象是否被引用来决定的。如果对象被引用了,说明改对象还在使用,不允许被回收。只有无法通过引用获取到对象时,该对象才能被回收。
- -verbose:gc打印垃圾回收日志
(1)引用计数法和可达性分析法
引用计数法:
- 引用计数法会为每个对象维护一个引用计数器,当对象被引用时加1,取消引用时减1。引用计数法的优点是实现简单,C++中的智能指针就采用了引用计数法,但是它也存在缺点,主要有两点:
- 每次引用和取消引用都需要维护计数器,对系统性能会有一定的影响。
- 存在循环引用问题,所谓循环引用就是当A引用B,B同时引用A时会出现对象无法回收的问题。
可达性分析法:
- Java使用的是可达性分析算法来判断对象是否可以被回收。可达性分析将对象分为两类:垃圾回收的根对象(GC Root)和普通对象,对象与对象之间存在引用关系。
- 哪些对象可以作为GC Root:
- 线程Thread对象,引用线程栈帧中的方法参数、局部变量等。
- 系统类加载器加载的java.lang.Class对象。
- 监视器对象,用来保存同步锁synchronized关键字持有的对象。
- 本地方法调用时使用的全局对象。
查看GC Root:
通过arthas和eclipse Memory Analyzer(MAT)工具可以查看GC Root,MAT工具是eclipse推出的Java堆内存检测工具。具体操作步骤如下:
- 使用arthas的heapdump命令将堆内存快照保存到本地磁盘中。
- 使用MAT工具打开堆内存快照文件。
- 选择GC Roots功能查看所有的GC Root。
(2)五种对象引用
可达性算法中描述的对象引用,一般指的是强引用,即是GC Root对象堆普通对象有引用关系,只要这层关系存在,普通对象就不会被回收。除了强引用之外,Java中还设计了几种其他引用方式:
- 软引用
软引用相对于强引用时一种比较弱的引用关系,如果一个对象只有软引用关联到它,当程序内存不足时,就会将软引用中的数据进行回收。在JDK1.2版本之后提供了SoftReference类来实现软引用,软引用常用于缓存中。执行过程如下:- 将对象使用软引用包装起来,new SoftReference<对象类型>(对象)。
- 内存不足时,虚拟机尝试进行垃圾回收。
- 如果垃圾回收仍不能解决内存不足的问题,回收软引用中的对象。
- 如果仍然内存不足,抛出OutOfMemory异常。
软引用中的对象如果在内存不足时回收,SoftReference对象本身也需要被回收。如何知道哪些SoftReference对象需要回收呢,SoftReference提供了一套队列机制:
-
软引用创建时,通过构造器传入引用队列。
-
在软引用中包含的对象被回收时,该软引用对象会被放入引用队列。
-
通过遍历引用队列,将SoftRference的强引用删除。
-
弱引用
包含的对象在垃圾回收时,不管内存够不够都会直接被回收。在JDK1.2版本之后提供了WeakReference类来实现弱引用,弱引用主要在ThreadLocal中使用。弱引用本身也可以使用引用队列进行回收。 -
虚引用
虚引用也叫幽灵引用/幻影引用,不能通过虚引用对象获取到包含的对象。虚引用唯一的用途是当对象被垃圾回收器回收时可以接收到对应的通知。Java中使用PhantomReference实现了虚引用,直接内存中为了及时知道直接内存对象不在使用,从而回收内存,使用了虚引用来实现。 -
终结器引用
指的是对象需要被回收时,对象将会被放置在Finalizer类中的引用队列中,并在稍后由一条由FinalizerThread线程从队列中获取对象,然后执行对象的finalize方法。在这个过程中可以在finalize方法中再将自身对象使用强引用关联上,但是不建议这样做,如果耗时过长会影响其他对象的回收。
(3)垃圾回收算法
垃圾回收算法的历史和分类:
- 1960年John McCarthy发布了第一个GC算法:标记-清除算法。
- 1963年Marvin L.Minsky发布了复制算法。
本质上后续所有的垃圾回收算法,都是在上述两种算法的基础上优化而来。
Java垃圾回收过程会通过单独的GC线程来完成,但是不管使用哪种GC算法,都会有部分阶段需要停止所有的用户线程。这个过程被称为Stop The World简称STW,如果STW时间过程则会影响用户的使用。
垃圾回收算法的评价标准:
-
吞吐量
- 吞吐量值得是CPU用于执行用户代码的时间与CPU总执行的时间比值。吞吐量越高,垃圾回收的效率越高。
-
最大停顿时间
- 指的是垃圾回收过程中STW时间最大值。
标记清除算法:
- 标记阶段,将所有存活的对象进行标记。Java中使用可达性分析算法,从GC Root开始通过引用链遍历出所有存活对象。
- 清除阶段,从内存中删除没有被标记也就是非存活对象。
- 优点:实现简短,缺单:碎片会问题。
复制算法的核心思想:
准备两块空间From空间和同空间,每次兑现分配阶段,只能使用其中一块空间(From 空间)。
- 在垃圾回收GC阶段,将From中存活的对象复制到To空间。
- 将两块内存空间的From和To名字互换。
- 优点:
- 吞吐量高:只需要遍历一次存活对象。
- 不会发生碎片化。
- 缺点:
- 内存使用率低。
标记整理算法:
标记整理算法也叫标记压缩算法,是对标记整理算法中容易产生内存碎片问题的一种解决方案。核心思想:
- 标记阶段,将所有存活对象进行标记(采用可达性分析算法)。
- 整理阶段,将存活对象移动到堆的一端。进行清理操作。
- 优点:
- 吞吐量高:只需要遍历一次存活对象。
- 不会发生碎片化。
- 缺点:
- 整理阶段效率不高。
分代垃圾回收算法:
将整个内存区域划分为年轻代(存活时间比较短的对象)和老年代(存放时间比较长的对象)。
- 在JDK8,添加-XX:+UseSerialGC参数使用分代回收的垃圾回收器,运行程序。
- 在arthas中使用memory命令查看内存,显示出三个区域的内存情况。
分代回收时,创建出来的对象,首先会被放入Eden伊甸园区。随着对象在Eden区越来越多,如果Eden区满,新创建的对象已经无法放入,就会触发年轻代的GC,称为Minor GC或者Young GC。Minor GC会把需要eden中和From需要回收的对象回收,把没有回收的对象放入To区。如果Minor GC后对象的年龄达到阈值(最大15,默认值和垃圾回收器有关),对象就会被晋升至老年代。当老年代中空间不足,无法放入新的对象时,先尝试minor gc如果还是不足,就会触发Full GC,Full GC会对整个堆进行垃圾回收。
调整内存区域的大小:
根据以下虚拟机参数,调整堆的大小并观察结果。注意加上-XX:+UseSerialGC
相关文章:
JVM:自动垃圾回收
文章目录 一、C/C的内存管理二、Java的内存管理1、方法去的回收2、堆回收(1)引用计数法和可达性分析法(2)五种对象引用(3)垃圾回收算法 一、C/C的内存管理 在C和C没有自动垃圾回收机制,一个对象…...
【填坑指南】PHP8报:Unable to load dynamic library ‘zip.so’ 错误
1.原因分析 这种情况多数发生在PHP安装时因为各种原因失败后,残余的库与最后安装的PHP版本不兼容导致的。 2.我的路径 一开始我按照以前摸索出来的安装PHP7.3的成功经验来编译方法安装PHP8.3,发现以前的套路已经失效了。反复重装PHP8.3失败后…...
鸿蒙语言基础类库:【@system.notification (通知消息)】
通知消息 说明: 从API Version 7 开始,该接口不再维护,推荐使用新接口[ohos.notification]。本模块首批接口从API version 3开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import notification fro…...
1.JavaWeb开发简介(Tomcat安装使用+Servlet简介)
文章目录 一.web开发简介1.概念:2.特点:3.常用技术:4.服务架构5.web应用开发模式6.HTTP协议1)概念:2)HTTP最基本的过程是:3)IP/域名4)HTTP协议请求方式 7.JavaWeb的相关技术8.Java Web服务器 二、安装配置Tomcat1.简介2.Tomcat目录结构 三.Servlet的入门应用1.使用步骤2.使用注…...
xxl-job 动态创建一次性定时任务
文章目录 需求一、考虑方案二、实现思路三、代码实现3.1 引入xxl-core 核心包3.2 远程调用3.2.0 yaml3.2.1 配置类3.2.2 入参3.2.3 任务返回实体3.2.4 任务调用 3.3 cron生成器3.4 handler实现3.4 测试 踩坑 需求 类似预约会议,设置提醒 添加数据记录(…...
网页制作技术:概念、现状与展望?
网页制作技术:概念、现状与展望? 李升伟 网页制作技术是指用于创建和维护网站的一系列技术和方法。 概念: 它涉及多个方面,包括使用 HTML(超文本标记语言)来构建网页的结构和内容,使用 CSS&…...
Kafka Producer之数据重复和乱序问题
文章目录 1. 数据重复2. 数据乱序 为了可靠性,Kafka有消息重试机制,但是同时也带来了2大问题 1. 数据重复 消息发送到broker后,broker记录消息数据到log中,但是由于网络问题,producer没有收到acks,于是再次…...
Java前后端分离开发的步骤以及注意事项
在现代Web应用程序开发中,前后端分离是一种常见的架构模式。这种模式将前端(用户界面)和后端(业务逻辑和数据处理)分开独立开发和部署,从而提高开发效率、代码的可维护性和团队协作能力。本文将介绍Java前后…...
C#绘制阻抗圆图初步
阻抗圆图,或者叫史密斯图,是无线电设计方面用的; 基本的阻抗圆图如下, 下面尝试用C#能不能画一下; 先在网上找一个画坐标的C#类,它的效果如下; 自己再增加一个函数,可以绘制中心在…...
【STC89C51单片机】定时器/计数器的理解
目录 定时器/计数器1. 定时器怎么定时简单理解(加1经过了多少时间)什么是时钟周期什么是机器周期 2.如何设置定时基本结构相关寄存器1. TMOD寄存器2. TCON寄存器 代码示例 定时器/计数器 STC89C51单片机的定时器和计数器(Timers and Counter…...
数据建模标准-关系建模
数据模型定义:DAMA数据治理体系中将数据模型定义为一种文档形式,数据模型是用来将数据需求从业务传递到IT,以及在IT内部从分析师、建模师和架构师到数据库设计人员和开发人员的主要媒介; 作用:记录数据需求和建模过程中产生的数据…...
Qt日志库QsLog使用教程
前言 最近项目中需要用到日志库。上一次项目中用到了log4qt库,这个库有个麻烦的点是要配置config文件,所以这次切换到了QsLog。用了后这个库的感受是,比较轻量级,嘎嘎好用,推荐一波。 下载QsLog库 https://github.c…...
07. Hibernate 会话工厂(SessionFactory)
1. 前言 Hibernate 的核心价值观是:开发者们!做你们应该做的。脏的、累的、没技术含义的由本尊来做。 本节课和大家一起好好的聊聊 Hibernate 的核心组件之一:会话工厂(SessionFactory)。 通过本节课,你…...
使用Nginx实现高效负载均衡
概述 Nginx是一款高性能的HTTP和反向代理服务器,广泛用于Web服务的负载均衡。它能有效分发流量至多个后端服务器,提高网站的可用性和响应速度,同时增强系统的可扩展性和安全性。本文将介绍如何配置Nginx进行负载均衡,并提供具体的…...
华为OD机考题(基础API)
基础API 字典排序 List<String> listnew ArrayList(); //add list member Arrays.sort(list);List<Map<String,Integer>> listnew ArrayList(); //add list member Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {Over…...
<数据集>UA-DETRAC车辆识别数据集<目标检测>
数据集格式:VOCYOLO格式 图片数量:20500张 标注数量(xml文件个数):20500 标注数量(txt文件个数):20500 标注类别数:4 标注类别名称:[car, van, others, bus] 序号类别名称图片数框数1car201871259342…...
学生管理系统(C语言)(Easy-x)
课 程 报 告 课 程 名 称: 程序设计实践 专 业 班 级 : XXXXX XXXXX 学 生 姓 名 : XXX 学 号 : 231040700302 任 课 教 师 &a…...
C# 解析省份、城市、区域 json文件
一、json文件内容如下,(小程序里好像有用到...): 二、读取包含省份城市区域的json文件,并整理成想要的结果: string path Server.MapPath("/js"); string file System.IO.Path.Combine(path, "数据.…...
用C语言写的一个扫雷小游戏
头文件 调用头文件和声明函数 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <time.h> #include <stdlib.h>#define ROW 9 #define COL 9#define ROWS ROW2 #define COLS COL2#define EASY_CONT 10//声明函数 //初始化棋盘函数 void InitB…...
C++——类和对象(初始化列表和运算符重载与静态与友元)
文章目录 初始化列表语法结构定义和使用案例初始化列表初始化常量成员: 注意事项 运算符重载加法运算符重载语法结构示例注意事项 减法运算符重载语法结构示例注意事项 等于运算符重载等于运算符 的重载语法示例注意事项 大于运算符重载大于运算符 > 的重载语法…...
【WPF】图片剪裁-ImageCropping
【WPF】图片剪裁-ImageCropping 背景技术栈实现思路核心代码界面布局Style处理逻辑使用技巧预览下载背景 机缘巧合吧,当时在全网寻找图像剪裁工具,但大都不能满足需求,于是决定动手写。当然如果只是为了完成这么一个功能就没有必要记录了,主要是不依赖与第三方图像库,且实…...
C++的模板(十二):forward模板
标准库的std::forward模板有一个类型T参数。在实际使用时,T取什么值应该不存在疑惑: class A { public:A() {}A(int n):n(n) {}template <class T> A(T &&a);void print(A &&a) { printf("A&&\n"); }void pri…...
docker desktop历史版本安装
1.安装choco Windows安装 choco包管理工具-CSDN博客 2.通过choco安装 下面例子为安装旧版2.3.0.2,其它版本类似 Chocolatey Software | Docker Desktop 2.3.0.2 https://download.docker.com/win/stable/45183/Docker%20Desktop%20Installer.exe choco install docker-des…...
Ubuntu系统成功安装Docker教程
服务器版本: Ubuntu 22.04.3 LTS 1. 卸载旧版本 Docker 的旧版本被称为 docker,docker.io 或 docker-engine 。如果已安装,需要卸载: sudo apt-get remove docker docker-engine docker.io containerd runc2. 更新 apt 软件包 …...
C++ 匹配并提取包括加中括号的日期时间的正则表达式
在C中,你可以使用std::regex库来匹配包含日期和时间的字符串。以下是一个简单的例子,它展示了如何使用正则表达式来匹配形如[YYYY-MM-DD HH:MM:SS]的字符串。include <iostream> #include <string> #include <regex> int main() { …...
一文-深入了解Ansible常见模块、安装和部署
1 Ansible 介绍 Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于python 开发的(集合了众多运维工具 puppet、cfengine、chef、func、fabric的优点)自动化运维工具, 其功能实现基于ss…...
etcd的备份与恢复
一 为什么使用etcd 与ZooKeeper相比,etcd更简单,安装、部署和使用更加容易,并且etcd的某些功能是ZooKeeper所没有的。因此,在很多场景下,etcd 比ZooKeeper更受用户的青,具体表现在如下几个方面: 1 etcd更…...
从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望
我在2021年底开始使用Polars和DuckDB。我立刻意识到这些库很快就会成为数据科学生态系统的核心。自那时起,这些库的受欢迎程度呈指数级增长。 在这篇文章中,我做出了一些关于未来几年数据科学领域的发展方向和原因的预测。 这篇文章旨在检验我的预测能力…...
【postgresql】pg_dump备份数据库
pg_dump 介绍 pg_dump 是一个用于备份 PostgreSQL 数据库的实用工具。它可以将数据库的内容导出为一个 SQL 脚本文件或其他格式的文件,以便在需要时进行恢复或迁移。 基本用法 pg_dump [选项] [数据库名] 命令选项 -h 或 --host:指定数据库服务器的主…...
服务器的80和443端口关闭也能申请SSL证书
一、简介 在服务器的80和443端口关闭的情况下,确实可以申请SSL证书,但申请过程和方法会根据证书类型和验证方式的不同而有所差异。 通常如果是网站域名申请SSL证书,哪怕服务器的80、443端口都打不开,也可以通过DNS解析的方式来验…...
免费做app页面的网站/seo优化平台
新项目用的是react 用到了好多es6的语法,之前看过一遍阮一峰老师的 es6入门,最近发现好多地方理解的不是很深刻,所以又来了一遍,顺便对几个很实用的方法做一下总结 首先声明,这篇文章是转载的: 原文链接 &g…...
嘉定网站建设公司/杭州百度快照优化排名推广
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。 Solution 比较明显的CDQ分治维护…...
wordpress商店插件/市场调研分析报告怎么写
1.join()的用法:使用前面的字符串.对后面的列表进行拼接,拼接结果是一个字符串# lst ["alex","dsb",wusir,xsb]# s "".join(lst)# print(s) #alexdsbwusirxsb2.split() 根据你给的参数进行切割,切割的结果就是列表需要把字符串转换成列表 spl…...
做房产的一般用哪个网站/哪家网络公司比较好
青蛙的邻居( Frogs Neighborhood) 题目描述: 未名湖附近共有 n 个大小湖泊 L1, L2, ..., Ln(其中包括未名湖),每个湖泊 Li 里住着一只青蛙 Fi( 1≤i≤n)。如果湖泊 Li 和 Lj 之间有…...
我在海贼开发app免费/赣州seo
模板方法模式很常用,其目的是在一个方法中定义一个算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。在标准的模板方法模式实现中,主要是使用继承的方式,来…...
望城经开区建设开发公司门户网站/nba排名最新赛程
用IE的htc组件实现的数据表格功能如下:1,固定首行和首列。2,将列拖宽。3,拖动列交换位置。4,选中(包含CTRL和SHIFT功能)。5,列排序功能。6,可以拖动表格的边框。只支持IE…...