返回顶部
首页 > 资讯 > 后端开发 > Python >JVM的内存回收及常见算法小结
  • 119
分享到

JVM的内存回收及常见算法小结

JVM内存回收 2023-05-18 11:05:08 119人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

什么样的对象应该被回收? 某个对象不再被栈直接或间接地引用,此时就应该被回收了。 o被指向null的时候,new Object()创建的对象就不在被栈引用了,可以被回收。 p1和

什么样的对象应该被回收?

某个对象不再被栈直接或间接地引用,此时就应该被回收了。

o被指向null的时候,new Object()创建的对象就不在被栈引用了,可以被回收。

p1和personList均不再指向第一个Person对象的时候,第一个Person对象、list对象可以被回收。

经历前面的几个阶段,内存引用是这样的情况。

p1 = null后,p1曾经指向的对象虽然不再被栈直接引用,但是仍然间接通过persons引用。

此时p1指向的对象和list指向的对象都可以被回收了。

怎么样确定哪些需要回收?

对我们仍然需要使用的对象进行标记,回收没有标记的对象。

以此为例,如何进行标记的呢?

垃圾回收进行之前,所有对象的标记位是0

如果仅仅标记栈直接引用的对象,p1就会被回收,但是p1间接被list引用,因此也被标记为1

标记算法

-Stop the World(GC Root可达性算法)

在进行上面的标记过程的时候,如果有新的对象被创建,而刚好被标记过程错过的时候,就可能错误地把有用的对象给回收掉,因为标记位是0.因此,Stop the World正如其名,将应用的核心线程停掉,开始专心标记。

-引用计数法

对对象进行引用数量的标记,没有引用的对象标记是0,有引用的对象标记是引用数量。清除标记为0的对象即可。但是引用计数法有个问题,无法解决循环引用的问题,导致内存泄露。

这里声明一个对象,内部包含一个跟自己一个类型的成员变量。

在执行第五行之前,两个对象的引用计数均为2,各自引用,加上n1和n2.

执行完第五六行以后,按道理,栈上已经不在引用这两个对象,可以被回收了,但是因为n1和n2相互引用,导致引用计数为1,无法正常回收。

清除算法

一般清除算法:直接将未标记的对象清理掉

经过清理,未标记的对象被回收。

但是存在内存碎片化的问题,只能从间隙处继续分配内存,

存在内存不连续的问题,内存空间浪费严重,容易oom

清除-整理算法:先清除没有标记的对象,然后将剩余的存活对象进行整理,让内存空间更加连续。

就是代价比较高,几乎需要移动所有的对象。

复制-清除算法:将活跃的对象复制到另一个内存区域,然后清除当前区域的所有对象!

完成复制后,清除原有的区域

这种算法的弊端就是需要更多的内存空间。

常见的GC类型

GC类别新生代垃圾回收老年代垃圾回收特点
Serial GC标记-复制&清除

标记-清除&整理

Stop the World

使用单个线程处理

适合小应用

Parallel GCJava 8默认垃圾回收器

Stop the World

使用多个线程处理

CMS GC标记-复制&清除

(Stop the World)

接近并行的标记-清除

初始标记->并发标记

-> 并发预清理->可中断预清理->重新标记->并发清除->并发重置

G1 GC

更细粒度的逻辑分区,更小的停顿时间

采用复制&整理-清理的方式,优先回收垃圾最多的区域

字符串的合并整理,多个相同的字符串合并到一起,移除冗余字符串对象

-XX:UseStringDeduplication
Z GC

不在维护映射,而是对象上保持一个标记来表示活跃对象

仅支持64位系统

采用重定位解决内存碎片化问题

Java 15

到此这篇关于JVM的内存回收及常见算法的文章就介绍到这了,更多相关JVM的内存回收内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JVM的内存回收及常见算法小结

