分布式java应用(二)
内存回收
- 引用计数收集器:通过计数器记录对象是否被引用
缺点:对于循环引用的场景没有办法实现回收。 -
跟踪收集器:全局记录数据的引用状态,基于一定条件触发,执行时从根集合来扫描对象的引用关系。
复制:从根集合扫描出存活的对象,并将找到的存活对象复制到一块新的完全未使用的空间找那个,
标记-清除:从根集合开始扫描,对存活的对象进行标记,标记完毕后,再扫描整个空间中未标记的对象,并进行回收
标记-压缩:先对存活的对象进行标记,在回收不存活对象所占用的内存空间后,会将其他所有存活对象都往左端空闲的空间进行移动,并更新引用其对象的指针。
Sun JDK中可用的GC
串行GC(Serial GC):扫描和复制为单线程方式,为client编译器默认GC方式
remember set: 为了解决每次MinorGC时扫描旧生代带来的性能问题。Sun JDK在进行对象赋值时,如果发现赋值的为一个对象引用,则产生write barrier,然后检查需要赋值的对象是否在旧生代及赋值的对象引用是否指向新生代;如果满足条件,则在remember set做个标记。
SafePoint: Sun JDK在进行对象引用扫描时,为了避免引用关系发生变化,在编译代码时为每段方法注入SafePoint(通常位于方法中循环的结束点及方法执行完毕的点),等待所有用户线程进入SafePoint,如果此时要进行MinorGC,则将其内存页设置为不可读状态,这就是GC停顿 。
并行回收GC(Parallel Scavenge):扫描和复制为多线程方式,为server编译器默认GC方式
-XX:InitialSurvivorRatio
: Eden、S0、S1的默认比例划分,默认值8-XX:SurvivorRatio
JDK1.6以后采用,并行回收GC将此值+2
赋给InitialSurvivorRatio
。当同时配置了InitialSurvivorRatio
和SurvivorRatio
时,以前者为准。-XX:-UseAdaptiveSizePolicy
来固定Eden、S0、S1的大小。
PS GC不是根据-XX:PretenureSizeThreshold
来决定对象是否在旧生代上直接分配,而是当需要给对象分配内存时,Eden Space空间不够的情况下,如果此对象的大小大于等于Eden Space的一半的大小,就直接在旧生代上分配。
-
-XX:ParallelGCThreads
强制指定线程数。