jvm源码解读--14 defNewGeneration.cpp gc标记复制之后,进行空间清理

进入Eden()->clean()函数
void EdenSpace::clear(bool mangle_space) {
ContiguousSpace::clear(mangle_space);
set_soft_end(end());
}
进入
void ContiguousSpace::clear(bool mangle_space) {
set_top(bottom());
set_saved_mark();
CompactibleSpace::clear(mangle_space);
}
打印对象,这个是eden
(gdb) p this
$154 = (EdenSpace * const) 0x7f4780020328
(gdb) p * this
$155 = (EdenSpace) {
<ContiguousSpace> = {
<CompactibleSpace> = {
<Space> = {
<CHeapObj<1280u>> = {
<AllocatedObj> = {
_vptr.AllocatedObj = 0x7f4788515a90 <vtable for EdenSpace+16>
}, <No data fields>},
members of Space:
_bottom = 0xf3800000,
_end = 0xf5600000,
_saved_mark_word = 0xf4dccdb8,
_preconsumptionDirtyCardClosure = 0x0,
_par_seq_tasks = {
<StackObj> = {
<AllocatedObj> = {
_vptr.AllocatedObj = 0x7f47884fb650 <vtable for SequentialSubTasksDone+16>
}, <No data fields>},
members of SequentialSubTasksDone:
_n_tasks = 0,
_n_claimed = 0,
_n_threads = 0,
_n_completed = 0
}
},
members of CompactibleSpace:
_compaction_top = 0xf3800000,
_next_compaction_space = 0x7f4780020438,
_first_dead = 0xf1f1f1f1f1f1f1f1,
_end_of_live = 0xf1f1f1f1f1f1f1f1
},
members of ContiguousSpace:
_top = 0xf4dccdb8,
_concurrent_iteration_safe_limit = 0xf3800000,
_mangler = 0x7f47800203e8
},
members of EdenSpace:
_gen = 0x7f478001f1c8,
_soft_end = 0xf5600000
}
看实现
(gdb) p bottom()
$156 = (HeapWord *) 0xf3800000
(gdb) p top()
$157 = (HeapWord *) 0xf4dccdb8
将top清空
设置mark
virtual void set_saved_mark() { _saved_mark_word = top(); }
清理完之后的对象
(gdb) p *this
$159 = (EdenSpace) {
<ContiguousSpace> = {
<CompactibleSpace> = {
<Space> = {
<CHeapObj<1280u>> = {
<AllocatedObj> = {
_vptr.AllocatedObj = 0x7f4788515a90 <vtable for EdenSpace+16>
}, <No data fields>},
members of Space:
_bottom = 0xf3800000,
_end = 0xf5600000,
_saved_mark_word = 0xf3800000,
_preconsumptionDirtyCardClosure = 0x0,
_par_seq_tasks = {
<StackObj> = {
<AllocatedObj> = {
_vptr.AllocatedObj = 0x7f47884fb650 <vtable for SequentialSubTasksDone+16>
}, <No data fields>},
members of SequentialSubTasksDone:
_n_tasks = 0,
_n_claimed = 0,
_n_threads = 0,
_n_completed = 0
}
},
members of CompactibleSpace:
_compaction_top = 0xf3800000,
_next_compaction_space = 0x7f4780020438,
_first_dead = 0xf1f1f1f1f1f1f1f1,
_end_of_live = 0xf1f1f1f1f1f1f1f1
},
members of ContiguousSpace:
_top = 0xf3800000,
_concurrent_iteration_safe_limit = 0xf3800000,
_mangler = 0x7f47800203e8
},
members of EdenSpace:
_gen = 0x7f478001f1c8,
_soft_end = 0xf5600000
}
接着看
CompactibleSpace::clear(mangle_space);
----------------------------------------------
void CompactibleSpace::clear(bool mangle_space) {
Space::clear(mangle_space);
_compaction_top = bottom();
}
----------------------------------------------
void Space::clear(bool mangle_space) {
if (ZapUnusedHeapArea && mangle_space) {
mangle_unused_area();
}
} -------------------------------------------------
void ContiguousSpace::mangle_unused_area() {
mangler()->mangle_unused_area();
}
-----------------------------------------------------
void SpaceMangler::mangle_unused_area() {
assert(ZapUnusedHeapArea, "Mangling should not be in use");
// Mangle between top and the high water mark. Safeguard
// against the space changing since top_for_allocations was
// set.
HeapWord* mangled_end = MIN2(top_for_allocations(), end());
if (top() < mangled_end) {
MemRegion mangle_mr(top(), mangled_end);
SpaceMangler::mangle_region(mangle_mr);
// Light weight check of mangling.
check_mangled_unused_area(end());
}
// Complete check of unused area which is functional when
// DEBUG_MANGLING is defined.
check_mangled_unused_area_complete();
}
打印这个spaceMangler对象
(gdb) p _mangler
$162 = (GenSpaceMangler *) 0x7f47800203e8
(gdb) p *_mangler
$163 = (GenSpaceMangler) {
<SpaceMangler> = {
<CHeapObj<1280u>> = {
<AllocatedObj> = {
_vptr.AllocatedObj = 0x7f47885163d0 <vtable for GenSpaceMangler+16>
}, <No data fields>},
members of SpaceMangler:
_top_for_allocations = 0xf4dccdb8
},
members of GenSpaceMangler:
_sp = 0x7f4780020328
}
查看紫色函数
(gdb) p end()
$164 = (HeapWord *) 0xf5600000
(gdb) p _top_for_allocations
$165 = (HeapWord *) 0xf4dccdb8
进入棕色函数
// Simply mangle the MemRegion mr.
void SpaceMangler::mangle_region(MemRegion mr) {
assert(ZapUnusedHeapArea, "Mangling should not be in use");
#ifdef ASSERT
if(TraceZapUnusedHeapArea) {
gclog_or_tty->print("Mangling [0x%x to 0x%x)", mr.start(), mr.end());
}
Copy::fill_to_words(mr.start(), mr.word_size(), badHeapWord);
if(TraceZapUnusedHeapArea) {
gclog_or_tty->print_cr(" done");
}
#endif
}
进入函数
// Fill methods // Fill word-aligned words, not atomic on each word
// set_words
static void fill_to_words(HeapWord* to, size_t count, juint value = 0) {
assert_params_ok(to, LogHeapWordSize);
pd_fill_to_words(to, count, value);
}
进入
static void pd_fill_to_words(HeapWord* tohw, size_t count, juint value) {
#ifdef AMD64
julong* to = (julong*) tohw;
julong v = ((julong) value << 32) | value;
while (count-- > 0) {
*to++ = v;
}
#else..无用..
#endif // AMD64
}
看badHeapWord的值
(gdb) p/x value
$171 = 0xbaadbabe
那么上述过程就是将heap的值全部设置成了0xbaadbabe
接着就是对from区域
(gdb) p from()
$175 = (ContiguousSpace *) 0x7f4780020438
重要的交换空间
swap_spaces();
交换之前
(gdb) p this
$181 = (DefNewGeneration * const) 0x7f478001f1c8
(gdb) p* this
$182 = (DefNewGeneration) {
<Generation> = {
<CHeapObj<1280u>> = {
<AllocatedObj> = {
_vptr.AllocatedObj = 0x7f47884ff590 <vtable for DefNewGeneration+16>
}, <No data fields>},
members of Generation:
_time_of_last_gc = -1012762419733073423,
_prev_used_region = {
_start = 0x0,
_word_size = 0
},
_reserved = {
_start = 0xf3800000,
_word_size = 6553600
},
....略部分
_promo_failure_drain_in_progress = false,
_gen_counters = 0x7f4780020638,
_eden_counters = 0x7f478000d678,
_from_counters = 0x7f4780021888,
_to_counters = 0x7f4780021d78,
_max_eden_size = 31457280,
_max_survivor_size = 10485760,
_should_allocate_from_space = false,
_eden_space = 0x7f4780020328,
_from_space = 0x7f4780020438,
_to_space = 0x7f4780020538,
_gc_timer = 0x7f4780022268
}
代码为
void DefNewGeneration::swap_spaces() {
ContiguousSpace* s = from();
_from_space = to();
_to_space = s;
eden()->set_next_compaction_space(from());
// The to-space is normally empty before a compaction so need
// not be considered. The exception is during promotion
// failure handling when to-space can contain live objects.
from()->set_next_compaction_space(NULL);
if (UsePerfData) {
CSpaceCounters* c = _from_counters;
_from_counters = _to_counters;
_to_counters = c;
}
}
这个函数为 eden()->set_next_compaction_space(from());
void set_next_compaction_space(CompactibleSpace* csp) {
_next_compaction_space = csp;
}
将eden()的值设置为新的from值,(即原来的from空间已经变为了to空间)
if (UsePerfData) {
CSpaceCounters* c = _from_counters;
_from_counters = _to_counters;
_to_counters = c;
}
设置完成后就结束了
jvm源码解读--14 defNewGeneration.cpp gc标记复制之后,进行空间清理的更多相关文章
- JVM 源码解读之 CMS 何时会进行 Full GC
t点击上方"涤生的博客",关注我 转载请注明原创出处,谢谢!如果读完觉得有收获的话,欢迎点赞加关注. 前言 本文内容是基于 JDK 8 在文章 JVM 源码解读之 CMS GC 触 ...
- jvm源码解读--17 Java的wait()、notify()学习
write and debug by 张艳涛 wait()和notify()的通常用法 A线程取得锁,执行wait(),释放锁; B线程取得锁,完成业务后执行notify(),再释放锁; B线程释放锁 ...
- jvm源码解读--08 创建oop对象,将static静态变量放置在oop的96 offset处
之前分析的已经加载的.Class文件中都没有Static 静态变量,所以也就没这部分的解析,自己也是不懂hotspot 将静态变量放哪里去了,追踪源码之后,看清楚了整个套路,总体上来说,可以举例来说对 ...
- jvm源码解读--13 gc_root中的栈中oop的mark 和copy 过程分析
粘贴源码 package com.test; import java.util.Random; public class Test { static int number=12; private in ...
- jvm源码解读--11 ldc指令的解读
写一个java文件 public static void main(String[] args) { String str1="abc"; String str2 ="a ...
- jvm源码解读--10 enum WKID 枚举
源码中对于枚举类型WKID的使用 static bool initialize_wk_klass(WKID id, int init_opt, TRAPS); static void initiali ...
- jvm源码解读--16 cas 用法解析
CAS的意思是campare and sweep比较交换 这个如果不用代码会比较抽象,那么在源码中进行解释 void ATTR ObjectMonitor::enter(TRAPS) { // The ...
- jvm源码解读--06 Method 方法解析
进入 // Methods bool has_final_method = false; AccessFlags promoted_flags; promoted_flags.set_flags(0) ...
- jvm源码解读--15 oop对象详解
(gdb) p obj $15 = (oopDesc *) 0xf3885d08 (gdb) p * obj $16 = { _mark = 0x70dea4e01, _metadata = { _k ...
随机推荐
- 【UG二次开发】装配设计
与装配相关的术语 tag 部件或对象的标识,还可能是部件原型.实例和事例 piece part 单个部件 occurrence 部件或对象的事例,装配中的是部件事例 object occurrence ...
- docker入门详解
这可能是最为详细的Docker总结 Docker是什么? 在计算机技术日新月异的今天, Docker 在国内发展的如火如荼,特别是在一线互联网公司, Docker 的使用是十分普遍的,甚至成为了一些企 ...
- Pandas高级教程之:处理text数据
目录 简介 创建text的DF String 的方法 columns的String操作 分割和替换String String的连接 使用 .str来index extract extractall c ...
- 初学springboot
现在总是与数据库和前端打交道,让我觉得好厌烦,还是喜欢敲代码.最近问了几个朋友,都说潮流要学springCloud,然后学springCloud又要先学springboot,所以这段时间我会慢慢把sp ...
- redis学习第一天
不同于其他的常用关系型数据库,redis是一个非常轻便,体积小,存放键值对的数据库,常用于构建高性能,可扩展的Web应用程序. 这是我第一次接触redis,之前没有使用过,只听说过.因为刚毕业,找工作 ...
- 注解式项目开发!详细解析Java中各个注解的作用和使用方式
@Target 作用: 指明了修饰的这个注解的使用范围, 即被描述的注解可以用在哪里 @Target(ElementType.Type) ElementType取值的类型: TYPE: 类,接口或者枚 ...
- Golang编写动态库实现回调函数
Golang编写动态库实现回调函数 我们现在要做一个动态库,但是C++实在是比较难,于是就想能不能用更简单的golang来实现,golang也就是最近的版本才支持编译成动态库,在网上也没找到可用的案例 ...
- 最新的.NET 热重载介绍
今天,我们很高兴的向您介绍 Visual Studio 2019 版本 16.11(预览版 1)和 .NET 6 中的 dotnet watch 命令行工具(预览版 4)中的 .NET 热重载体验的可 ...
- 一分钟了解JDBC的构成和原理
JDBC(一组接口组成) : 形式如下: 1:JDBC-ODBC桥接技术(100%不用) 在Windows中有ODBC技术,ODBC指的是开放数据库链接 是由微软提供的数据库连接应用,而Java可以利 ...
- Ubuntu创建图标
起因 安装一些软件时,总是没有图标,导致无法固定到docky栏,所以极为不方便,所以需要自己创建图标. 操作 以创建微信图标为例 [Desktop Entry] Name=Wecaht #名字 Com ...