深入了解JVM和垃圾回收算法

1.什么是JVM?

      JVM是Java虚拟机(Java Virtual Machine)的缩写,是Java程序运行的核心组件。JVM是一个虚拟的计算机,它提供了一个独立的运行环境,可以在不同的操作系统上运行Java程序。

2.如何判断可回收垃圾对象

     Java中的垃圾回收器使用的是“可达性分析”算法来判断对象的可达性。这个算法从一组称为“GC Roots”的对象作为起点,通过引用链追踪所有的引用对象,如果一个对象无法通过任何引用链与GC Roots相连,那么这个对象就是不可达的,即可被判断为垃圾对象。

在Java中,GC Roots是指一组对象,它们被认为是活动的,即不会被垃圾回收器回收的对象。GC Roots包括以下几种实例:

  1. 虚拟机栈(Java虚拟机栈中的局部变量表)中引用的对象
  2. 方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中JNI(Java Native Interface)引用的对象
  5. 活动的线程

3.常见的垃圾算法

  1.标记-清除算法(Mark and Sweep)

       这是最基本的垃圾回收算法之一。在这个算法中,JVM会首先标记所有活动对象,然后清除所有未标记的对象,释放它们所占用的内存空间。缺点:碎片化。

  2.复制算法(Copying)

       这个算法将内存空间划分为两个相等的区域,当一个区域的内存用尽时,JVM会将存活的对象复制到另一个区域,然后清除原区域中的所有对象。这个算法的优点是简单高效,但缺点是需要额外的内存空间。

   3.标记-整理算法(Mark and Compact)

       这个算法结合了标记-清除和复制算法的优点,它首先标记所有活动对象,然后将它们向一端移动,清除另一端的所有对象,从而整理内存空间。缺点:效率比copy略低。

  4.分代收集算法(Generational Garbage Collection)

       是一种用于垃圾回收的策略,它根据对象的存活周期将堆内存分为新生代和老年代,并针对不同代的对象采用不同的垃圾回收算法和策略。

新生代:包括Eden空间和两个Survivor空间(From和To)

老年代:包含长期存活的对象

分代收集算法通常包括以下两个主要的垃圾回收策略:

  1. 新生代垃圾回收:由于大部分对象的生命周期很短,因此新生代的垃圾回收频率较高。通常采用复制算法(Copying)来进行垃圾回收,即将新生代的Eden空间和Survivor空间之间进行对象复制,清除不再使用的对象。这样可以有效地清理短期存活的对象,减少垃圾回收的开销。
  2. 老年代垃圾回收:由于老年代包含长期存活的对象,因此老年代的垃圾回收频率较低。通常采用标记-清除(Mark-Sweep)或标记-整理(Mark-Compact)算法来进行垃圾回收,以清理老年代中的不再使用的对象,并整理内存空间,减少内存碎片化。

4.在分代算法的基础之上,有哪些垃圾回收器

(1)Serial 

      Serial收集器采用复制算法(Copying)来进行新生代的垃圾回收。在进行垃圾回收时,Serial收集器会将新生代的Eden区和两个Survivor区之间进行对象复制,清除不再使用的对象。由于它是单线程的,因此在进行垃圾回收时会暂停应用程序的运行,这种方式被称为“Stop-The-World”。

(2)ParNew

      ParNew收集器是一种专门针对新生代的垃圾回收进行了优化的并行垃圾回收器,适用于需要高吞吐量和对响应速度要求较高的应用场景。

(3)Parallel Scavenge

      Parallel Scavenge收集器的设计目标是在多核CPU环境下提供高吞吐量的垃圾回收能力,即在尽量减少垃圾回收暂停时间的同时,尽可能多地利用CPU资源来进行垃圾回收。它采用复制算法(Copying)来进行新生代的垃圾回收,同样会将新生代的Eden区和Survivor区之间进行对象复制,清除不再使用的对象。

(4)CMS

       CMS收集器的垃圾回收过程分为两个阶段:标记阶段和清除阶段。在标记阶段,CMS收集器会通过多线程并发地标记出所有需要回收的对象;在清除阶段,CMS收集器会通过多线程并发地清除标记出来的垃圾对象。优点:减少垃圾回收暂停时间,提高应用程序的响应速度。

(5)Serial Old

       Serial Old收集器是一种专门针对老年代的垃圾回收进行了优化的串行垃圾回收器,适用于对吞吐量要求不是很高,但对内存占用和延迟要求较低的应用场景。

(6)Parallel Old

       Parallel Old收集器用于老年代的垃圾回收,采用多线程并行的方式进行垃圾回收操作,适用于对吞吐量要求较高的应用。

 

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

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

相关文章

HarmonyOS开发(一):开发工具起步

1、DevEco Studio 工具下载地址:HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 DevEco Studio基础配置 Node.jsOhpm 这两个都可以在进入IDE时在工具上选择下载安装 2、HelloWorld工程 打开DevEco,那么会进入欢迎页,点击Create Project---…

数字三角形模型 笔记

方格取数 走两次的最大值 f[k][i1][i2]来表示 k i1 j1 i2 j2; 每一个状态可由四种状态转换来,分别为 第一条路走下,第二条路走下 第一条路走下,第二条路走右 第一条路走右,第二条路走下 第一条路走右,第二条…

ChatGPT重磅升级 奢侈品VERTU推出双模型AI手机

