垃圾收集(Carbage Collection)
   java内存在运行时区域,程序计数器、java虚拟机栈、本地方法三个区域都是线程私有的内存区域,随着线程的启动和销毁而分配和回收。栈帧随着方法的调用和退出而执行入栈和出栈。每一个栈帧分配多少内存在编译期间就已经确定下来了,所以这几个内存区域具有确定性,不用过多考虑内存回收的的问题。会随着线程的结束或者方法的结束而回收内存。
  java中的GC工作主要针对java 堆 和 方法区这些内存区域。

如何判断对象是否"活着"

(1)引用计数算法
    在对象中添加一个引用计数器,每在一个地方引用了该对象的时候,引用计数器+1,当引用失效的时候,引用计数器-1。
    但是在java中没有使用该算法来管理内存,因为这个算法很难解决对象互相引用的问题。
 
(2)根搜索算法
    通过一系列 "GC Roots"的对象为起点,从这些节点开始向下搜索(搜索走过的路径叫做 "引用链"),当一个对象到 "GC Roots"对象没有任何引用链相连(用图论说明就是指所有的 "GC Roots" 与对象不可达),说明这个对象是不可用的。java 和 C#使用根搜索算法。
 
GC Roots对象
  • 虚拟机栈(栈帧中本地变量表)中的引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法中JNI引用的对象

确认是否回收
在通过算法找出没有"活着"的对象,并不是一次性的回收他们,需要经过两次标记。
回收方法区
方法区主要回收的部分是废弃常量 和 无用的类。
在常量池中,有字符串abc,当没有任何的String对象的引用常量池中的 abc 常量,也没有其他地方引用这个字面量,则这个常量是废弃常量。
无用的类
  1. Java堆中不存在该类的任何实例
  2. 加载该类的ClassLoader被回收了
  3. 该类对应的java.lang.Class 对象在任何地方没有被引用

总结

JVM如何判断 "活着" 的对象,以及对于 "死亡" 的对象判定确认回收过程。

 
 
 
 

GC回收的对象的更多相关文章

  1. Java GC如何判断对象是否为垃圾

    查找内存中不再使用的对象 引用计数法 引用计数法就是如果一个对象没有被任何引用指向,则可视之为垃圾.这种方法的缺点就是不能检测到环的存在. 2.根搜索算法 根搜索算法的基本思路就是通过一系列名为”GC ...

  2. JVM(3)对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制

    ①首先说一下,GC里边在JVM其中是使用的ROOT算法,ROOT算法,什么称作为ROOT呢,就是说类的静态成员,静态成员就是static修饰的那种,是"根"的一个,根还包含方法中的 ...

  3. Java虚拟机笔记(二):GC垃圾回收和对象的引用

    为什么要了解GC 我们都知道Java开发者在开发过程中是不需要关心对象的回收的,因为Java虚拟机的原因,它会自动回收那些失效的垃圾对象.那我们为什么还要去了解GC和内存分配呢? 答案很简单:当我们需 ...

  4. GC是如何回收SoftReference对象的

    看Fresco的代码中,有这样的一个类: /** * To eliminate the possibility of some of our objects causing an OutOfMemor ...

  5. JVM 判断对象已死,实践验证GC回收

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 提升自身价值有多重要? 经过了风风雨雨,看过了男男女女.时间经过的岁月就没有永恒不变 ...

  6. Gc如何判断对象可以被回收?

    Gc如何判断对象可以被回收? 1 引用计数器 引用计数法的算法思路:给对象增加一个引用计数器,每当对象增加一个引用计数器+1,失去一个引用-1,所以当计数器是0的时候对象就没有引用了,就会被认为可回收 ...

  7. Java GC回收机制

    优秀Java程序员必须了解的GC工作原理 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只 ...

  8. GC回收建议

    1.最基本的建议就是尽早释放无用对象的引用.大多数程序员在使用临时变量的时候,都是让引用变量在退出活动域(scope)后,自动设置为 null.我们在使用这种方式时候,必须特别注意一些复杂的对象图,例 ...

  9. Java GC机制和对象Finalize方法的一点总结

    GC是垃圾收集的意思(Garbage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超 ...

随机推荐

  1. Linux Shell命令系列(3)

    11. chown命令 “chown”命令就是改变文件拥有者和所在用户组.每个文件都属于一个用户组和一个用户.在你的目录下,使用"ls -l",你就会看到像这样的东西.root@t ...

  2. 牛客网Java刷题知识点之基本数据类型参数传递和引用数据类型参数传递图解

    不多说,直接上干货! //基本数据类型参数传递 class Demo { public static void main(String[] args) { ; show(x); System.out. ...

  3. quartz任务调度初次使用记录

    近期公司开发的数据交换系统嵌入了quartz任务调度功能,大概了解了任务调度的整个流程,项目中需要用到它来进行定时任务操作,对数据定时检查以及及时交换. Quartz是OpenSymphony开源组织 ...

  4. kotlin查看编译后的Java代码

    java学一下kotlin,由于用的是同样的jvm,那就说明他们的字节码文件应该是一样的,那么,如果我们能看到编译后的文件,那么学的更快了. 操作 1.打开一个.kt文件 2.在Android Stu ...

  5. H5移动端原生长按事件

    // 函数名longpress// 参数为: 需长按元素的id.长按之后处理函数func function longPress(id, func,timeout=500) { var timeOutE ...

  6. Js常见算法实现汇总

    /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.length; for(var ...

  7. php 出现空格,换行原因

    1.空格:转换成utf-8无bom格式 2.空格:<?php ?>标签结尾有中文,英文空格 3.换行,一个文件中有多个<?php ?>标签,标签间隔中有换行符合

  8. weexpack 创建项目, 打包Android 和 ios

    1: 首先确保 node.js版本大于6.0, 不然使用 weexpack 时会报错(部分使用es6语言,node版本太低不支持es6) 下面所有都是命令行执行的命令 2: 全局安装 weexpack ...

  9. TED:如何掌控你的自由时间以及让自己变得更好,这样就能看到爱情应有的样子

    TED:如何掌控你的自由时间以及让自己变得更好,这样就能看到爱情应有的样子 一.<如何掌控你的自由时间> (1)时间管理的传统思维:守时和节省零散的时间.演讲者认为这个观点已经彻底落后. ...

  10. Thread.sleep 与Thread.currentThread.sleep

    参考博客: https://blog.csdn.net/guangyinglanshan/article/details/51645053 公司项目近段时间要使用thread, 个人想去了解Threa ...