JVM-java垃圾回收

Time:2016/09/16 23:39:30   Click:
JVM(内存域) 中讲述了Java在JVM中的内存使用,其实在我们出来java程序时基本上有两个地方的内存处理

一是、二是,JVM会自动回收堆中的内存,也就我们所说的垃圾回收,那JVM怎么实现垃圾回收的呢?

    在说垃圾回收时还是说一下,java在JVM运行的内存处理:
    首先,当JVM程序运行时会在程序计数器里分配一个线程的标记,主要标记线程完成情况,如果线程执行完成,该标记就回收、清空。
    然后,由于程序运行,需要对一些对象引用的保存。JVM就把这些对象的引用保存到里,随着程序计数器的线程的进行或结束,栈中的引用也就会失效回收、清空等。
    最后,由于中保存对象存储是线程共享的,所以线程是不能为堆做出内存回收、清空等机制。那这么回收堆中保存的对象内存,这里就是JVM的垃圾回收机制。它定时比较如果中没有引用指向中的对象,那么就释放该内存空间。

    以上只是我的个人理解,觉得好像JVM的的内存初始和回收就是这样,但也许这是错的,那JVM是如果实现回收
堆中的内存?它有什么机制?什么实现?
    其实我觉得这些事比较难的,JVM不是一两下就清楚了的,垃圾回收的原理其实没有必要知道,JVM本来就是来解决内存的问题。我也看了一些关于垃圾回收的原理的一些知识,不过还是没有懂起,也许水平在哪里,不能做实验,只有理论。但还是说下吧。
    不同的JVM,有着不同的垃圾回收机制。(Garbage Collection ,GC)垃圾收集组要完成一、回收空间;二、让堆中的对象排列更整齐。这两点是GC的主要目的。
    垃圾收集的算法主要有如下:

1、引用计数法
    这个比较古老的算法,简单但速度慢,就是把我们定义在栈中的引用的标记起来,在定时回收标记引用无效的对象。

2、标记—清扫
    sun公司最早就是使用的这种技术,先标记出要回收的对象,然后定时清扫对象。但这样内存就很杂碎,由于回收的内存都是到处分布的。

3、停止—复制
    把内存分成两块,当一块用完了,就把这块需要的对象复制到另外的一块中,然后把这块清除。

自适应/标记—整理
    先标记—清扫,再停止—复制,这就是自适应/标记整理。

5、分代收集算法
    这种算法只是把内存分成适合标记—清扫的就做该操作,适合停止—复制就做该操作。

这里只是简单的描述,如果有兴趣可以去研究一下。


下面介绍一下收集器的发展

1、Serial收集器
    最早的收集器,在JDK1.3以前是唯一的收集器。

2、ParNew收集器
    是Serial的多线程版本。

3、Parallel Scavenge收集器
    采用的复制算法的新生代收集器。

4、Serial Old收集器
    主要是和Parallel Scavenge搭配使用(JDK1.5)

5、Parallel Old收集器
    采用的标记—整理算法(JDk1.6)。

6、CMS收集器
    主要是重视响应速度,基于 标记—清除算法。

7、G1收集器
    整合收集技术发展最前沿的成功。(JDK1.7)英语好的可以看



TAG
TOP

四川尚狐网络@2012 版权所有
蜀ICP备12016524号-2

立即咨询
成都网站建设,成都做网站,四川尚狐网络
40f13d50b73e104f832ed1b719ae6935