JVM——垃圾回收(方法区中的垃圾回收和(堆回收)自动垃圾回收)

目录

  • 1.自动垃圾回收介绍
    • 1.C/C++的内存管理
    • 2.Java的内存管理
    • 3.垃圾回收的对比
  • 2.方法区的回收
    • 方法区的回收 – 手动触发回收
  • 3.堆回收
    • 1.引用计数法
    • 2.可达性分析算法

在这里插入图片描述

1.自动垃圾回收介绍

1.C/C++的内存管理

⚫ 在C/C++这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,否则就会出现内存泄漏。我们称这种释放对象的过程为垃圾回收,而需要程序员编写代码进行回收的方式为手动回收。
⚫ 内存泄漏指的是不再使用的对象在系统中未被回收,内存泄漏的积累可能会导致内存溢出。在这里插入图片描述

2.Java的内存管理

⚫ Java中为了简化对象的释放,引入了自动的垃圾回收(Garbage Collection简称GC)机制。通过垃圾回收器来对不再使用的对象完成自动的回收,垃圾回收器主要负责对堆上的内存进行回收。其他很多现代语言比如C#、Python、Go都拥有自己的垃圾回收器。在这里插入图片描述

3.垃圾回收的对比


自动垃圾回收
自动根据对象是否使用由虚拟机来回收对象
• 优点:降低程序员实现难度、降低对象回收bug的可能性
• 缺点:程序员无法控制内存回收的及时性


手动垃圾回收
由程序员编程实现对象的删除
• 优点:回收及时性高,由程序员把控回收的时机
• 缺点:编写不当容易出现悬空指针、重复释放、内存泄漏等问题


2.方法区的回收

在这里插入图片描述
⚫ 线程不共享的部分,都是伴随着线程的创建而创建,线程的销毁而销毁。而方法的栈帧在执行完方法之后就会自动弹出栈并释放掉对应的内存。


在这里插入图片描述


⚫ 方法区中能回收的内容主要就是不再使用的类。
判定一个类可以被卸载。需要同时满足下面三个条件:
1、此类所有实例对象都已经被回收,在堆中不存在任何该类的实例对象以及子类对象。
在这里插入图片描述

2、加载该类的类加载器已经被回收。
在这里插入图片描述

3、该类对应的 java.lang.Class 对象没有在任何地方被引用在这里插入图片描述

方法区的回收 – 手动触发回收

⚫ 如果需要手动触发垃圾回收,可以调用System.gc()方法。
⚫ 语法: System.gc()
⚫ 注意事项:
调用System.gc()方法并不一定会立即回收垃圾,仅仅是向Java虚拟机发送一个垃圾回收的请求,具体是否需要执行垃圾回收Java虚拟机会自行判断


⚫ 方法区中能回收的内容主要就是不再使用的类。
判定一个类可以被卸载。需要同时满足下面三个条件:
1、此类所有实例对象都已经被回收,在堆中不存在任何该类的实例对象以及子类对象。
2、加载该类的类加载器已经被回收。
3、该类对应的 java.lang.Class 对象没有在任何地方被引用。

3.堆回收

如何判断堆上的对象可以回收?
Java中的对象是否能被回收,是根据对象是否被引用来决定的。如果对象被引用了,说明该对象还在使用,不允许被回收在这里插入图片描述
循环引用
在这里插入图片描述

如何判断堆上的对象没有被引用?
常见的有两种判断方法:引用计数法和可达性分析法。

1.引用计数法

  • 引用计数法会为每个对象维护一个引用计数器,当对象被引用时加1,取消引用时减1

引用计数法的优点是实现简单,C++中的智能指针就采用了引用计数法,但是它也存在缺点,主要有两点:

  • 1.每次引用和取消引用都需要维护计数器,对系统性能会有一定的影响
  • 2.存在循环引用问题,所谓循环引用就是当A引用B,B同时引用A时会出现对象无法回收的问题。在这里插入图片描述

查看垃圾回收日志
⚫ 如果想要查看垃圾回收的信息,可以使用-verbose:gc参数。
⚫ 语法: -verbose:gc
在这里插入图片描述

2.可达性分析算法

  • Java使用的是可达性分析算法来判断对象是否可以被回收。可达性分析将对象分为两类:垃圾回收的根对象(GC Root)和普通对象,对象与对象之间存在引用关系。
  • 下图中A到B再到C和D,形成了一个引用链,可达性分析算法指的是如果从某个到GC Root对象是可达的,对象就不可被回收。

在这里插入图片描述
哪些对象被称之为GC Root对象呢?
⚫ 线程Thread对象。
在这里插入图片描述
⚫ 系统类加载器加载的java.lang.Class对象。
在这里插入图片描述
⚫ 监视器对象,用来保存同步锁synchronized关键字持有的对象。
在这里插入图片描述
⚫ 本地方法调用时使用的全局对象。

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

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

相关文章

【差旅游记】走进新疆哈密博物馆

哈喽,大家好,我是雷工! 前些天在新疆哈密时,有天下午有点时间,看离住的宾馆不远就是哈密博物馆,便去逛了逛博物馆,由于接下来的一段时间没顾上记录,趁今天有些时间简单记录下那短暂的…

蓝桥杯每日一题2023.11.25

题目描述 “蓝桥杯”练习系统 (lanqiao.cn) 题目分析 对于此题目最开始是递归想法,但发现题意中的匹配次数实际上是指在这8个字母中这8个字母每个字母对应的个数是否相同,如果相同则匹配。 此处我们可以使用subsrtr函数,每次循环截取8个字…

值得看的书--《全宋词》节选