本文链接: https://lsjlt.com/news/212051.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JVM的内存回收及常见算法小结
    什么样的对象应该被回收? 某个对象不再被栈直接或间接地引用,此时就应该被回收了。 o被指向null的时候,new Object()创建的对象就不在被栈引用了,可以被回收。 p1和...
    99+
    2023-05-18
    JVM内存回收
  • python常见运算符及用法小结
    目录算术运算符关系运算符逻辑运算符成员运算符身份运算符三目运算符运算符优先级算术运算符 运算符描述+两个数相加两个数相加,或是字符串连接-两个数相减*两个数相乘,或是返回一个重复若干...
    99+
    2024-04-02
  • Android常见的几种内存泄漏小结
    一、背景 最近在项目的版本迭代中,出现了一些内存问题的小插曲,然后自己花了一些时间优化了APP运行时内存大小的问题,特此做个总结,与大家分享。 二、简介 在Android程序开...
    99+
    2022-06-06
    小结 内存泄漏 Android
  • JVM内存回收问题的处理方法是什么
    JVM内存回收问题的处理方法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。重点讨论一下JVM内存回收问题的解决方法,通常我们说的JVM内存回收总是在指堆内存回收,确实...
    99+
    2023-06-17
  • 浅谈JVM垃圾回收有哪些常用算法
    一、前言: 垃圾回收: 在未来的JDK中可能G1会为ZGC所取代 先问自己几个问题: 什么是垃圾? 垃圾就是堆内存中(范指)没有任何指针指向的对象实体。不具有可达性。 为...
    99+
    2024-04-02
  • jvm回收机制的算法有哪些
    JVM的垃圾回收机制有以下几种算法:1. 标记-清除算法(Mark and Sweep):首先从根节点开始标记,然后遍历整个对象图,...
    99+
    2023-08-24
    jvm
  • JVM垃圾回收算法的示例分析
    这篇文章主要介绍了JVM垃圾回收算法的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。新一代JVM垃圾回收算法JVM垃圾回收的瓶颈传统分代JVM垃圾回收方式,已经在一定...
    99+
    2023-06-17
  • Linux回收内存的方法
    这篇文章主要讲解了“Linux回收内存的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux回收内存的方法”吧!1、Linux 内存监控内存泄漏的定义:  一般我们常说的内...
    99+
    2023-06-16
  • 解读Jvm的内存结构与GC及jvm参数调优
    目录一、JVM 内存结构1、类加载子系统2、方法区(method)3、堆(heap)4、栈(stack)5、本地方法栈6、pc寄存器(了解即可)7、执行引擎8、垃圾收集器二、堆&nd...
    99+
    2023-05-19
    Jvm内存结构 jvm参数调优 Jvm的内存结构与GC
  • JVM的垃圾回收算法一起来看看
    目录垃圾回收算法概念1.标记算法1.1 引用计数法(Reference Counting)1.2 可达性分析算法(Reachable Analysis)2.回收算法2.1 标记清除算...
    99+
    2024-04-02
  • 常见的JavaScript内存错误及解决方法
    目录1.计时器的监听2.事件监听3.Observers4. Window Object5. 持有DOM引用前言: JavaScript 不提供任何内存管理操作。相反,内存由 Java...
    99+
    2024-04-02
  • JVM分配和回收堆外内存的方式与注意点
    目录JVM内存模型如何分配堆外内存第一种方式:ByteBuffer#allocateDirect第二种方式:Unsafe#allocateMemory如何回收堆外内存第一种方式:Un...
    99+
    2024-04-02
  • V8的内存管理与垃圾回收算法是什么
    今天小编给大家分享一下V8的内存管理与垃圾回收算法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来...
    99+
    2024-04-02
  • Java常见知识点中Jvm内存结构、Java内存模型、Java对象模型的区别是什么
    这篇文章将为大家详细讲解有关Java常见知识点中Jvm内存结构、Java内存模型、Java对象模型的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。我们都知道,Java代码是要运行在...
    99+
    2023-06-05
  • iOS常见算法以及应用知识点总结
    算法比较 关键词 二分 递归 分治 回溯 冒泡排序 思想:两次循环,外层进行循环次数的控制,内层循环,进行数据之间的比较,大的数据上浮(下沉) #prag...
    99+
    2022-05-26
    iOS 算法 应用
  • 内存溢出、内存泄露的概述及常见情形
    内存溢出(OutofMemoryError) 简述 java doc 中对 Out Of Memory Error 的解释是,没有空闲内存,并且垃圾收集器也无法提供更多内存。 JVM 提供的内存管理机...
    99+
    2023-09-01
    jvm java 面试 内存泄露 内存溢出
  • Python内存管理方式和垃圾回收算法解析
    概要 在列表,元组,实例,类,字典和函数中存在循环引用问题。有 __del__ 方法的实例会以健全的方式被处理。给新类型添加GC支持是很容易的。支持GC的Python与常规的Python是二进制兼容的。 分...
    99+
    2022-06-04
    算法 内存管理 垃圾
  • C#中常见的内存管理问题及解决方法
    C#中常见的内存管理问题及解决方法,需要具体代码示例在C#开发中,内存管理是一个重要的问题,不正确的内存管理可能会导致内存泄漏和性能问题。本文将向读者介绍C#中常见的内存管理问题,并提供解决方法,并给出具体的代码示例。希望能帮助读者更好地理...
    99+
    2023-10-22
    内存泄漏 垃圾回收 资源释放
  • C++ 内存泄漏的常见原因及其解决方法
    常见 c++++ 内存泄漏原因:1. 忘记释放指针;2. 双重释放;3. 循环引用;4. 静态变量;5. 全局对象。解决方法:1. 使用智能指针;2. 注意循环引用;3. 避免静态变量;...
    99+
    2024-05-02
    c++ 内存泄漏
  • 常见的Python异常及处理方法总结
    目录一、错误与异常1.什么是错误2.什么是异常3.回溯信息二、常见异常常见异常类三.异常处理1.异常处理2.简单的异常处理格式3.执行顺序4.except分支可以有多个5.执行顺序6...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作