jvm 内存分配
内存分配
JVM内存分配过程
1、JVM 会试图为相关Java对象在Eden中初始化一块内存区域。
2、当Eden空间足够时,内存申请结束;否则到下一步。
3、JVM 试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收)。释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区。
4、Survivor区被用来作为Eden及Old的中间交换区域,当Old区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区。
5、当Old区空间不够时,JVM 会在Old区进行完全的垃圾收集(0级)。
6、完全垃圾收集后,若Survivor及Old区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory”错误。
jvm晋升机制
1、长期存活的对象
虚拟机对每个对象定义了一个对象年龄(Age)计数器。当年龄增加到一定的临界值时,就会晋升到老年代中,该临界值由参数:-XX:MaxTenuringThreshold来设置。
如果对象在Eden出生并在第一次发生MinorGC时仍然存活,并且能够被Survivor中所容纳的话,则该对象会被移动到Survivor中,并且设Age=1;以后每经历一次Minor GC,该对象还存活的话Age=Age+1。
2、大对象直接进入老年代
3、minor gc后,survivor仍然放不下
4、动态年龄判断 ,大于等于某个年龄(此年龄的所有对象之和超过了survivor空间一半)的 对象直接进入老年代
GC
分代gc的原因:
不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。年轻代对象生命周期较短,年轻代区间也较小需要频繁回收,老年代的对象生命周期较长,不需要频繁回收
新生代gc和老年代gc
Minor GC:新生代GC,指发生在新生代的垃圾收集动作,所有的Minor GC都会触发全世界的暂停(stop-the-world),停止应用程序的线程,不过这个过程非常短暂。-------采用复制压缩算法GC
Major GC/Full GC:老年代GC,指发生在老年代的GC。整个老年代所有内存进行GC,整体使用标记整理算法,所谓整理就是压缩,剩下的不清除的资源进行一次移动,压缩移动到一起。也有的直接标记清除
Eden区满了触发Minor GC,这时会把Eden区存活的对象复制到Survivor区,当对象在Survivor区熬过一定次数的Minor GC之后,就会晋升到老年代(当然并不是所有的对象都是这样晋升的到老年代的),当老年代满了,就会报OutofMemory异常。
判断是否要回收
引用计数算法(互相引用有问题)主流jvm已不使用
可达性算法
GC收集器
新生代
serial gc,单线程收集器,适用于小的应用。
parallel Scavenge gc 高吞吐量(吞吐量高,jvm效率更高,适合不响应jvm自身处理多的应用)的并发gc收集器
(使用parallel时可以设置吞吐量参数:用于精确控制吞吐量
-XX:MaxGCPauseMillis 最大垃圾收集停顿时间
-XX:GCTimeRatio 垃圾收集时间与运行用户代码时间的比例=垃圾收集时间/运行用户代码时间,相当于是吞吐量的倒数。
实现:降低GC停顿时间:牺牲吞吐量和新生代空间(减小新生代空间,GC频率变大,吞吐量降低)
GC自适应的调节策略
-XX:+UseAdaptiveSizePolicy 使用自适应的调节策略 即不需要指定新生代的大小,Eden与Surivior的比例,晋升老年代的年龄等细节参数,虚拟机自动根据根据当前系统的状态动态调整这些参数以提供最合适的停顿时间或最大的吞吐量。)
parnew gc 低停顿时间(停顿时间少,jvm响应率高,适合多响应的应用)并发gc收集,主要配合cms使用
老年代
serial old 同新生代
parallel old 同新生代
cms
收集过程
1).初始标记:暂停用户线程,标记GC Roots能直接关联的对象,速度很快
2).并发标记:用户线程与标记线程并发,进行GC Roots Tracing的过程
3).重新标记:为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。
4).并发清除:用户线程与清除线程并发。
把原先的标记分为三次,由于标记常要停顿,不然不准确,所以优化标记,第二次并发标记不触发停顿,造成错误第三次修改。所以cms是一个低停顿时间的收集器。
G1回收器
CMS收集器和G1收集器的区别
区别一: 使用范围不一样 g1可使用老年代和新生代,而cms使用在老年代并且得配合其他收集器一起使用
区别二: STW的时间 CMS收集器以最小的停顿时间为目标的收集器、G1收集器可预测垃圾回收的停顿时间(建立可预测的停顿时间模型)
区别三: 垃圾碎片
CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片
G1收集器使用的是“标记-整理”算法,进行了空间整合,降低了内存空间碎片。
区别四: 垃圾回收的过程不一样
CMS收集器 G1收集器
- 初始标记 1.初始标记
- 并发标记 2. 并发标记
- 重新标记 3. 最终标记
- 并发清楚 4. 筛选回收
区别五:
g1对整个堆进行了划分,划分了很多小块空间,对小块空间进行收集,cms对整个对进行收集