什么情况下JVM内存中的一个对象会被垃圾回收?
新生代满了会触发 Young GC,老年代满了会触发 Old GC。GC时会回收对象,那么具体是什么样的对象会被垃圾回收器回收呢?
- 可达性分析算法,判断是否被 GC Roots 引用
- 判断引用类型:强引用、软引用、弱引用、虚引用
- 是否调用
finialize()方法自救
首先,JVM 会通过可达性分析算法来判断哪些对象会被回收,哪些不会被回收。可达性分析算法会从一个对象触发,一层层向上,分析有谁在引用它,看是否有一个 GC Roots。
被 GC Roots 引用的对象就不会被垃圾回收。GC Roots 指的是局部变量,或者类的静态变量。具体可以看这篇文章:什么是被 GC Roots 直接引用的对象?。
其次,看引用类型。Java中有强引用、软引用、弱引用和虚引用:
- 强引用,被强引用的对象不会被回收
- 软引用,被软引用的对象一般并不会被回收,GC之后内存任然不够会被回收
- 弱引用,弱引用就像没有被引用,GC时直接回收
- 虚引用,很少用到需引用,可以忽略
所以总的来说:
- 有 GC Roots 的对象不能回收,没有 GC Roots 的对象可以回收
- 有 GC Roots 的对象,如果是软引用或者弱引用,也有可能被回收
最后,一个对象没有被 GC Roots 引用,是否立即就会被回收呢?
也不一定立即被回收,该类可以重写finialize()方法,在finialize()中让一个 GC Roots 重新引用这个对象,就能自救。
什么情况下JVM内存中的一个对象会被垃圾回收?的更多相关文章
- 在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法
在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法 ==========方法1: --------1. 选相应 ...
- 保留键的情况下取字典中最大的值(max\zip函数的联合使用)
在我们平常想要获取字典中value最大或者最小的值的时候,常常使用如下函数: testDict = {"age1":18,"age2":20,"age ...
- Java常量,变量,对象(字面量)在JVM内存中的存储位置
Java常量,变量,对象(字面量)在JVM内存中的存储位置 2019-02-26 18:13:09 HD243608836 阅读数 540 收藏 更多 分类专栏: JAVA jvm 苦苦研究了快 ...
- 在Java中谈尾递归--尾递归和垃圾回收的比较(转载)
我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...
- Java中谈尾递归--尾递归和垃圾回收的比较
一.首先我们讲讲递归 1.递归的本质是,某个方法中调用了自身,本质还是调用了一个方法,只是这个方法正好是自身而已 2.递归因为是在自身中调用自身,所以会带来以下三个显著特点: 1.调用的是同一个 ...
- 在Java中谈尾递归--尾递归和垃圾回收的比较
我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...
- Android内存优化5 了解java GC 垃圾回收机制3
引言 接App优化之内存优化(序), 作为App优化系列中内存优化的一个小部分. 由于内存相关知识比较生涩, 内存优化中使用到的相关工具, 也有很多专有名词. 对Java内存管理, GC, Andro ...
- C/C++中几种经典的垃圾回收算法
1.引用计数算法 引用计数(Reference Counting)算法是每个对象计算指向它的指针的数量,当有一个指针指向自己时计数值加1:当删除一个指向自己的指针时,计数值减1,如果计数值减为0,说明 ...
- JVM调优总结:分代垃圾回收详述
为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...
随机推荐
- 正式学习MVC 05
1.剃须刀模板razor的使用 1)混编 循环语法 @model List<MVCStudy.Models.Student> @{ ViewBag.Title = "List&q ...
- 与Nexus为Maven搭建私服
目录 Nexus 的概述 Nexus 安装与部署 Nexus 在 Windows 上安装与使用 安装 使用 Nexus 在 Linux 上安装与使用 Nexus 的概述 引用百度百科一段话 Nexus ...
- ubuntu下载eclipse详细步骤
1.官网下载 Eclipse IDE for Java EE Developers: https://www.eclipse.org/downloads/packages/ 2.安装eclipse将其 ...
- 有史以来最全的CMD命令
说在前面的话: 本篇是博主通过网上查找整理而成的,且都是亲测可以的一些cmd命令,可以说是很齐全了,当然,如果有不可以运行的代码,欢迎大家留言指出,我会不断完善的,谢谢. CMD作用: 掌握一些基本的 ...
- webpack的loader和plugin的区别
[Loader]:用于对模块源码的转换,loader描述了webpack如何处理非javascript模块,并且在buld中引入这些依赖.loader可以将文件从不同的语言(如TypeScript)转 ...
- freecplus框架,Linux平台下C/C++程序员提高开发效率的利器
目录 一.freecplus框架简介 二.freecplus开源许可协议 三.freecplus框架内容 字符串操作 2.xml解析 3.日期时间 4.目录操作 5.文件操作 6.日志文件 7.参数文 ...
- Mozilla的 Firefox Graphics 团队向社区寻求重现WebRender bug的方法
导读 Mozilla 的 Firefox Graphics 团队正在向社区寻求帮助,由于他们收到了一些随机发生的 UI 错误报告,却一直无法找出错误的重现步骤(STR),因此现在向外寻求社区用户的帮助 ...
- SpringBoot+AOP构建多数据源的切换实践
针对微服务架构中常用的设计模块,通常我们都会需要使用到druid作为我们的数据连接池,当架构发生扩展的时候 ,通常面对的数据存储服务器也会渐渐增加,从原本的单库架构逐渐扩展为复杂的多库架构. 当在业务 ...
- 数据采集实战:通过Python获取和分析Google趋势中Covid-19的关注程度
在传染病研究领域,社交媒体数据已被证明可作为预测感冒和流感季节的发作和进展的指标.在本文中,我们将使用Google Trends API来衡量与冠状病毒的状态.我们将使用python谷歌趋势API p ...
- 【转】sublime text 2中Emmet插件8个常用的技巧
因为开始做web项目,所以最近在用sublime编辑器,知道了一个传说中的emmet,原名是zen coding.html神插件可以说是.文章部分内容转自http://www.cnblogs.com/ ...