Java垃圾回收机制

Java垃圾回收机制
一、java虚拟机运行时的内存分配,主要分为以下几个部分:jvm虚拟机栈、pc寄存器、本地方法栈、堆、方法区以及常量池。
1)jvm虚拟机栈:是线程独有的,每次启动一个线程,就创建一个jvm虚拟机栈,线程退出的时候就销毁。这里面主要保存线程本地变量名和局部变量值。
2)pc寄存器 : 这个保存线程当前执行的字节码指令。
3)本地方法栈: 调用本地jni方法的时候而创建的。这里分配的jvm之外的内存空间。方法调用结束之后销毁。
4)堆:主要保存创建的对象。
5)方法区:保存class相关的信息。主要是class的一个内存结构信息。
6)常量池:方法区的一部分,主要保存class内存结构中常量值例如String值,public static final 类型的值。
这里写图片描述

二、我们这里说的垃圾回收,主要是java虚拟机对堆内存区域的回收。
1 首先的问题是:jvm如何知道那些对象需要回收 ?
. 引用计数法
每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收。没有路径可以达到对象,对象的引用计数就就是0,对象就会被回收。但是这个算法有明显的缺陷,对于循环引用的情况下,循环引用的对象就不会被回收。
. root搜索算法
这种算法目前定义了几个root,也就是这几个对象是jvm虚拟机不会被回收的对象,所以这些对象引用的对象都是在使用中的对象,这些对象未使用的对象就是即将要被回收的对象。简单就是说:如果对象能够达到root,就不会被回收,如果对象不能够达到root,就会被回收。以下对象会被认为是root对象:
a.被启动类(bootstrap加载器)加载的类和创建的对象;
b.jvm运行时方法区类静态变量(static)引用的对象;
c.jvm运行时方法去常量池引用的对象;
d.jvm当前运行线程中的虚拟机栈变量表引用的对象;
本地方法栈中(jni)引用的对象。
三、垃圾回收算法
1)标记-清除
标记清除的算法最简单,主要是标记出来需要回收的对象,然后然后把这些对象在内存的信息清除。
这里写图片描述
2)标记-清除-压缩
这个算法是在标记-清除的算法之上进行一下压缩空间,重新移动对象的过程。因为标记清除算法会导致很多的留下来的内存空间碎片,随着碎片的增多,严重影响内存读写的性能,所以在标记-清除之后,会对内存的碎片进行整理。最简单的整理就是把对象压缩到一边,留出另一边的空间。由于压缩空间需要一定的时间,会影响垃圾收集的时间。
这里写图片描述
3)标记-清除-复制
这个算法是把内存分配为两个空间,一个空间(A)用来负责装载正常的对象信息,,另外一个内存空间(B)是垃圾回收用的。每次把空间A中存活的对象全部复制到空间B里面,在一次性的把空间A删除。这个算法在效率上比标记-清除-压缩高,但是需要两块空间,对内存要求比较大,内存的利用率比较低。适用于短生存期的对象,持续复制长生存期的对象则导致效率降低
这里写图片描述

更详细的信息可以访 问: http://www.cnblogs.com/aigongsi/archive/2012/04/13/2446166.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值