- 浏览: 620227 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
oldrat:
引用Special cases aren't special ...
武汉大学开源技术俱乐部 技术交流 第1期 -
yzsunlight:
试了试 ,不行
Android Studio SDK Manager无法正常下载如何设置 -
qianjigui:
更全面的文档:http://www.5wpc.info/it/ ...
Ruby正则表达式操作参考 -
qianjigui:
Anddy 写道Anddy 写道tag是自动创建的吗? 能手动 ...
vim的跳转 -
Anddy:
Anddy 写道tag是自动创建的吗? 能手动创建吗? 在sh ...
vim的跳转
MMTk的整体结构和驱动模型主要由Plan, CollectorContext, MutatorContext, Phase组成:
- Plan 全局模块,初始化用的主要接口
- CollectorContext 线程级内存分配接口,独立GC线程 收集?
- MutatorContext 全局内存分配 赋值?
Plan
- 基本常量管理
- 各种space初始化:
- immortal:ImmortalSpace 永生数据空间
- meta: RawPageSpace MMTk的元数据空间
- los: LargeObjectSpace 大对象数据空间
- sanity: RawPageSpace 支持Sanity-checker的数据空间
- non-moving: MarkSweepSpace
- small-code: MarkSweepSpace
- large-code: LargeObjectSpace
- 内存管理初始化:
- enableAllocation 开启内存分配
- processOptions 参数处理
- enableCollection 开启垃圾收集,并spawning一个GC线程
- fullyBooted 完全初始化
- 与MemoryManager互通的API
- 管理具体步骤
- Simple类
MutatorContext
- 非同步GC(利用读写栅栏处理)
- Initialization
- Collection: collectionPhase
- Allocation
- checkAllocator 选择allocator
- alloc 根据请求分配空间
- postAlloc 分配成功,设置object-header
- Space
- 各种数据类型的读写栅栏
CollectorContext
- 全局同步
- allocCopy
- postCopy
- run 启动线程的流程:
- Plan::enableCollection() VM.collection.spawnCollectorContext(controlCollectorContext)
- CollectorContext::run()
- Simple::run()
//ParallelCollector @Unpreemptible public void run() { while(true) { park(); collect(); } }
- rendezvous() 集中各个线程
Phase主要流程
/** * Process the phase stack. This method is called by multiple threads. */ private static void processPhaseStack(boolean resume) { /* Global and Collector instances used in phases */ Plan plan = VM.activePlan.global(); ParallelCollector collector = (ParallelCollector)VM.activePlan.collector(); int order = collector.rendezvous(); final boolean primary = order == 0; boolean log = Options.verbose.getValue() >= 6; boolean logDetails = Options.verbose.getValue() >= 7; if (primary && resume) { Plan.setGCStatus(Plan.GC_PROPER); } /* In order to reduce the need for synchronization, we keep an odd or even * counter for the number of phases processed. As each phase has a single * rendezvous it is only possible to be out by one so the odd or even counter * protects us. */ boolean isEvenPhase = true; if (primary) { /* Only allow concurrent collection if we are not collecting due to resource exhaustion */ allowConcurrentPhase = Plan.isInternalTriggeredCollection() && !Plan.isEmergencyCollection(); /* First phase will be even, so we say we are odd here so that the next phase set is even*/ setNextPhase(false, getNextPhase(), false); } /* Make sure everyone sees the first phase */ collector.rendezvous(); /* The main phase execution loop */ int scheduledPhase; while((scheduledPhase = getCurrentPhase(isEvenPhase)) > 0) { short schedule = getSchedule(scheduledPhase); short phaseId = getPhaseId(scheduledPhase); Phase p = getPhase(phaseId); /* Start the timer(s) */ if (primary) { if (resume) { resumeComplexTimers(); } if (p.timer != null) p.timer.start(); if (startComplexTimer > 0) { Phase.getPhase(startComplexTimer).timer.start(); startComplexTimer = 0; } } if (log) { Log.write("Execute "); p.logPhase(); } /* Execute a single simple scheduled phase */ switch (schedule) { /* Global phase */ case SCHEDULE_GLOBAL: { if (logDetails) Log.writeln(" as Global..."); if (primary) { plan.collectionPhase(phaseId); } break; } /* Collector phase */ case SCHEDULE_COLLECTOR: { if (logDetails) Log.writeln(" as Collector..."); collector.collectionPhase(phaseId, primary); break; } /* Mutator phase */ case SCHEDULE_MUTATOR: { if (logDetails) Log.writeln(" as Mutator..."); /* Iterate through all mutator contexts */ MutatorContext mutator; while ((mutator = VM.activePlan.getNextMutator()) != null) { mutator.collectionPhase(phaseId, primary); } break; } /* Concurrent phase */ case SCHEDULE_CONCURRENT: { /* We are yielding to a concurrent collection phase */ if (logDetails) Log.writeln(" as Concurrent, yielding..."); if (primary) { concurrentPhaseId = phaseId; /* Concurrent phase, we need to stop gc */ Plan.setGCStatus(Plan.NOT_IN_GC); Plan.controlCollectorContext.requestConcurrentCollection(); } collector.rendezvous(); if (primary) { pauseComplexTimers(); } return; } default: { /* getNextPhase has done the wrong thing */ VM.assertions.fail("Invalid schedule in Phase.processPhaseStack"); break; } } if (primary) { /* Set the next phase by processing the stack */ int next = getNextPhase(); boolean needsResetRendezvous = (next > 0) && (schedule == SCHEDULE_MUTATOR && getSchedule(next) == SCHEDULE_MUTATOR); setNextPhase(isEvenPhase, next, needsResetRendezvous); } /* Sync point after execution of a phase */ collector.rendezvous(); /* Mutator phase reset */ if (primary && schedule == SCHEDULE_MUTATOR) { VM.activePlan.resetMutatorIterator(); } /* At this point, in the case of consecutive phases with mutator * scheduling, we have to double-synchronize to ensure all * collector threads see the reset mutator counter. */ if (needsMutatorResetRendezvous(isEvenPhase)) { collector.rendezvous(); } /* Stop the timer(s) */ if (primary) { if (p.timer != null) p.timer.stop(); if (stopComplexTimer > 0) { Phase.getPhase(stopComplexTimer).timer.stop(); stopComplexTimer = 0; } } /* Flip the even / odd phase sense */ isEvenPhase = !isEvenPhase; resume = false; } }
发表评论
-
Android Studio SDK Manager无法正常下载如何设置
2014-06-02 10:29 5724一方面在/etc/hosts中设置: #Google主页 ... -
Android Dalvik VM GC options 命令控制参数
2014-04-06 10:19 2382} else if (strncmp(argv[i], & ... -
Ruby 2.1 GC策略
2014-01-23 11:30 937对象管理主要涉及: Profiling support ... -
Google 持续集成介绍
2014-01-23 11:26 1560见附件PPT. 具体方案 构建描述 依赖分析 ... -
Ubuntu 10.04 企业 Cisco VPN 安装与配置使用
2013-12-31 23:36 789更全的版本见: http://www.5wpc.info/ ... -
函数式编程 读后感
2013-12-30 15:24 1448一篇比较不错的文章: http://coolshel ... -
系统模块集成管理与版本控制学习
2013-12-27 12:01 1328论软件生命周期集成 http://www.infoq.com ... -
Ruby 动态特性鉴赏
2013-12-26 16:47 1330以下代码与代码学习来自<Ruby Best Prac ... -
Android应用插件化与动态部署 学习
2013-12-26 16:45 0通过REST将相关服务有语义的组合起来。 动态部署: ... -
用Markdown做文档的问题
2013-12-23 18:06 857一直有想一种语言能够解决文档编写问题。 一般文档编写 ... -
Android组件、通信与安全机制学习
2013-12-20 12:26 0现有问题: Android的组件间通信有哪些方法?其中的I ... -
Android root 原理学习
2013-12-15 23:51 2321学习资源: http://www.zhihu.com/qu ... -
Android PREBUILT APPS 运行dex preopt
2013-12-09 13:57 0主体思路是模仿package的preopt处理,对buil ... -
Android 设置/system/bin/cmd的权限遇到的问题
2013-11-25 16:17 2058Android开发的过程中,需要添加一些系统服务,而这些服 ... -
模块网络访问分析
2013-12-27 11:29 888上述工作,可以通过: 人工了解 主要是沟通成本太高 ... -
Android系统启动过程整体视图
2013-11-25 11:07 750整体如上图:分为三个系统体系: uboot Li ... -
将设备的部分分区dump出来
2013-11-20 14:25 805基本命名: dd if=/dev/block/mmcblk ... -
Android Build系统bash filename too long问题
2013-11-06 10:45 1471在对Android Build系统进行修改的过程中,可能会在 ... -
VIM diff 模式使用
2013-11-04 11:24 819vimdiff mode: do -- Get chan ... -
Linux工作基本使用
2013-11-04 11:23 989Mount相关 sudo apt-get install ...
相关推荐
5. **分子构建与参数化**:MMTK提供工具来创建和编辑分子结构,并自动完成参数化过程,包括原子类型识别和力场参数的分配。 6. **模拟控制**:用户可以设置模拟条件,如温度、压力、时间步长等,并选择不同的分子...
matlab说话代码模拟方法工具包(MTK)的自述文件 作者: Eduardo J. Sanchez,博士。 -邮件点sdsu点edu上的esanchez __________________________________________________________________ 1.说明 我们定义了基于...
MMTk MMTk是用于内存管理器设计和实现的框架。 该存储库托管MMTk的Rust端口。... 通过将--features标志传递给Rust编译器,我们可以有条件地编译与功能相关的代码。 例如,您可以选择通过将sanity添
make vm=jdk build run gc=semispace benchmark=xalan发布版本make vm=jdk config profile=release make vm=jdk build run profile=release gc=semispace benchmark=xalan运行mmtk-core提交前CI make vm=jdk run-ci...
MMTK-2.7.9-cp27-none-win32
MMTK-2.7.9-cp27-none-win_amd64
压缩文件有18M,我只有15M权限,只好分2次压缩了。所以PART2不需要积分即可下载。http://download.csdn.net/source/974578
1. ASP编程:学习如何使用ASP创建动态网页,包括变量、控制结构、内置对象等。 2. 数据采集与爬虫技术:理解HTTP协议,编写爬虫脚本,以及如何处理反爬策略。 3. URL伪静态技术:学习如何将动态URL转换为静态URL形式...
Cork在MMTk(Modular Memory Manager Toolkit)上实现,并应用于Jikes RVM(Research Virtual Machine)。测试结果显示,在使用分代标记清除垃圾收集器的情况下,对于中等大小的堆,Cork的平均开销仅为2.4%,对于大...