Java垃圾搜集算法和垃圾回收算法

垃圾回收主要针对的是JVM的堆内存,分为新生代和老年代。

按照以前的叫法,还有一个永久代,它在方法区里保存了class信息、静态变量、常量池等。

从jdk-1.8开始,方法区的实现发生了一些变化,取消了永久代的概念,多出了一个叫做元空间的概念。
在内存上独立了出来,跟老年代不再是物理上连续的,直接使用了JVM的内存。

这样会使得内存溢出的可能性进一步减小,空间大小变得更容易扩展。
与此同时,方法区也将一部分数据转移了出去,比如类的静态变量、字符串常量池等都放到了堆内存当中。这个变化从1.8后正式开始。

我们平时所讨论的JVM,都是Hopspot版本。刚才提到的永久代,是Hopspot特有的。

在堆内存中,从垃圾回收的范围上说,一般分为两种,新生代的垃圾回收叫Young GC,老年代的垃圾回收通常伴随着新生代的垃圾回收,叫做Full GC。

对垃圾的处理分为搜集算法和回收算法。

垃圾搜集算法

首先需要标记出需要回收的对象,也就是要确定哪些是垃圾。有两种方法,一种叫引用计数法,另一种叫做可达性分析算法。

引用计数法
每个对象都会有一个引用计数器,每当有一个引用指向这个对象的时候,对象的计数器就+1,这样的话,只要观察这个对象的引用计数器,数值>0,就表示还有人在使用,这个对象就不能回收。

当引用计数器=0时,表示没有任何引用指向这个对象,该对象已经不可访问,那么垃圾搜集器就可以回收它。

引用计数法的缺点:如果有两个对象都是垃圾,但它们之间相互引用,引用计数器就永远不可能为0。

可达性分析算法
因此,Java使用了一种叫做可达性分析的算法,就是从整个堆内存的根对象出发,看看有多少对象是可达的,有多少是不可达的,无法到达的也就意味着无法访问,自然就是垃圾了。

谁可以作为根对象呢?
  • 栈中引用的对象(栈)
  • 类静态属性引用的对象(方法区)
  • 常量引用的对象(方法区)
  • native方法引用的对象(本地方法栈)

垃圾回收算法

标记好垃圾之后,就可以回收了,下面介绍3种回收的算法。

标记-清除法
当垃圾回收器将内存扫描之后,会标记出所有垃圾对象,然后将他们回收。

缺点:不断产生大量的内存碎片,使得内存的使用率变得越来越低。

标记-整理法
在清理垃圾的基础上,多了一步碎片整理的工作。

这样的工作不适合高频率执行,一般,当老年代的空间不足时,会触发一次Full GC,这时就会做碎片整理工作。

复制算法
准备两块一模一样的内存,当第一块内存空间不足时,将所有需要保留的对象拷贝至另一块内存。

然后将前一块内存直接清空。

这样,就既做到了垃圾回收,又做到了碎片整理。

缺点:内存空间浪费一倍

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ管理界面介绍

1.管理界面概览 connections: 无论生产者还是消费者,都需要与RabbitMQ建立连接后才可以完成消息的生产和消费,在这里可以查看连接情况 channels: 通道,建立连接后,会形成通道,消息的投递获取依…

【网络编程】自定义协议+Json序列化与反序列化

文章目录 一、序列化与反序列化概念二、自定义协议设计网络计算机2.1 服务端2.1.1 服务端业务处理流程2.1.2 TCP的发送与接收缓冲区2.1.3 保证读取完整报文2.1.4 自定义协议——序列化与反序列化2.1.4.1 请求2.4.1.2 响应 2.1.5 计算流程2.1.6 在有效载荷前添加长度报头2.1.7 发…

威胁建模之绘制数据流图

0x00 前言 1、什么是威胁建模: 以结构化的方式思考、记录并讨论系统存在的安全威胁,并针对这些威胁制定相应的消减措施。 2、为什么要威胁建模: (1)在设计阶段开展威胁建模,一方面可以更全面的发现系统存…

处理glibc堆栈缓冲区溢出漏洞(CVE-2018-11236)

GNU C Library(又名glibc,libc6)是一种按照LGPL许可协议发布的开源免费的C语言编译程序。 GNU C库(aka glibc或libc6)中的stdlib/canonicalize.c处理非常长的路径名参数到realpath函数时,可能会遇到32位体系…

Electron中启动node服务

记一次遇到的问题,我们知道Electron 中主进程是在node环境中,所以打算在node环境中再启动一个node服务。但是直接使用exec命令启动就会卡主。对应的代码如下 // 启动Node server const startServer async () > {try {console.log(开始启动node serv…

Docker学习笔记11

Docker容器镜像: 1)docker client 向docker daemon发起创建容器的请求; 2)docker daemon查找本地有客户端需要的镜像; 3)如无,docker daemon则到容器的镜像仓库中下载客户端需要的镜像&#…

CSS基础

文章目录 前言CSS基本语法CSS选择器CSS基本选择器标签选择器 p类选择器 .pID选择器 #p CSS后代选择器 div pCSS子选择器 div>pCSS群组选择器 p,p1CSS伪类选择器:first-of-type 父类第一个:last-of-type 父类最后一个:nth-of-type(n) 父类第n个 CSS使用方式行内样式内嵌样式外…

poi生成excel饼图设置颜色

效果 实现 import com.gideon.entity.ChartPosition; import com.gideon.entity.LineChart; import com.gideon.entity.PieChart; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xddf.usermodel.PresetColo…

深度学习(23)——YOLO系列(2)

深度学习(23)——YOLO系列(2) 文章目录 深度学习(23)——YOLO系列(2)1. model2. dataset3. utils4. test/detect5. detect全过程 今天先写YOLO v3的代码,后面再出v5&…

电脑出现0xC1900101错误怎么办?

在更新或安装Windows操作系统时,有时系统会提示出现了0xC1900101错误。这个错误的出现通常是源于与驱动程序相关的错误所致。那么当电脑出现0xC1900101错误时该怎么办呢? 为什么会出现错误代码0xC1900101? 通常情况下,有以下几个…

使用Python批量进行数据分析

案例01 批量升序排序一个工作簿中的所有工作表——产品销售统计表.xlsx import xlwings as xw import pandas as pd app xw.App(visible False, add_book False) workbook app.books.open(产品销售统计表.xlsx) worksheet workbook.sheets # 列出工作簿中的所有工作表 fo…

通用分页【下】(将分页封装成标签)

目录 一、debug调试 1、什么是debug调试? 2、debug调试步骤 3、实践 二、分页的核心 三、优化 分页工具类 编写servlet jsp代码页面: 分页工具类PageBean完整代码 四、分页标签 jsp代码 编写标签 tld文件 助手类 改写servlet 解析&…