JavaGC垃圾处理
来源:互联网 发布:stc单片机原理图库 编辑:程序博客网 时间:2024/05/14 05:22
Java的GC一般是在JVM的堆上进行的,Java的堆中存放了大量的对象实例,所以JavaGC也叫GC堆。
Java将内存区划分为:
新生代(Young Generation/New)
Eden Space
From Survivor/Survivor 0
To Survivor/Survivor 1
老年代(Tenured Generation/Old)
永久代(一般指方法区和常量池,一般情况下永久代在虚拟机运行时就能确定大小的,但是一些框架可能会动态生成类信息就会导致永久代越来越大)
新生代要如此划分是因为新生代使用的GC算法是复制收集算法。这种算法效率较高,而GC主要是发生在对象经常消亡的新生代,因此新生代适合使用这种复制收集算法。由于有一个假设:在一次新生代的GC(Minor GC)后大部分的对象占用的内存都会被回收,因此留存的放置GC后仍然活的对象的空间就比较小了。这个留存的空间就是Survivor space:From Survivor或To Survivor。这两个Survivor空间是一样大小的。例如,新生代大小是10M(Xmn10M),那么缺省情况下(-XX:SurvivorRatio=8),Eden Space 是8M,From和To都是1M。
在new一个对象时,先在Eden Space上分配,如果Eden Space空间不够就要做一次Minor GC。Minor GC后,要把Eden和From中仍然活着的对象们复制到To空间中去。如果To空间不能容纳Minor GC后活着的某个对象,那么该对象就被promote到老年代空间。从Eden空间被复制到To空间的对象就有了age(年龄)=1。此age=1的对象如果在下一次的Minor GC后仍然存活,它还会被复制到另一个Survivor空间(如果认为From和To是固定的,就是又从To回到了From空间),而它的age=2。如此反复,如果age大于某个阈值(-XX:MaxTenuringThreshold=n),那个该对象就也可以promote到老年代了。
如果Survivor空间中相同age(例如,age=5)对象的总和大于等于Survivor空间的一半,那么age>=5的对象在下一次Minor GC后就可以直接promote到老年代,而不用等到age增长到阈值。
在做Minor GC时,只对新生代做回收,不会回收老年代。即使老年代的对象无人索引也将仍然存活,直到下一次Full GC。
深入了解JavaGC机智可参考文章:http://blog.csdn.net/initphp/article/details/30487407
- JavaGC垃圾处理
- javaGC
- JavaGC
- JavaGc
- JAVA 垃圾处理
- java垃圾处理
- JAVA中垃圾处理,垃圾处理算法
- JavaGC机制
- JAVAgc 介绍
- 异常处理和垃圾处理
- java的垃圾处理机制
- java中的垃圾处理机制
- JVM_Java垃圾处理机制
- JVM垃圾处理方法
- 成为JavaGC专家
- JavaGC - jni_invoke_nonstatic SIGSEGV
- javaGC机制之我见
- JavaGC 回收相关
- 一个解除TCP连接的TIME_WAIT状态限制的简便方法
- 在 Mockplus 2.1 (预览版)中使用母版
- 基本数据结构
- iOS中的Masonry纯代码适配屏幕例子
- ViewPager 详解(一)---基本入门
- JavaGC垃圾处理
- CSS中的display
- SVM(Support Vector Machine)读书笔记一(最佳分割超平面)
- Android 引用外部项目库笔记
- java学习
- 为app创建快捷方式
- 【iOS】自定义TabBarController
- 基于文档的应用程序
- linux历史命令