对象在什么情况下会被垃圾回收

垃圾回收是java虚拟机的一项主要的功能,今天来讲讲我现阶段对垃圾回收机制的理解,日后有新的感想再做补充,逐渐完善。如果有不对或者欠缺的地方,也请大家指正或者补充。

Java的虚拟机本身是蛮复杂的,我们不仔细讲细节。我们只针对我们平时最关心的中的哪些对象会被GC回收。我们这样思考,既然GC要回收这块内存,那总得有个方法让GC可以判断哪些对象时可以被回收而哪些是不能被回收的吧?这就引出了下面常见的两种判断方法。

  1. 引用计数法
  2. 可达性分析算法

引用计数法

这种方法是在对象的头处维护一个计数器Counter,当有一个引用指向对象的时候counter就加一,当不在引用此对象时就让counter减一。所以,当counter等于零的时候虚拟机就认为此对象时可以被回收的。看起来好像有点道理,但是这种方法存在一个致命的问题:

如上图所示:**外部对对象A有一个引用,对象A持有对象B,而对象B也持有一个对象C,对象C又持有对象A。如果对于对象A的引用r失效,按照引用计数方法,GC永远无法回收上面的三个对象。**所以基于上面的存在内存泄漏的巨大缺陷,Java虚拟机(应该是大多数虚拟机)不采用此方法进行回收内存。

可达性分析算法

Java就是使用此方法作为判断对象是否可被回收的。虚拟机会先将一些对象定义为GC Roots,从GC Roots出发一直沿着引用链向下寻找,如果某个对象不能通过GC Roots寻找到,那么虚拟机就认为该对象可以被回收。我们举个例子,如下图:

**当对象D不在引用对象A时,尽管A、B、C互相还持有引用,GC依然会回收ABC所占用的内存。**那么还有个疑问,什么样的对象可以被看做是GC Roots呢?

  • 虚拟机栈(栈桢中的本地变量表)中的引用的对象
  • 方法区中的类静态属性引用的对象
  • 方法区中的常量引用的对象
  • 方法区中的类静态属性引用的对象
  • 方法区中的常量引用的对象
  • 本地方法栈中JNI(Native方法)的引用的对象

怎么查看GC日志

1、在eclipse根目录下的eclipse.ini配置文件中添加以下参数:
-verbose:gc (开启打印垃圾回收日志)
-Xloggc:eclipse_gc.log (设置垃圾回收日志打印的文件,文件名称可以自定义)
-XX:+PrintGCTimeStamps (打印垃圾回收时间信息时的时间格式)
-XX:+PrintGCDetails (打印垃圾回收详情)
添加完以上参数后当启动Eclipse后就能在Eclipse根目录看到一个eclipse_gc.log的gc日志文件
2、设置eclipse初始堆、非堆内存大小以及年轻代
-Xms50m –Xmx200m -XX:PermSize=30m -XX:MaxPermSize=60m
3、添加JVM监控参数
-Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=6688 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

对象在什么情况下会被垃圾回收相关推荐

  1. bat判断文件是否存在_BAT面试必问题系列:JVM判断对象是否已死和四种垃圾回收算法总结...

    JVM系列: 面试题一:判断对象是否已死 判断对象是否已死就是找出哪些对象是已经死掉的,以后不会再用到的,就像地上有废纸.饮料瓶和百元大钞,扫地前要先判断出地上废纸和饮料瓶是垃圾,百元大钞不是垃圾.判 ...

  2. java 垃圾回收 null_java方法中把对象置null,到底能不能加速垃圾回收

    今天逛脉脉,看见匿名区有人说java中把对做置null,这种做法很菜,不能加速垃圾回收,但是我看到就觉得呵呵了,我是觉得可以加速置null对象回收的. 测试的过程中,费劲的是要指定一个合理的测试堆大小 ...

  3. 一文详解,jvm内存分代与垃圾回收原理

    jvm运行时数据区 Java程序启动后,本质上就是启动一个jvm进程,jvm会将自己管理的内存划分为几个区域,每个区域都有自己的用途.在程序运行时的内存区域主要可以划分为五个,分别是:方法区.堆.虚拟 ...

  4. JVM结构、内存分配、垃圾回收算法、垃圾收集器。

    2019独角兽企业重金招聘Python工程师标准>>> 一.JVM结构 根据<java虚拟机规范>规定,JVM的基本结构一般如下图所示: 从左图可知,JVM主要包括四个部 ...

  5. JAVA之JVM分代垃圾回收策略(一)

    一.为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...

  6. JVM调优总结(五)-分代垃圾回收详述1

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...

  7. JVM调优总结(4):分代垃圾回收

    原文出处: pengjiaheng 为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java ...

  8. JVM垃圾回收算法 总结及汇总

    先看一眼JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:jvm如何知道那些对象需要回 ...

  9. JVM垃圾回收机制总结(3) :按代垃圾收集器

    全文转载:http://pengjiaheng.iteye.com/blog/524024 作者:和你在一起 [from JavaEye] 为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的 ...

最新文章

  1. ML.NET 1.1 发布,模型构建器升级和新的异常检测算法
  2. GitLab 完成 1 亿美元融资 以 10 亿美元的估值成为“独角兽”
  3. WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇]
  4. windows下gdb的下载和安装使用初步
  5. sql server 中获取前一天日期_图解SQL面试题:如何比较日期数据?
  6. Activity 中的Toast在Activity销毁后报错,解决方法,把context改成应用的
  7. HDU-4902-Nice boat
  8. H.264视频编码在VC .Net中的实现(H264全文)
  9. Redis: key-value存储系统
  10. 五一新闻回顾:XP SP3悄发布 微软雅虎终谈崩
  11. HTML的a标签href设为零操作的原因和方式
  12. Silverlight安装相关问题
  13. C++ 整型和字符串相互转换
  14. IDEA 常用设置 与 常用操作(一)
  15. 生态系统服务——食物生产功能分布数据
  16. java倒计时器_Java并发系列5--倒计时器CountDownLatch
  17. C语言 字符‘0‘和‘\0‘ 以及整数0的区别
  18. 事务的特性——持久性(实现原理)
  19. Matterport3D:室内环境RGB-D数据的深度学习
  20. 10项目管理--项目沟通管理

热门文章

  1. php配置文件详解(phg.ini php-fpm.conf)
  2. 【2023年全国补贴】ISO三体系、ISO2000/27001最全补贴政策合集!
  3. 区块链应用:跨境贸易平台构想
  4. python装饰器 稀里糊涂_万恶之源 - Python装饰器及内置函数
  5. i12蓝牙耳机充电仓怎么看充满电_车行蓝牙耳机价格高性价比的选择
  6. 如何申请邮箱号,正确选择好用的办公邮箱
  7. matlab非线性参数拟合,matlab非线性参数拟合估计_很好的参考材料
  8. 教你回收站里面的东西删除了怎么恢复的技巧
  9. 使用Intellij IDEA创建XML文件, DTD文件和XML Schema文件
  10. GDB调试二进制和符号表symbol分开的程序