`
LeafInWind
  • 浏览: 2706 次
  • 性别: Icon_minigender_1
  • 来自: 埃及
文章分类
社区版块
存档分类
最新评论

hotspot full gc伪代码

 
阅读更多
class Object {
  bool _gc_mark = false;
  Object* _forwardee; // null for normal objects non-null for forwarded objects

  void forward_to(address new_addr) {
    _forwardee = new_addr;
  }

  Object* forwardee() {
    return _forwardee;
  }

  bool forwarded() {
    return _forwardee != null;
  }

  void copy_to_forwardee() {
    // copy current obj to the forwardee address and clear its forwardee
  }

  void set_gc_mark() {
    _gc_mark = true;
  }

  bool gc_marked() {
    return _gc_mark;
  }

  void clear_gc_mark() {
    _gc_mark = false;
  }

  size_t size();

  void adjust_object_fields() {
    foreach(Object** p : this->object_fiels()) {
      *p = (*p)->forwardee();
    }
  }

  Iterator<Object**> object_fields();
};

class Heap {
  ContigCompatibleSpace* _the_space;

  Heap(address bottom, address end);

  address allocate(size_t size);
  void collect();
  void process_root(Object** slot);
  void mark_compact_phase1();
  void mark_compact_phase2();
  void mark_compact_phase3();
  void mark_compact_phase4();
};

class ContigCompatibleSpace {
  address _bottom;
  address _top;
  address _end;
  Object* _first_dead;

public:
  ContigCompatibleSpace(address bottom, address end);

  address bottom() {
    return _bottom;
  }

  address top() {
    return _top;
  }

  address end() {
    return _end;
  }

  bool contains(address obj);
  address allocate(size_t size);
  void reset();

  void scan_and_forward();
  void adjust_pointers();
  void compact();
};

Heap::Heap(address bottom, address end) {
  _the_space = new ContigCompatibleSpace(bottom, end);
}

address Heap::allocate(size_t size) {
  return _the_space->allocate();
}

void Heap::collect() {
  mark_compact_phase1();
  mark_compact_phase2();
  mark_compact_phase3();
  mark_compact_phase4();
}

void Heap::mark_compact_phase1() {
  foreach(Object** slot : ROOTS) {
    process_root(slot);
  }
}

void Heap::process_root(Object** slot) {
  Stack s;

  Object* oop = *slot;
  oop->set_gc_mark();
  s.push(oop);
  while (!s.empty()) {
    oop = s.pop();

    foreach(Object** obj_field : oop->object_fields()) {
      if (!(*obj_field)->gc_marked()) {
        (*obj_field)->set_gc_mark();
        s.push(*obj_filed);
      }
    }
  }
}

void Heap::mark_compact_phase2() {
  _the_space->scan_and_forward();
}

void Heap::mark_compact_phase3() {
  foreach(Object** slot : ROOTS) {
    *slot = (*slot)->forwardee();
  }

  _the_space->adjust_pointers();
}

void Heap::mark_compact_phase4() {
  _the_space->compact();
}

ContigCompatibleSpace::ContigCompatibleSpace(address bottom, address end) {
  _bottom = bottom;
  _top = bottom;
  _end = end;
}

address ContigCompatibleSpace::contains(address obj) {
  return _bottom <= obj && obj < _top;
}

address ContigCompatibleSpace::allocate(size_t size) {
  if (_top + size <= _end) {
    Object* obj = _top;
    _top += size;
    return obj;
  } else {
    return null;
  }
}

void ContigCompatibleSpace::reset() {
  _top = _bottom;
}

void ContigCompatibleSpace::scan_and_forward() {
  Object* q = _bottom;
  address compacting_top = _bottom;
  _first_dead = _end;
  while (q < _end) {
    if (q->gc_marked()) {
      if (compacting_top == q) {
        q->clear_gc_mark();
        q->forward_to(null);
      } else
        q->forward_to(compacting_top);
      compacting_top += q->size();
      q += q->size();
    } else {
      if (_first_dead == _end)
        _first_dead = q;
      Object* p = q;
      do {
        p += p->size();
      } while (!p->gc_marked());
      q->forward_to(p);
      q = p;
    }
  }
}

void ContigCompatibleSpace::adjust_pointers() {
  Object* q = _bottom;
  while (q < _first_dead) {
    q->adjust_object_fields();
    q += q->size();
  }
  q = _first_dead->forwardee();
  while (q < _end) {
    if (q->gc_marked()) {
      q->adjust_object_fields();
      q += q->size();
    } else {
      q = q->forwardee();
    }
  }
}

void ContigCompatibleSpace::compact() {
  Object* q = _first_dead->forwardee();
  while (q < _end) {
    if (q->gc_marked()) {
      q->clear_gc_mark();
      q->copy_to_forwardee();
      q += q->size();
    } else {
      q = q->forwardee();
    }
  }
}
分享到:
评论

相关推荐

    Java full gc触发情况实例解析

    Java Full GC 触发情况实例解析主要介绍了 Java full gc 触发情况实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下。 System.gc() 方法的调用是建议...

    HotSpot GC官网文档截图 - 20200917

    【HotSpot GC官网文档截图 - 20200917】是一个珍贵的资源集合,包含了一系列关于Java HotSpot虚拟机(JVM)垃圾收集器(GC)的官方文档截图。这些截图详细介绍了GC的发展历程、不同版本的特性、选择GC的策略以及调优...

    hotspot源代码

    5. **垃圾收集器**:Hotspot的垃圾收集器源代码展示了各种GC算法的实现,如CMS的并发标记清除过程,G1的 Region 分区和并行回收,以及ZGC的低暂停时间设计。 三、源代码学习的价值 1. **性能优化**:通过深入源...

    hllvm.HotSpot VM Serial GC的一个问题1

    【Java HotSpot VM Serial GC详解】 HotSpot VM的Serial GC是一种单线程的垃圾收集器,主要用于新生代的垃圾回收,特别适用于轻量级和低内存的环境。在这个话题中,我们将深入探讨Serial GC在新生代(Young ...

    JDK10(JDK10底层C++源码及hotspot虚拟机源码)

    JDK10的G1 Full GC并行化是HotSpot的一个重要改进。 3. **内存模型(Memory Model)**:HotSpot虚拟机实现了Java内存模型,确保多线程环境下数据的一致性和可见性。 4. **类加载机制(Class Loading)**:HotSpot...

    Sun Hotspot V1.6.0 JVM GC PPT.pdf

    ### Sun Hotspot V1.6.0 JVM GC详解 #### 一、JVM结构与GC基础知识 ##### 1.1 JVM内存结构概述 Java虚拟机(JVM)内存主要分为以下几个部分: - **程序计数器(PC Register)**:记录当前线程所执行的字节码指令...

    hotspot 源码(JDK8)

    Hotspot的GC策略包括Serial、Parallel、Concurrent Mark Sweep (CMS) 和G1。JDK8中,CMS是默认的并行旧代收集器,而G1则是新生代和老年代都采用并发收集的新生代选择。理解这些GC的工作原理和调优参数,对于解决...

    hotspot.tar.gz

    Hotspot VM的名字来源于其核心理念——热点代码检测,即自动识别并优化执行频繁的代码段,从而提高整体程序的运行效率。本文将围绕Hotspot VM的源码进行深入探讨,揭示其内部工作机制。 一、Hotspot VM的架构 ...

    HotSpot实战

    3. **监控并分析 GC 日志**:定期查看 GC 日志,分析是否有频繁的 Full GC 或者长时间的 GC 暂停,据此调整相关参数。 4. **优化线程池配置**:合理配置线程池的最大线程数、核心线程数等参数,以平衡 CPU 使用率...

    JVM内存管理-GC模型-编写GC友好的代码

    JVM内存管理的介绍,编写GC友好的代码。 本材料主要关心 Sun Hotspot JVM 6的内存管理 Sun Hotspot JVM 6的GC模型 主要针对JVM6的GC模型,但也会简单介绍Java 7的G1 编写GC友好代码的一些技巧

    OpenJDK(HotSpot JVM、Javac)源代码学习研究(包括代码注释、文档、用于代码分析的测试用例)

    OpenJDK(HotSpot JVM、Javac)源代码学习研究(包括代码注释、文档、用于代码分析的测试用例)

    jvm 参数及gc详解

    2. 老年代GC(Major GC 或 Full GC) 老年代GC处理的是长期存活的对象,使用标记-整理或标记-压缩算法。当老年代空间不足或系统请求Full GC时,会执行此操作。Full GC开销大,应尽量避免频繁触发。 3. 垃圾收集器 ...

    hotspot1.7.rar

    【标题】"hotspot1.7.rar" 是一个包含了Hotspot虚拟机源代码的压缩文件,版本号可能指的是Java 7。Hotspot是Oracle公司开发的一款高性能的Java虚拟机(JVM),它广泛应用于Java应用程序的运行环境中。Hotspot的名字...

    Hotspot源码

    Hotspot JVM是Oracle JDK中的实现,其名称来源于其动态编译优化特性——热点代码识别(HotSpot)。Hotspot能够识别经常执行的代码段,并将其编译为机器码,以提高执行效率。 在Hotspot源码中,我们可以看到以下几个...

    openjdk hotspot源码

    4. **垃圾收集器(Garbage Collector, GC)**:Hotspot提供了多种GC策略,如Serial、Parallel、Concurrent Mark Sweep (CMS) 和G1。这些GC策略各有优缺点,适用于不同的应用场景。 5. **内存管理**:包括堆分配、...

    hotspot-d9c3790c85c1.rar

    《深入剖析Hotspot虚拟机1.6源代码》 Hotspot虚拟机,作为Java平台上的核心组成部分,一直以来都是Java性能优化的重要研究对象。本资源"hotspot-d9c3790c85c1.rar"包含了Hotspot 1.6版本的源代码,为深入理解JVM的...

    《HotSpot实战》

    3. **即时编译(JIT)**:HotSpot的一大特性是其即时编译机制,它能在运行时将频繁执行的热点代码编译为机器码,以提高执行效率。书中会介绍JIT编译的触发条件、优化策略以及如何查看编译信息。 4. **垃圾收集算法*...

    JVM Hotspot实现源码

    首先,Hotspot JVM的核心设计理念是“热Spot”优化,即通过动态分析代码执行情况,识别出经常执行的“热点”代码,然后对其进行JIT(Just-In-Time)编译,生成高效的本地机器码。这种优化策略显著提升了Java应用的...

    Antamedia-HotSpot.rar_Hotspot

    《Antamedia HotSpot许可证代码样本详解》 在IT领域,网络接入控制是管理网络访问权限的重要手段,其中Antamedia HotSpot是一款广泛使用的热点管理软件。本篇将深入探讨Antamedia HotSpot及其许可证代码文件的核心...

Global site tag (gtag.js) - Google Analytics