Java的GC原理

栏目: Java · 发布时间: 7年前

内容简介:Java语言中一个显著的特点就是引入了垃圾回收机制,使c/c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理,JVM替我们完成了这部分工作。主要完成3件事:Java中那些不可达的对象就会变成垃圾。那么什么叫做不可达?其实就是没有办法再引用到该对象了。主要有以下情况使对象变为垃圾:

一、概述

Java语言中一个显著的特点就是引入了垃圾回收机制,使c/c++程序员最头疼的内存管理的问题迎刃而解,它使得 Java 程序员在编写程序的时候不再需要考虑内存管理,JVM替我们完成了这部分工作。

二、回收步骤

主要完成3件事:

1、确定哪些内存需要回收?
2、确定什么时候需要执行GC?
3、如何执行GC?

三、何为垃圾?

Java中那些不可达的对象就会变成垃圾。那么什么叫做不可达?其实就是没有办法再引用到该对象了。主要有以下情况使对象变为垃圾:

1.对非线程的对象来说,所有的活动线程都不能访问该对象,那么该对象就会变为垃圾。
2.对线程对象来说,满足上面的条件,且线程未启动或者已停止。

四、啥时回收?

不确定。

垃圾回收机制是由垃圾收集器(Garbage Collection,即GC)来实现的,GC是后台的守护进程。它的特别之处是它是一个低优先级进程,但是可以根据内存的使用情况动态的调整他的优先级。因此,它是在内存中低到一定限度时才会自动运行,从而实现对内存的回收。这就是垃圾回收的 时间不确定 的原因。

为何要这样设计:因为GC也是进程,也要消耗CPU等资源,如果GC执行过于频繁会对java的程序的执行产生较大的影响(java解释器本来就不快),因此JVM的设计者们选着了不定期的gc。

五、怎样回收?

说来话长。概括的说,就是: 分代分配内存,分代回收垃圾

这里说的内存,主要是指JVM中的堆区,因为对象保存在这里。

Java的GC原理

在垃圾回收器回收内存之前,需要一些清理工作。
因为垃圾回收gc只能回收通过new关键字申请的内存(在堆上),但是堆上的内存并不完全是通过new申请分配的。还有一些本地方法(一般是调用的C方法)。这部分“特殊的内存”如果不手动释放,就会导致内存泄露,gc是无法回收这部分内存的。所以需要在finalize中用本地方法(native method)如free操作等,再使用gc方法。

1、分代分配

将堆区分为3个区域:

轻生代(Young Generation)、老年代(Old Generation)、永久代(Permanent Generation)

Java的GC原理

这三个代里面, 永生代 则对应JVM中的方法区,存放的是类的结构信息,以及运行时常量池之类的东东;而 新生代老年代 分别用于存放不同时期的对象或大小不一的对象。这里面有一系列算法。简而言之,就像人的生命周期一样,新创建的对象放在新生代(比较大也可以直接放到老年代),而新生代又分为伊甸区和两个存活区,对象会在这些区域之间搬来搬去。

经过几轮回收淘汰以后,移到老年代。

2.分代回收

新生代:采用停止-复制算法。停止(Stop-the-world)”的意义是在回收内存时,需要暂停其他所 有线程的执行。

老年代:采用标记-整理算法,即:标记出仍然存活的对象(存在引用的),将所有存活的对象向一端移动,以保证内存的连续。

永久代:不一定需要回收。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

马化腾自述-我的互联网思维

马化腾自述-我的互联网思维

赵黎 / 石油工业出版社 / 2014-8-1 / 35

马化腾自述:我的互联网思维》讲述了些人说移动互联网就是加了“移动”两个字,互联网十几年了,移动互联网应该是个延伸。我的感受是,移动互联网远远不只是一个延伸,甚至是一个颠覆。互联网是一个开放交融、瞬息万变的大生态,企业作为互联网生态里面的物种,需要像自然界的生物一样,各个方面都具有与生态系统汇接、和谐、共生的特性。开放和分享并不是一个宣传口号,也不是一个简单的概念。开放很多时候被看作一种姿态,但是我......一起来看看 《马化腾自述-我的互联网思维》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具