参考:堆外内存使用分析html
Java何时用堆外内存java
摘自:Full GC有关问题学习分析(转载)并发
GC,尤为是Full GC,每次都会致使JVM暂停工做,处理垃圾回收任务,短期内没法响应用户请求,大量的Full GC会致使系统响应速度下降,并且引来OOM的巨大风险。
jvm
当一个对象到GC Roots没有任何引用链相连时,则证实对象须要被回收.
性能
Java可做为GC Roots的对象包括下面几种:学习
虚拟机栈(栈桢中的本地变量表)中的引用的对象 spa
方法区中类静态属性引用的对象.net
方法区中常量引用的对象线程
本地方法栈中JNI引用的对象
回收算法相关内容转自https://youzhixueyuan.com/detailed-explanation-of-jvm-g1.html
过程:
优势: 并发,低停顿
缺点:
特色:
1) G1堆内存结构
- 堆内存会被切分红为不少个固定大小区域(Region),每一个是连续范围的虚拟内存。
- 堆内存中一个区域(Region)的大小能够经过-XX:G1HeapRegionSize参数指定,大小区间最小1M、最大32M,总之是2的幂次方。
- 默认把堆内存按照2048份均分。
2) G1堆内存分配
- 每一个Region被标记了E、S、O和H,这些区域在逻辑上被映射为Eden,Survivor和老年代。
- 存活的对象从一个区域转移(即复制或移动)到另外一个区域。区域被设计为并行收集垃圾,可能会暂停全部应用线程。
- 如上图所示,区域能够分配到Eden,survivor和老年代。此外,还有第四种类型,被称为巨型区域(Humongous Region)。Humongous区域是为了那些存储超过50%标准region大小的对象而设计的,它用来专门存放巨型对象。若是一个H区装不下一个巨型对象,那么G1会寻找连续的H分区来存储。为了能找到连续的H区,有时候不得不启动Full GC。
1)G1执行的第一阶段:初始标记(Initial Marking )
这个阶段是STW(Stop the World )的,全部应用线程会被暂停,标记出从GC Root开始直接可达的对象。
2)G1执行的第二阶段:并发标记
从GC Roots开始对堆中对象进行可达性分析,找出存活对象,耗时较长,这一阶段耗时较长但能与用户线程并发运行。
3)最终标记(标记那些在并发标记阶段发生变化的对象,将被回收)
最终标记阶段须要吧Remembered Set Logs的数据合并到Remembered Set中,这阶段须要停顿线程,但可并行执行。
4)筛选回收(首先对各个Regin的回收价值和成本进行排序,根据用户所期待的GC停顿时间指定回收计划,回收一部分Region)
这一过程一样是须要停顿线程的
最后,G1中提供了两种模式垃圾回收模式,Young GC和Mixed GC,两种都是Stop The World(STW)的。
1. YoungGC年轻代收集
在分配通常对象(非巨型对象)时,当全部eden region使用达到最大阀值而且没法申请足够内存时,会触发一次YoungGC。每次younggc会回收全部Eden以及Survivor区,而且将存活对象复制到Old区以及另外一部分的Survivor区。
YoungGC的回收过程以下:
- 根扫描,跟CMS相似,Stop the world,扫描GC Roots对象。
- 处理Dirty card,更新RSet.
- 扫描RSet,扫描RSet中全部old区对扫描到的young区或者survivor去的引用。
- 拷贝扫描出的存活的对象到survivor2/old区
- 处理引用队列,软引用,弱引用,虚引用
2. mixed gc
当愈来愈多的对象晋升到老年代old region时,为了不堆内存被耗尽,虚拟机会触发一个混合的垃圾收集器,即mixed gc,该算法并非一个old gc,除了回收整个young region,还会回收一部分的old region,这里须要注意:是一部分老年代,而不是所有老年代,能够选择哪些old region进行收集,从而能够对垃圾回收的耗时时间进行控制。
G1没有fullGC概念,须要fullGC时,调用serialOldGC进行全堆扫描(包括eden、survivor、o、perm)
一、解析(resolve)就是将一个符号引用转换成直接引用的一个过程。
当一个java文件编译成class以后,方法都是以符号引用的方式保存。而在加载类时,部分符合条件的符号引用会被转换成“直接引用”,这个过程咱们称之为“解析(Resolution)”。