首页 > 编程语言 > 详细

java虚拟机(四)--垃圾回收

时间:2019-02-17 16:07:54      阅读:260      评论:0      收藏:0      [点我收藏+]

垃圾回收

java基于内存的动态分配,回收也是自动且动态回收。
因java程序计数器、虚拟机栈、本地方法栈均伴随线程产生而产生,线程销毁而销毁。栈帧的内存基本是类加载后确定的,大多不考虑这部分的内存回收。
而java堆以及方法区不同的是,我们只有在运行时才能知道会创建哪些对象,这部分内存是动态分配的,因而采用动态回收机制。

分类

1、引用计数算法

给对象添加一个引用计数器,当对象被一个地方引用,则计数器加一;当引用失效时,计数器减一。当计数器为0时,对象为不可用,需要被清除。
缺点是两个相互引用的对象,虽然对象已无其它引用,但是也不能被清除,GC无法回收它们

2、可达性分析算法

使用GC roots 对象作为起点,从该节点向下搜索的路径称为引用链。当对象与GC roots之间没有任何引用链相连时,该对象为不可用。

可以作为GC roots 对象的几种情况:

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

引用的分类,该4中分类中引用的强弱递减

1、强引用

是通过new 产生的对象,即Object obj = new Object(),该引用类型引用的对象永远不会被回收。

2、软引用

用于描述非必须但有用的对象,在可能发生内存溢出之前,会将对象列入回收范围。

3、弱引用

用于描述非必需的对象,在下次垃圾回收时,不管内存是否足够,均会清除该类对象。

4、虚引用

最弱的一种引用,无法通过虚引用获取一个对象。

java虚拟机(四)--垃圾回收

原文:https://www.cnblogs.com/gloria-liu/p/10391423.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!