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 触发情况实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下。 System.gc() 方法的调用是建议...
【HotSpot GC官网文档截图 - 20200917】是一个珍贵的资源集合,包含了一系列关于Java HotSpot虚拟机(JVM)垃圾收集器(GC)的官方文档截图。这些截图详细介绍了GC的发展历程、不同版本的特性、选择GC的策略以及调优...
5. **垃圾收集器**:Hotspot的垃圾收集器源代码展示了各种GC算法的实现,如CMS的并发标记清除过程,G1的 Region 分区和并行回收,以及ZGC的低暂停时间设计。 三、源代码学习的价值 1. **性能优化**:通过深入源...
【Java HotSpot VM Serial GC详解】 HotSpot VM的Serial GC是一种单线程的垃圾收集器,主要用于新生代的垃圾回收,特别适用于轻量级和低内存的环境。在这个话题中,我们将深入探讨Serial GC在新生代(Young ...
### Sun Hotspot V1.6.0 JVM GC详解 #### 一、JVM结构与GC基础知识 ##### 1.1 JVM内存结构概述 Java虚拟机(JVM)内存主要分为以下几个部分: - **程序计数器(PC Register)**:记录当前线程所执行的字节码指令...
JDK10的G1 Full GC并行化是HotSpot的一个重要改进。 3. **内存模型(Memory Model)**:HotSpot虚拟机实现了Java内存模型,确保多线程环境下数据的一致性和可见性。 4. **类加载机制(Class Loading)**:HotSpot...
Hotspot的GC策略包括Serial、Parallel、Concurrent Mark Sweep (CMS) 和G1。JDK8中,CMS是默认的并行旧代收集器,而G1则是新生代和老年代都采用并发收集的新生代选择。理解这些GC的工作原理和调优参数,对于解决...
Hotspot VM的名字来源于其核心理念——热点代码检测,即自动识别并优化执行频繁的代码段,从而提高整体程序的运行效率。本文将围绕Hotspot VM的源码进行深入探讨,揭示其内部工作机制。 一、Hotspot VM的架构 ...
3. **监控并分析 GC 日志**:定期查看 GC 日志,分析是否有频繁的 Full GC 或者长时间的 GC 暂停,据此调整相关参数。 4. **优化线程池配置**:合理配置线程池的最大线程数、核心线程数等参数,以平衡 CPU 使用率...
JVM内存管理的介绍,编写GC友好的代码。 本材料主要关心 Sun Hotspot JVM 6的内存管理 Sun Hotspot JVM 6的GC模型 主要针对JVM6的GC模型,但也会简单介绍Java 7的G1 编写GC友好代码的一些技巧
OpenJDK(HotSpot JVM、Javac)源代码学习研究(包括代码注释、文档、用于代码分析的测试用例)
2. 老年代GC(Major GC 或 Full GC) 老年代GC处理的是长期存活的对象,使用标记-整理或标记-压缩算法。当老年代空间不足或系统请求Full GC时,会执行此操作。Full GC开销大,应尽量避免频繁触发。 3. 垃圾收集器 ...
【标题】"hotspot1.7.rar" 是一个包含了Hotspot虚拟机源代码的压缩文件,版本号可能指的是Java 7。Hotspot是Oracle公司开发的一款高性能的Java虚拟机(JVM),它广泛应用于Java应用程序的运行环境中。Hotspot的名字...
Hotspot JVM是Oracle JDK中的实现,其名称来源于其动态编译优化特性——热点代码识别(HotSpot)。Hotspot能够识别经常执行的代码段,并将其编译为机器码,以提高执行效率。 在Hotspot源码中,我们可以看到以下几个...
java 虚拟机 hotspot 源码
4. **垃圾收集器(Garbage Collector, GC)**:Hotspot提供了多种GC策略,如Serial、Parallel、Concurrent Mark Sweep (CMS) 和G1。这些GC策略各有优缺点,适用于不同的应用场景。 5. **内存管理**:包括堆分配、...
《深入剖析Hotspot虚拟机1.6源代码》 Hotspot虚拟机,作为Java平台上的核心组成部分,一直以来都是Java性能优化的重要研究对象。本资源"hotspot-d9c3790c85c1.rar"包含了Hotspot 1.6版本的源代码,为深入理解JVM的...
3. **即时编译(JIT)**:HotSpot的一大特性是其即时编译机制,它能在运行时将频繁执行的热点代码编译为机器码,以提高执行效率。书中会介绍JIT编译的触发条件、优化策略以及如何查看编译信息。 4. **垃圾收集算法*...
首先,Hotspot JVM的核心设计理念是“热Spot”优化,即通过动态分析代码执行情况,识别出经常执行的“热点”代码,然后对其进行JIT(Just-In-Time)编译,生成高效的本地机器码。这种优化策略显著提升了Java应用的...