在上一篇BOSS级打脸专业户中我们说过,自动内存管理分为两部分:给对象分配内存和回收分配给对象的内存。这篇我们说说后者,即回收分配给对象的内存。回收内存要用到垃圾收集机制,英文名儿是GC(Garbage Collection)。

在本部分我们要解决我做男妓的那些日子如下几个问题:

  1. 哪些内存需要回收?
  2. 什么时候回收?
  3. 如何回收?

哪些内存需要回收?

堆和方法区的内存需要回收,其余的不需要回收。
因为只有堆和方法区是线程共享的,其余的是与线程“同生共死”的,线程结束,内存自然就跟着回收了,所以不用管它们。

什么时候回收?

(1)在堆里面:

当柳心眉慕容逸飞对象“死了”的时候就要对其进行内存回收了。啥叫对象死了?就是没有地方引用它了,它无用了。那怎么判断它是否死了呢?有两种方法。

引用计数算法
给对象添加一个引用计数器,每当有一个地方引用它时,计数器的值就+1,当引用失效时,计数器的值就-1,当计数器的值为0时,代表此对象已不被引用,也就是“可以死了”。
但这有一个弊端,就是循环引用的问题。就像下图,堆里的两个对象即使无用了也没办法对其进行回收,因为它们互相引用着,计数器的值至少为1。

可达性分析
所有生成的对象都是一个称为“GC Roots”的根的子树。纽约今天还好吗从GC Roots开始向下搜索,搜索所经过的路径称为引用链。当一个对象到GC Roots没有任何引用链可以到达时,就称这个对象是不可达的,也就是可以被GC回收了。这个是Java中采用较多的方式。
就像下图中的堆中未被引用的对象,就可以对其进行回收。

看到此,本仙女就要提问了:怎么判断一个对象是否还存在着引用?java中的引用分为4种:

强引用:Object o=new Object(),只要强引用存在,GC永远不会回收掉被引用的对象。
软引用:描述一些还有用但非必需的对象。当系统即将发生内存溢出了,就会对其进行回收。
弱引用:只要进行GC,就会对其进行回收。
虚引用:这是最弱的一种引用关系,无法通过虚引用来取得一个对象实例。它的作用是:能在这个对象被收集器回收时收到一个系统通知。

(2)在方法区里面:

我们顾沐青慕南霆知道,方法区里存储的是已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。所以我们在方法区里面进行垃圾回收,回收的是一些废弃的常量和无用的类。

怎么判断一个常量是否被废弃了?
薛安小说主角看引用计数就可以,如果没有对象引用该常量,则说明此常量被废弃了,也就可以回收了。

怎么判断一个类是无用的类?
有3种情况:
a、该类所有的实例都已经被回收。
b、加载该类的ClassLoader已经被回收。
c、该类对应的java.lang.Class对象没有任何地方被引用,无法在生而为王萧阳叶云舒免费阅读任何地方通过反射访问该类的方法。

如何回收?

有4种算法作为理论:

• 标记-清除算法
• 复制算法
• 标记-整理算法
• 分代收集算法

有5种收集器作为实现:

这一部分在以前博客中讲过,不再赘述啦:【JVM】初识JVM(下)

后记

内存溢出:系统无法再分配出你需要的空间。比如在堆中无法再给新生的对象分配内存了,在栈里栈满了无法再让新栈帧进栈了。穿书后我嫁给了残疾暴君

内存泄漏:内存被对象占用着不还,就叫内存泄露。

一直为小可爱努力着 www.kuaikanxs.cc

转载于:https://www.cnblogs.com/Katerina/p/11377374.html