(https://img-blog.csdnimg.cn/5d5fe2844f6646b5b7b415f0a9e80f6c.jpg)

基于uniapp的 电子书小程序——需求整理

前言 想开发一个很简单的 电子书阅读小程序,要怎么做的。下面从功能、数据库设计这一块来说一下。说不一定能从某个角度提供一些思路 开发语言 springcloud uniapp 小程序(vue2)mysql 说明 电子书的主题是电子书,我们在日常…

Elasticsearch集群部署 head监控插件 Kibana部署 Nginx反向代理 Logstash部署

一、组件介绍1、Elasticsearch:2 、Logstash3、Kibana4、Kafka:5、Filebeat: 二、 Elasticsearch集群部署服务器创建用户安装ES修改配置文件创建数据和日志目录设置JVM堆大小 #7.0默认为4G修改安装目录及存储目录权限系统优化(1)增…

2024年天津天狮学院专升本护理学专业《内外科护理学》考试大纲

天津天狮学院2024年护理学专业高职升本入学考试《内外科护理学》考试大纲 一、考试性质 《内外科护理学》专业课程考试是天津天狮学院护理专业高职升本入学考试的必考科目之一,其性质是考核学生是否达到了升入本科继续学习的要求而进行的选拔性考试。《内外科护理学…

完蛋!我被ConcurrentHashMap源码包围了!(一)

文章目录 1. 引言2. 使用3. 初始化4. 存储流程5. 取值流程6. 扩容流程 1. 引言 ConcurrentHashMap是一个线程安全的HashMap,在JDK1.7与JDK1.8,无论是实现还是数据结构都会有所不一样。这促使了ConcurrentHashMap有着HashMap一样的面试高频考点。 接下来…

【Linux】进程间通信——system V共享内存、共享内存的概念、共享内存函数、system V消息队列、信号量

文章目录 进程间通信1.system V共享内存1.1共享内存原理1.2共享内存数据结构1.3共享内存函数 2.system V消息队列2.1消息队列原理 3.system V信号量3.1信号量原理3.2进程互斥 4.共享内存的使用示例 进程间通信 1.system V共享内存 1.1共享内存原理 共享内存区是最快的IPC形式…

递归剪枝题

期中考终于考完了,整道题奖励下自己 我一北大同学问我的,说他递归超时了,叫我想一个办法 后面他说他加了个剪枝就过了,然后我自己尝试了一个方法: 就是先把城市按1到n排列,然后考虑互换,如果互…

02 _ 架构分层:我们为什么一定要这么做?

在系统从0到1的阶段,为了让系统快速上线,我们通常是不考虑分层的。但是随着业务越来越复杂,大量的代码纠缠在一起,会出现逻辑不清晰、各模块相互依赖、代码扩展性差、改动一处就牵一发而动全身等问题。 这时,对系统进…

基于OGG实现Oracle实时同步MySQL

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

Python---函数定义时缺省参数(参数默认值)---放最右边

缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时 可 不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)。 比如:原先的代码&#…

[修订版][工控]SIEMENS S7-200 控制交通红绿灯程序编写与分析

下载地址>https://github.com/MartinxMax/Siemens_S7-200_Traffic_Light 特别鸣谢接线过程实验目的题目要求I/O分配公式公式套用示例 程序分析分割块[不是必要的,自己分析用]左侧梯形图 [B1-B5]B1 [东西绿灯亮25s]B2 B3 B23 [东西绿灯闪烁3s]B4 [东西黄灯亮2s]B5 [东西红灯…

Kafka配置SASL认证密码登录

​​​​​​1、修改config/server.properties,添加如下内容 listenersSASL_PLAINTEXT://内网ip:9092 advertised.listenersSASL_PLAINTEXT://外网ip:9092 security.inter.broker.protocolSASL_PLAINTEXT sasl.mechanism.inter.broker.protocolPLAIN sasl.enabled.…

SQL 中的运算符与别名:使用示例和语法详解

SQL中的IN运算符 IN运算符允许您在WHERE子句中指定多个值,它是多个OR条件的简写。 示例:获取您自己的SQL Server 返回所有来自’Germany’、France’或’UK’的客户: SELECT * FROM Customers WHERE Country IN (Germany, France, UK);语…

Linux基本指令及周边(第二弹)

文章目录 前言echo命令重定向more命令less指令(重要)head指令tail指令时间相关的指令Cal指令find指令:(非常重要) -namegrep指令.zip/unzip指令:tar指令(重要):打包/解包…

感恩有你|恭喜 OpenTiny Vue 开源组件库喜迎1000+star!!!

OpenTiny社区的 TinyVue 组件库终于突破1000star~ 感谢所有支持 OpenTiny 开源社区的朋友们! 对此,参与 OpenTiny 开源的各位项目成员也是十分激动和开心,因此也是在内部进行了一个小小的庆祝。同时大家也希望持续不断的将项目做的越来越好&a…

原生javascript实现放大镜效果

效果图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>放大镜</title><style&g…

Robots 元标签与 X-Robots 标签

Robots Meta Tag 和 X-Robots-Tag 是两个常用的 HTML 标签&#xff0c;它们对观察机动爬虫和其他网络机器人很有启发性。这些标签可以控制您的网页如何被记录和显示。 什么是机器人元标记&#xff1f; 机器人元标记是一个 HTML 标签&#xff0c;它提供信息来查看电机爬虫和其…

【Python篇】详细讲解正则表达式

文章目录 &#x1f339;什么是正则表达式&#x1f354;语法字符类别重复次数组合模式 ✨例子 &#x1f339;什么是正则表达式 正则表达式&#xff08;Regular Expression&#xff09;&#xff0c;简称为正则或正则表达式&#xff0c;是一种用于匹配、查找和操作文本字符串的工…