Java垃圾回收概览
GC要解决三个主要的问题:
- 哪些内存需要回收?
- 什么时候回收?
- 如何回收?
哪些内存需要回收?
最简单的是引用计数(reference count),缺陷是无法解决循环引用。于是更快点的算法是可达性分析(reachable analysis)。
什么时候回收?
至少要经历两次标记过程:
- 在进行可达性分析后,发现没有与GC roots相连接的引用链时,会被第一次标记并进行一次筛选——是否有必要执行finalize()。
- 对象没有finalize()方法或者被虚拟机执行过,视为“没必要执行”
- 有必要执行finalize(),被放置于F-Queue队列中,并在稍后由(虚拟机自动建立的、优先级低的)Finalizer线程去“执行”(触发相应方法,但并不会等待它完成)。
- 之后GC将对F-Queue中对象进行第二次小规模的标记。
如何回收?
- Mark-Sweep(标记-清除):(缺陷:会造成大量的内存碎片。)
- Copy:内存一分为二,每次只使用其中的一半。清理时,将存活对象拷贝到未使用的另一半,再将已用的这一半清理掉。(缺陷:将内存缩小为原来的一半,在存活对象较多时效率很低。所以在新生代区域会使用这种算法,一大块Eden和两块Survivor区域。每次使用Eden和其中一块Survivor区域。)
- Mark-Compact(标记-整理):让所有存活的对象,往一端移动,适用于存货对象较多的区域,如老生代。
- 分代收集:综合了以上所有方法,对不同的generation区域使用不同的算法。
参考文献:
Java垃圾回收概览的更多相关文章
- [牛感悟系列]JAVA(1)理解JAVA垃圾回收
理解JAVA垃圾回收的好处是什么?满足求知欲是一方面,编写更好的JAVA应用是另外一方面. 如果一个人对垃圾回收过程感兴趣,那表明他在应用程序开发领域有相当程度的经验.如果一个人在思考如何选择正确的垃 ...
- 【转载】Java垃圾回收机制
原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...
- 【转】深入理解 Java 垃圾回收机制
深入理解 Java 垃圾回收机制 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...
- 深入理解java垃圾回收机制
深入理解java垃圾回收机制---- 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...
- Java GC系列(2):Java垃圾回收是如何工作的?
本文由 ImportNew - 伍翀 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 本教程是为了理解基本的Java垃圾回收以及它是如何 ...
- Java GC系列(1):Java垃圾回收简介
本文由 ImportNew - 好好先生 翻译自 javapapers. Java的内存分配与回收全部由JVM垃圾回收进程自动完成.与C语言不同,Java开发者不需要自己编写代码实现垃圾回收.这是Ja ...
- Java垃圾回收介绍(译)
在Java中,对象内存空间的分配与回收是由JVM中的垃圾回收进程自动完成的.与C语言不同的是,在Java中开发者不需要专门为垃圾回收写代码.这是使Java流行的众多特征之一,也帮助了程序员写出了更好的 ...
- [译]GC专家系列2:Java 垃圾回收的监控
原文链接:http://www.cubrid.org/blog/dev-platform/how-to-monitor-java-garbage-collection/ 这是"成为GC专家系 ...
- java 垃圾回收(堆内存)、以及栈内存的释放
一.Java的垃圾回收机制———解疑 Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间. 需要注意的是:垃圾回收回收的是无任何引用的 ...
随机推荐
- python—集合
ps:非空即真,非0即真(空,0都返回False) pwd=input('pwd:').strip() if pwd: #三种判断为空的方法(直接判断就可以) # if pwd!='': # if l ...
- vue element-ui 设置时间组件
备注:设置开始时间小于结束时间 <!-- 开始时间 --> <div class="block"> <!-- <span class=" ...
- Skipping acquire of configured file ···doesn't support architecture 'i386' acquire of configured file
系统更新的时候报错: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'http://rep ...
- 20172306 2018-2019-2 《Java程序设计与数据结构》第七周学习总结
20172306 2018-2019-2 <Java程序设计与数据结构>第七周学习总结 教材学习内容总结 概述 二叉查找树是一种含有附加属性的二叉树,即其左孩子小于父结点,而父结点又小于或 ...
- oracle 查询clob 列时 很慢 , 未解决
今天查询一张表 ,这张表有一个clob 列 select * from tableName : 很卡.. 难道是查询的太多? select * from tableName where rowN ...
- Cookie随笔
解决了服务器不能识别不同浏览器的问题,相当于给每个浏览器加了个“身份证”. Cookie首先由服务器创建发给浏览器,随后浏览器每次访问服务器时都带上这个Cookie. Cookie缺点: ·Cooki ...
- 20175316盛茂淞 2018-2019-2 《Java程序设计》第7周学习总结
20175316盛茂淞 2018-2019-2 <Java程序设计>第7周学习总结 教材学习内容总结 第八章 常用实用类 一.String类 String类在java.lang包中,jav ...
- #2019-2020-4 实验二面向对象程序设计《Java开发环境的熟悉》实验报告
2019-2020-4 实验二面向对象程序设计<Java开发环境的熟悉>实验报告 一.面向对象程序设计-1 ①实验要求: 1.参考 http://www.cnblogs.com/roced ...
- (转载)python 命名.py 不能与模块相同,否则会报错
在学习python网页爬虫时,测试requests的post方法进行表单提交时,命名.py文件为requests.py 代码如下: import requests params={'firstname ...
- C#运行时通过字符串实例化类对象
备忘,记个C#版本. using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...