深入了解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.hqwc.cn/news/169613.html

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

相关文章

远程电脑未连接显示器时分辨率太小的问题处理

背景:单位电脑显示器坏了,使用笔记本通过向日葵远程连接,发现分辨率只有800*600并且不能修改,网上找了好久找到了处理方法这里记录一下,主要用到的是一个虚拟显示器软件usbmmidd_v2 1)下载usbmmidd_v2 2)…

js案例:打地鼠游戏(打灰太狼)

效果预览图 游戏规则 当灰太狼出现的时候鼠标左键点击灰太狼加10分,小灰灰出现的时候鼠标左键点小灰灰击减10分,不点击不减分不加分。 整体思路 1.把获取背景图片中每个地洞的位置,把所有位置放到一个数组中。 2.封装随机数函数,随…

RSA 2048位算法的主要参数N,E,P,Q,DP,DQ,Qinv,D分别是什么意思 哪个是通常所说的公钥与私钥 -安全行业基础篇5

非对称加密算法RSA 在RSA 2048位算法中,常见的参数N、E、P、Q、DP、DQ、Qinv和D代表以下含义: N(Modulus):模数,是两个大素数P和Q的乘积。N的长度决定了RSA算法的安全性。 E(Public Exponent&a…

vite基础学习笔记:14.路由跳转(二)携带query参数

说明:自学做的笔记和记录,如有错误请指正 1. 路由跳转(携带query参数) (1)第一层路由(点击卡片路由跳转至新页面-携带query参数) 知识点: query传参对应的是path和qu…

移动医疗科技:开发互联网医院系统源码

在这个数字化时代,互联网医院系统成为了提供便捷、高效医疗服务的重要手段。本文将介绍利用移动医疗科技开发互联网医院系统的源码,为医疗行业的数字化转型提供有力支持。 智慧医疗、互联网医院这一类平台可以通过线上的形式进行部分医疗服务&#xff…

数据结构与算法C语言版学习笔记(3)-线性表的链式结构:链表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言:回顾顺序表的优缺点:为什么要引入链式结构的线性表? 一、什么是链表?二、链表的分类①为什么要设置头节点&…

【计网 传输层概述】 中科大郑烇老师笔记 (十)

目录 0 引言1 概述1.1 传输服务和协议1.2 传输层 vs 网络层1.3 Internet传输层协议 TCP和UDP 2 多路复用、解复用2.1 UDP的多路复用2.2 TCP的多路复用 3 UDP3.1 概述3.2 UDP报文段3.3 拓展:TCP报文段 🙋‍♂️ 作者:海码007📜 专栏…

Apipost-Helper:IDEA中的类postman工具

今天给大家推荐一款IDEA插件:Apipost-Helper-2.0,写完代码IDEA内一键生成API文档,无需安装、打开任何其他软件;写完代码IDEA内一键调试,无需安装、打开任何其他软件;生成API目录树,双击即可快速…

postman上传照片,视频,音频等上传文件操作测试方法

Postman上传照片,视频,音频等上传文件操作测试方法 新建一个request,更改请求方式,点击Body 勾选form-data ,key后面下拉框选择File 上一步勾选后Value即出现选择本地文件按钮,填写Key,选择文件即可 此时…

国际阿里云:无法ping通ECS实例公网IP的排查方法!!!

无法ping通ECS实例的原因较多,您可以参考本文进行排查。 问题现象 本地客户端无法ping通目标ECS实例公网IP,例如: 本地客户端为Linux系统,ping目标ECS实例公网IP时无响应,如下所示: 本地客户端为Windo…

微信支付服务商消费者投诉及时处理与商户违规及时通知,支持多服务商

大家好,我是小悟 微信直连商户处理消费者投诉的功能解决了很多商户对于投诉处理不及时而导致商户号出现异常的问题,可以说解决了实实在在的问题。 很多小伙伴私信说自己是服务商角色,也需要微信支付服务商处理消费者投诉的功能,…

2023第六届泰迪杯数据分析

第六届带队”指导“请私信本人,团队包含技能赛双一等,数学建模省一,泰迪杯挖掘国一,研究生队友。 去年一等作品可视化图如下,私信获取源码