2023年11月7日,OpenAI举办了首届开发者大会,CEO Sam Altman(山姆奥尔特曼)展示了号称“史上最强”AI的GPT-4 Turbo。它支持长达约10万汉字的输入,具备前所未有的长文本处理能力,使更复杂的互动成为可能。此外,GPT-4 Turbo还引入了跨模态API支持,可以同时处理图片、视频和声音,从…

Layer 2 真的为以太坊扩容了吗?

构建一个安全、对用户友好的去中心化网络的愿景,依赖于关键基础设施的发展。这个愿景由一个共享的经济框架支持,得到了亿万人的拥护。Layer 2 的扩展解决方案在构建这一基础和增强以太坊的能力方面起着至关重要的作用。这些项目相互协作,形成…

Arduino ESP8266使用AliyunIoTSDK.h连接阿里云物联网平台

文章目录 1、AliyunIoTSDK简介2、相关库安装3、阿里云创建产品,订阅发布4、对开源的Arduino ESP8266源代码修改5、使用阿里云点亮一个LED灯6、设备向阿里云上传温度数据7、项目源码 1、AliyunIoTSDK简介 AliyunIoTSDK是arduino的一个库,可以在arduino的…

基于若依的ruoyi-nbcio流程管理系统增加流程设计器支持自定义表单的选择与处理

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 因为之前不支持在流程设计器进行自定义业务表单的关联选择,所以这部分实现这个。 1、前端 对…

域名反查Api接口——让您轻松查询域名相关信息

在互联网发展的今天,域名作为网站的唯一标识符,已经成为了企业和个人网络营销中不可或缺的一部分。为了方便用户查询所需的域名信息,API接口应运而生。本文将介绍如何使用挖数据平台《域名反查Api接口——让您轻松查询域名相关信息》进行域名…

青少年编程学习 等级考试 蓝桥杯/NOC/GESP等比赛资料合集

一、博主愚见 在当今信息技术高速发展的时代,编程已经成为了一种必备的技能。随着社会对于科技人才的需求不断增加,青少年编程学习正逐渐成为一种趋势。为了更好地帮助青少年学习编程,提升他们的技能和素质,博主结合自身多年从事青…

c语言-数据结构-链表分割

链表分割实际上是给定一个值,遍历链表把链表中小于该值的节点与大于该值的节点分开,一般是将小于该值的节点放到链表的前面部分,大于该值的节点放在链表的后面部分。 链表分割示意图如下: 思路: 首先创建两条带哨兵位节…

Java18新增特性

前言 前面的文章,我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15、Java16、Java17 的特性进行了介绍,对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 Java14新增特性 Java15新增特性 Java…

JDK并发修改异常的一个“BUG“

很多电商公司早期的架构都是基于PHP,所以我身边会有很多很厉害的PHP老哥,但现在都在写Java。昨天看到他在看Java的并发修改异常,正打算秀一波操作,却被他的一个问题难住了: public class ForeachTest {public static …

数据分析-numpy

numpy numpy numpy简介优点下载ndarray的属性输出数据类型routines 函数ndarray对象的读写操作ndarray的级联和切分级联切分 ndarray的基本运算广播机制(Broadcast)ndarry的聚合操作数组元素的操作numpy 数学函数numpy 查找和排序 写在最后面 简介 nump…

CSS 滚动捕获 scroll-snap-type

scroll-snap-type 语法实例 捕获轴 y 捕获严格程度 mandatory捕获轴 y 捕获严格程度 proximity同理看下捕获轴 x 一些注意事项兼容性 scroll-snap-type 用来指定一个滚动容器(scroll container)是否是滚动捕获容器(scroll snap container)、捕获的严格程度以及在什么方向上执行…

61基于matlab的GWO算法的参数工具箱,图形界面,目标函数的默认名称为CostFunction。

基于matlab的GWO算法的参数工具箱,图形界面,目标函数的默认名称为CostFunction。如果您查看了CostFunction.m文件,成本函数获取向量([x1 x2…xn])中的变量并返回目标值。可以在该文件中编写目标函数,也可以…

【计算机网络笔记】IP子网划分与子网掩码

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

Perl爬虫程序的框架

Perl爬虫程序的框架,这个框架可以用来爬取任何网页的内容。 perl #!/usr/bin/perl use strict; use warnings; use LWP::UserAgent; use HTML::TreeBuilder; # 创建LWP::UserAgent对象 my $ua LWP::UserAgent->new; # 设置代理信息 $ua->proxy(http, ); …

ZooKeeper+Kafka+ELK+Filebeat集群搭建实现大批量日志收集和展示

大致流程:将nginx 服务器(web-filebeat)的日志通过filebeat收集之后,存储到缓存服务器kafka,之后logstash到kafka服务器上取出相应日志,经过处理后写入到elasticsearch服务器并在kibana上展示。 一、集群环…

Python实现WOA智能鲸鱼优化算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提…

web3 React dapp进行事件订阅

好啊,上文web3 React Dapp书写订单 买入/取消操作 我们已经写好了 填充和取消订单 这就已经是非常大的突破了 但是 留下了一个问题 那就是 我们执行完之后 订单的数据没有直接更新 每次都需要我们手动刷新 才能看到结果 那么 今天我们就来看解决这个问题的事件订阅 …

使用 `open-uri.with_proxy` 方法打开网页

Ruby 爬虫程序如下: require open-uri require nokogiri# 定义代理信息 proxy_host jshk.com.cn# 定义要爬取的网页 URL url http://www.example.com# 使用代理信息打开网页 open-uri.with_proxy(proxy_host, proxy_port) do |proxy|# 使用 Nokogiri 库解析网页内…