JVM(3)-垃圾收集机制相关推荐

  1. JVM之垃圾收集机制四种GC算法详解

    JVM之四种GC算法详解 目录: 什么是GC? GC算法之引用计数法 GC算法之复制算法(Copying) GC算法之标记清除(Mark-Sweep) GC算法之标记压缩(Mark-Compact) ...

  2. 【JVM】第三章 垃圾收集机制

    第三章 垃圾收集机制 文章目录 第三章 垃圾收集机制 一.垃圾标记算法 1.引用计数算法 2.根可达性分析算法 二.垃圾收集算法 1.标记 - 清除算法 2.复制算法 3.标记 - 压缩算法 4.对比 ...

  3. Java教程分享:JVM垃圾回收机制之对象回收算法

    前言 在前面的文章中,介绍了JVM内存模型分为:堆区.虚拟机栈.方法区.本地方法区和程序计数器,其中堆区是JVM中最大的一块内存区域,在Java中的所有对象实例都保存在此区域,它能被所有线程共享. 在 ...

  4. 4、JVM垃圾回收机制、新生代的GC、GC(Minor GC、FullGC)、GC日志、JVM参数选项、元空间(笔记)

    4.JVM垃圾回收机制 4.1.新生代的GC 4.1.1.串行GC(SerialGC) 4.1.2.并行回收GC(Parallel Scavenge) 4.1.3.并行GC(ParNew) 4.2.G ...

  5. Java垃圾收集机制

    本文是<深入理解Java虚拟机>一书中第三章的读书总结. 前面介绍了Java内存结构和HotSpot虚拟机在堆内存中管理对象的过程.不过,在Java程序中对象的创建是非常频繁的,而内存的大 ...

  6. JAVA垃圾收集机制剖析

    1.垃圾收集算法的核心思想 Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象.该机制能够有效防范动态内存分配中可能发生的两个危急:因内存垃圾过多而引发的内存耗尽 ...

  7. jvm对象从新生代到老年代_JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代...

    内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...

  8. JVM内存区域(Java内存区域)、JVM垃圾回收机制(GC)初探

    一.JVM内存区域(Java内存区域) 首先区分一下JVM内存区域(Java内存区域)和Java内存模型(JMM)的概念.Java线程之间的通信采用的是共享内存模型,这里提到的共享内存模型指的就是Ja ...

  9. JVM(四)--垃圾收集器

    JVM(四)–垃圾收集器 这篇博客的内容包括: 一.垃圾收集器: 1,Serial 收集器: 2,ParNew 收集器: 3, Parallel Scavenge 收集器: 4,Serial Old收 ...

  10. JVM垃圾清理机制详解 ✨ 每日积累

    JVM垃圾清理机制详解 jvm内存结构中有一块地方叫做堆内存,里面存放着我们应用创建的对象,但是我们堆内存有限,对象在运行的时候持续创建,jvm有垃圾清理机制来清理对象确保堆内存的可用空间. 清理流程 ...

最新文章

  1. c# equals与==的区别
  2. STM32单片机工作日记
  3. php添加公告代码,为wordpress增加网站公告功能
  4. 外媒:三星电子预计三季度营收创新高是得益于半导体业务
  5. python距离向量路由算法_python算法练习——动态规划与字符串的编辑距离
  6. 超越存储,历久弥新!新华三发布入门级存储产品
  7. 阿里达摩院420集python_阿里达摩院推荐的420集的python教程,入门到精通简直不要太简单...
  8. 齐全且实用的MySQL函数使用大全
  9. Python简答题编程题
  10. WebSocket 实现聊天功能
  11. biostar handbook(十一)|基因组变异的表示形式
  12. spark web ui中的skipped的含义
  13. Ubuntu20.04 安装ROS2 Foxy
  14. Improving Deep Neural Networks:Initialization and Regularization
  15. 20155314 2016-2017-2 《Java程序设计》第10周学习总结
  16. obsidian之快速拆分文件的插件note-refactor操作手册
  17. Ubuntu 12.04配置静态ip和动态ip
  18. dns docker_使用DNS缓存修复Docker中的DNS超时[教程]
  19. python 计算面积 比计算几何慢_计算几何相关 - osc_kbyywydz的个人空间 - OSCHINA - 中文开源技术交流社区...
  20. WebRTC通话INCOMPATIBLE_DESTINATION问题排查、verto与STUN协议

热门文章

  1. Unity篇——Minimap小地图
  2. 线性拟合——离群点outliers的处理
  3. mac 恢复未能与服务_MacBook Pro无法与恢复服务器取得联系?
  4. Laravel多表连接,多个查询(Eloquent)
  5. Box Cox Transformation
  6. Android默认时区大全
  7. 【WSN通信】基于matlab A_Star改进LEACH多跳传输协议【含Matlab源码 487期】
  8. java公倍数_java中如何计算最小公倍数
  9. 用c语言编写6位计算器,用c语言编写易简计算器.doc
  10. harmonyos下载安装,HarmonyOS系统