如果有人问你Java垃圾回收机制你这么答就好了!

原创 2015年11月17日 20:19:26
1、为什么要进行垃圾回收:
       在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象;而在Java中,当没有对象引用指向原先分配给某个对象 的内存时,该内存便成为垃圾。 垃圾回收能自动释放内存空间,减轻编程的负担,JVM的一个系统级线程会自动释放该内存块。垃圾回收意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当一个对 象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象,垃圾回收也可以清除内存记录碎片。由于创建对象和垃圾回收器释放丢弃对象所占的内存空间,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆的一端,JVM将整理出的内存分配给新的对象。
2、如何进行垃圾回收:
          Java语言规范没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种垃圾回收算法一般要做2件基本的事情:(1)发现无用信息对象;(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用。
   大多数垃圾回收算法使用了根集(root set)这个概念;所谓根集就是正在执行的Java程序可以访问的引用变量的集合(包括局部变量、参数、类变量),程序可以使用引用变量访问对象的属性和 调用对象的方法。垃圾回收首先需要确定从根开始哪些是可达的和哪些是不可达的,从根集可达的对象都是活动对象,它们不能作为垃圾被回收,这也包括从根集间 接可达的对象。
3、对于特殊区域的垃圾回收(比如调用cc语言中的malloc()函数进行空间的分配那么垃圾回收机制就不能回收这类特殊空间): 之所以要使用finalize(),是存在着垃圾回收器不能处理的特殊情况。假定你的对象(并非使用new方法)获得了一块“特殊”的内存区域,由于垃圾 回收器只知道那些显示地经由new分配的内存空间,所以它不知道该如何释放这块“特殊”的内存区域,那么这个时候java允许在类中定义一个由 finalize()方法
4、触发GC(Garbage Collector)的条件:

 JVM进行次GC的频率很高,但因为这种GC占用时间极短,所以对系统产生的影响不大。更值得关注的是主GC的触发条件,因为它对系统影响很明显。总的来说,有两个条件会触发主GC:

  1)当应用程序空闲时,即没有应用线程在运行时,GC会被调用。因为GC在优先级最低的线程中进行,所以当应用忙时,GC线程就不会被调用,但以下条件除外。


  2)Java堆内存不足时,GC会被调用。 当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强制地调用GC线程,以便回收内存用于新的分配。若GC一次之后仍不能满足 内存分配的要求,JVM会再进行两次GC作进一步的尝试,若仍无法满足要求,则 JVM将报“out of memory”的错误,Java应用将停止。
5、减少GC开销的措施:
  1. 不要显示的调用System.gc()
  2. 尽量减少临时对象的使用
  3. 对象不用的时候最好显示置空
  4. 尽量使用StringBuffer,不实用String累加字符串(String的特性有关)
  5. 能使用基本数据类型就不要使用封装类
  6. 尽量减少静态对象变量的使用
6、注意:
  1. GC的回收时间是不确定的,即使你显示的调用的System.gc()。因为和线程优先级有关
  2. 使用了finalize()方法之后,GC是在这个方法执行之后的下一次进行垃圾的回收。

版权声明:本文为博主原创文章,未经博主允许不得转载。

java垃圾回收机制--可达性算法

下面我从一段代码来分析整个过程,并结合模型图来简易讲解,希望能让大家对彻底明白。 在正式回答这个问题之前,先简单说说 Java运行时内存区,划分为线程私有区和线程共享区: (1)线程私有区...
  • LAMP_zy
  • LAMP_zy
  • 2016年11月18日 09:56
  • 1071

垃圾回收中对象的五种可达性——强、软、弱、虚、不可达

在javaAPI文档 https://docs.oracle.com/javase/8/docs/api/java/lang/ref/package-summary.html 中介绍了Java.l...
  • zhoubin1992
  • zhoubin1992
  • 2015年09月02日 11:08
  • 1289

.Net 垃圾回收机制原理(二)

英文原文:Jeffrey Richter 编译:赵玉开 链接http://www.cnblogs.com/yukaizhao/archive/2011/11/25/dot_net_GC_2...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2015年03月15日 21:22
  • 1454

(转)如果有人问你数据库的原理,叫他看这篇文章

本文由 伯乐在线 - Panblack 翻译,黄利民 校稿。未经许可,禁止转载! 英文出处:Christophe Kalenzaga。欢迎加入翻译组。 一提到关系型数据库,我禁不住想:有些东西...
  • xMric
  • xMric
  • 2017年02月10日 18:05
  • 490

蛋鸡问题,先有鸡还是先有蛋。顺便回答第一个编译器是怎么来的。(思考使人伟大)

生活中存在着一些自举的例子,这些例子常被拿来做为思维狡辩的工具,它们确实也起到了让普通人思维混乱的作用。问题如下:1、  蛋鸡问题,鸡可以生蛋,蛋可以孵出鸡,那么到底先有鸡还是先有蛋?2、  人可以生...
  • band_of_brothers
  • band_of_brothers
  • 2007年10月10日 21:34
  • 3412

Java虚拟机解析篇之---垃圾回收器

上一篇说了虚拟机的内存模型,在说到堆内存的时候我们提到了,堆内存是Java内存中区域最大的一部分,而且垃圾回收器主要就是回收这部分的内容。那么这篇就来介绍一下垃圾回收器的原理以及回收的算法。Java中...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2014年11月02日 17:50
  • 11797

什么是GC对于GC垃圾回收机制的理解

什么是GC,GC就是垃圾回收机制:在系统运行过程中,会产生一些无用的对象,这些对象占据着一定的内存,如果不对这些对象清理回收无用对象的内存,可能会导致内存的耗尽,所以垃圾回收机制回收的是内存。同时GC...
  • sinat_30071601
  • sinat_30071601
  • 2017年04月18日 10:22
  • 422

Ubuntu 14.04 loudspeaker no sound

声音问题在Ubuntu中是老生常谈了。先前我已经在修复Ubuntu中的“无声”问题一文中写到了多种方法,但是我在此正要谈及的声音问题跟在另外一篇文章中提到的有所不同。 因此,我安装了Ubuntu...
  • u012160954
  • u012160954
  • 2014年12月18日 15:04
  • 914

逻辑思维训练500题(修订版)

逻辑思维训练500题(修订版) 正文前序:思维训练让你更高、更强! 前 言 第一章 假设法 第二章 计算法 第三章 排除法 第四章 分析法 第五章 观察法 ...
  • yz1311
  • yz1311
  • 2013年11月18日 11:36
  • 4259

java垃圾回收机制

垃圾收集器系统有自己的一套方案来判断哪个内存块是应该被回收 的, 哪个是不符合要求暂不回收的。 垃圾收集器在一个 Java 程序中的执 行是自动的,不能强制执行,即使程序员能明确地判断出有...
  • bao19901210
  • bao19901210
  • 2014年09月16日 16:52
  • 7717
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如果有人问你Java垃圾回收机制你这么答就好了!
举报原因:
原因补充:

(最多只允许输入30个字)