JVM-java垃圾回收
一是栈、二是堆,JVM会自动回收堆中的内存,也就我们所说的垃圾回收,那JVM怎么实现垃圾回收的呢?
在说垃圾回收时还是说一下,java在JVM运行的内存处理:
首先,当JVM程序运行时会在程序计数器里分配一个线程的标记,主要标记线程完成情况,如果线程执行完成,该标记就回收、清空。
然后,由于程序运行,需要对一些对象引用的保存。JVM就把这些对象的引用保存到栈里,随着程序计数器的线程的进行或结束,栈中的引用也就会失效回收、清空等。
最后,由于堆中保存对象存储是线程共享的,所以线程是不能为堆做出内存回收、清空等机制。那这么回收堆中保存的对象内存,这里就是JVM的垃圾回收机制。它定时比较如果栈中没有引用指向堆中的对象,那么就释放该内存空间。
以上只是我的个人理解,觉得好像JVM的的内存初始和回收就是这样,但也许这是错的,那JVM是如果实现回收
堆中的内存?它有什么机制?什么实现?
其实我觉得这些事比较难的,JVM不是一两下就清楚了的,垃圾回收的原理其实没有必要知道,JVM本来就是来解决内存的问题。我也看了一些关于垃圾回收的原理的一些知识,不过还是没有懂起,也许水平在哪里,不能做实验,只有理论。但还是说下吧。
不同的JVM,有着不同的垃圾回收机制。(Garbage Collection ,GC)垃圾收集组要完成一、回收空间;二、让堆中的对象排列更整齐。这两点是GC的主要目的。
垃圾收集的算法主要有如下:
1、引用计数法
这个比较古老的算法,简单但速度慢,就是把我们定义在栈中的引用的标记起来,在定时回收标记引用无效的对象。
2、标记—清扫
sun公司最早就是使用的这种技术,先标记出要回收的对象,然后定时清扫对象。但这样内存就很杂碎,由于回收的内存都是到处分布的。
3、停止—复制
把内存分成两块,当一块用完了,就把这块需要的对象复制到另外的一块中,然后把这块清除。
4 自适应/标记—整理
先标记—清扫,再停止—复制,这就是自适应/标记整理。
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)英语好的可以看
上一篇:一些杂拍