解读Dart虚拟机的参数列表

2021-04-16

2939 0 0

一、概述

在third_party/dart/runtime/vm/flag_list.h定义了Dart虚拟机中所有标志的列表,标志分为以下几大类别:

  • Product标记:可以在任何部署模式中设置,包括Product模式
  • Release标志:通常可用的标志,除Product模式以外
  • Precompile标志:通常可用的标志,除Product模式或已预编译的运行时以外
  • Debug标志:只能在启用C++断言的VM调试模式中设置

Product、Release、Precompile、Debug这四类可控参数,可使用的范围逐次递减,比如Product flags可用于所有模式,Debug flags只能用于调试模式。Dart虚拟机总共有106个flags参数

二、flags参数

2.1 Product flags

用法:PRODUCT_FLAG_MARCO(名称,类型,默认值,注解)

名称默认值注解
collect_dynamic_function_namestrue收集所有动态函数名称以标识唯一目标
enable_kernel_expression_compilationtrue启用内核前端来编译表达式
enable_mirrorstrue允许导入dart:mirrors
enable_ffitrue允许导入dart:ffi
guess_icdata_cidtrue创建算法等操作的类型反馈
lazy_dispatcherstrue懒惰地生成调度程序
polymorphic_with_deopttrue反优化的多态调用、巨形调用
reorder_basic_blockstrue对基本块重新排序
use_bare_instructionstrue启用裸指令模式
truncating_left_shifttrue尽可能优化左移以截断
use_cha_deopttrue使用类层次分析,即使会导致反优化
use_strong_mode_typestrue基于强模式类型的优化
enable_slow_path_sharingtrue启用共享慢速路径代码
enable_multiple_entrypointstrue启用多个入口点
experimental_unsafe_mode_use_ at_your_own_riskfalse省略运行时强模式类型检查并禁用基于类型的优化
abort_on_oomfalse如果内存分配失败则中止,仅与–old-gen-heap-size一起使用
collect_codefalse尝试GC不常用代码
dwarf_stack_tracesfalse在dylib快照中发出dwarf行号和内联信息,而不表示堆栈跟踪
fields_may_be_resetfalse不要优化静态字段初始化
link_natives_lazilyfalse懒加载链接本地调用
precompiled_modefalse预编译编译器模式
print_snapshot_sizesfalse打印生成snapshot的大小
print_snapshot_sizes_verbosefalse打印生成snapshot的详细大小
print_benchmarking_metricsfalse打印其他内存和延迟指标以进行基准测试
shared_slow_path_triggers_gcfalse测试:慢路径触发GC
trace_strong_mode_typesfalse跟踪基于强模式类型的优化
use_bytecode_compilerfalse从字节码编译
use_compactorfalse当在旧空间执行GC时则压缩堆
enable_testing_pragmasfalse启用神奇的编译指示以进行测试
enable_interpreterfalse启用解释内核字节码
verify_entry_pointsfalse通过native API访问无效成员时抛出API错误
background_compilationUSING_MULTICORE根据是否多核来决定是否后台运行优化编译
concurrent_markUSING_MULTICORE老年代的并发标记
concurrent_sweepUSING_MULTICORE老年代的并发扫描
use_field_guards!USING_DBC使用字段gurad,跟踪字段类型
interpret_irregexpUSING_DBC使用irregexp字节码解释器
causal_async_stacks!USING_PRODUCT非product 则开启改进异步堆栈
marker_tasksUSING_MULTICORE ? 2 : 0老生代GC标记的任务数,0代表在主线程执行
idle_timeout_micros1000 * 1000长时间后将空闲任务从线程池隔离,单位微秒
idle_duration_micros500 * 1000允许空闲任务运行的时长
old_gen_heap_size(kWordSize <= 4) ? 1536 : 0旧一代堆的最大大小,或0(无限制),单位MB
new_gen_semi_max_size(kWordSize <= 4) ? 8 : 16新一代半空间的最大大小,单位MB
new_gen_semi_initial_size(kWordSize <= 4) ? 1 : 2新一代半空间的最大初始大小,单位MB
compactor_tasks2并行压缩使用的任务数
getter_setter_ratio13用于double拆箱启发式的getter/setter使用率?
huge_method_cutoff_in_tokens20000令牌中的大量方法中断:禁用大量方法的优化?
max_polymorphic_checks4多态检查的最大数量,否则为巨形的?
max_equality_polymorphic_checks32等式运算符中的多态检查的最大数量
compilation_counter_threshold10在解释执行函数编译完成前的函数使用次数要求,-1表示从不
optimization_counter_threshold30000函数在优化前的用法计数值,-1表示从不
optimization_level2优化级别:1(有利大小),2(默认),3(有利速度)

optimization_level这是一个可以尝试的参数

2.2 Release flags

用法:RELEASE_FLAG_MARCO(名称,product_value,类型,默认值,注解)

名称product值默认值注解
eliminate_type_checkstruetrue静态类型分析允许时消除类型检查
dedup_instructionstruefalse预编译时规范化指令
support_disassemblerfalsetrue支持反汇编
support_il_printerfalsetrue支持IL打印
support_servicefalsetrue支持服务协议
disable_alloc_stubs_after_gcfalsefalse压力测试标识
disassemblefalsefalse反汇编dart代码
disassemble_optimizedfalsefalse反汇编优化代码
dump_megamorphic_statsfalsefalsedump巨形缓存统计信息
dump_symbol_statsfalsefalsedump符合表统计信息
enable_assertsfalsefalse启用断言语句
log_marker_tasksfalsefalse记录老年代GC标记任务的调试信息
randomize_optimization_counterfalsefalse基于每个功能随机化优化计数器阈值,用于测试
pause_isolates_on_startfalsefalse在isolate开始前暂停
pause_isolates_on_exitfalsefalse在isolate退出前暂停
pause_isolates_on_unhandled_exceptionsfalsefalse在isolate发生未捕获异常前暂停
print_ssa_liverangesfalsefalse内存分配后打印有效范围
print_stacktrace_at_api_errorfalsefalse当API发生错误时,打印native堆栈
profilerfalsefalse开启profiler
profiler_native_memoryfalsefalse开启native内存统计收集
trace_profilerfalsefalse跟踪profiler
trace_field_guardsfalsefalse跟踪字段cids的变化
verify_after_gcfalsefalse在GC之后启用堆验证
verify_before_gcfalsefalse在GC之前启用堆验证
verbose_gcfalsefalse开启详细GC
verbose_gc_hdr4040打印详细的GC标头间隔

2.3 Precompile flags

用法:PRECOMPILE_FLAG_MARCO(名称,precompiled_value,product_value,类型,默认值,注释)

名称precompiled值product值默认值说明
load_deferred_eagerlytruetruefalse急切加载延迟的库
use_osrfalsetruetrue使用OSR
async_debuggerfalsefalsetrue调试器支持异步功能
support_reloadfalsefalsetrue支持isolate重新加载
force_clone_compiler_objectsfalsefalsefalse强制克隆编译器中所需的对象(ICData和字段)
stress_async_stacksfalsefalsefalse压测异步堆栈
trace_irregexpfalsefalsefalse跟踪irregexps
deoptimize_alotfalsefalsefalse取消优化,从native条目返回到dart代码
deoptimize_every000在每N次堆栈溢出检查中取消优化

2.4 Debug flags

用法:DEBUG_FLAG_MARCO(名称,类型,默认值,注解)

名称默认值注解
print_variable_descriptorsfalse在反汇编中打印变量描述符
trace_chafalse跟踪类层次分析(CHA)操作
trace_icfalse跟踪IC处理?
trace_ic_miss_in_optimizedfalse跟踪优化中的IC未命中情况
trace_intrinsified_nativesfalse跟踪是否调用固有native
trace_isolatesfalse跟踪isolate的创建与关闭
trace_handlesfalse跟踪handles的分配
trace_kernel_binaryfalse跟踪内核的读写
trace_nativesfalse跟踪native调用
trace_optimizationfalse打印优化详情
trace_profiler_verbosefalse跟踪profiler详情
trace_runtime_callsfalse跟踪runtime调用
trace_ssa_allocatorfalse跟踪通过SSA的寄存器分配
trace_type_checksfalse跟踪运行时类型检测
trace_patchingfalse跟踪代码修补
trace_optimized_ic_callsfalse跟踪优化代码中的IC调用?
trace_zonesfalse跟踪zone的内存分配大小
verify_gc_containsfalse在GC期间开启地址是否包含的验证
verify_on_transitionfalse验证dart/vm的过渡?
support_rrfalse支持在RR中运行?

默认值全部都为false,

三、实现原理

3.1 FLAG_LIST

[-> third_party/dart/runtime/vm/flags.cc]

1FLAG_LIST(PRODUCT_FLAG_MARCO, 2 RELEASE_FLAG_MARCO, 3 DEBUG_FLAG_MARCO, 4 PRECOMPILE_FLAG_MARCO)

FLAG_LIST列举了所有的宏定义,这里有四种不同的宏,接下来逐一展开说明

3.2 flag宏定义

[-> third_party/dart/runtime/vm/flags.cc]

1// (1) Product标记:可以在任何部署模式中设置 2#define PRODUCT_FLAG_MARCO(name, type, default_value, comment) \ 3 type FLAG_##name = Flags::Register_##type(&FLAG_##name, #name, default_value, comment); 4 5// (2) Release标志:通常可用的标志,除Product模式以外 6#if !defined(PRODUCT) 7#define RELEASE_FLAG_MARCO(name, product_value, type, default_value, comment) \ 8 type FLAG_##name = Flags::Register_##type(&FLAG_##name, #name, default_value, comment); 9 10// (3) Precompile标志:通常可用的标志,除Product模式或已预编译的运行时以外 11#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME) 12#define PRECOMPILE_FLAG_MARCO(name, pre_value, product_value, type, default_value, comment) \ 13 type FLAG_##name = Flags::Register_##type(&FLAG_##name, #name, default_value, comment); 14 15// (4) Debug标志:只能在debug调试模式运行 16#if defined(DEBUG) 17#define DEBUG_FLAG_MARCO(name, type, default_value, comment) \ 18 type FLAG_##name = Flags::Register_##type(&FLAG_##name, #name, default_value, comment);

这里涉及到3个宏定义:

  • PRODUCT:代表Product模式;
  • DART_PRECOMPILED_RUNTIME:代表运行时已预编译模式;
  • DEBUG:代表调试模式;

可见,宏定义最终都是调用Flags::Register_XXX()方法,这里以FLAG_LIST中的其中一条定义来展开说明:

1P(collect_code, bool, false, "Attempt to GC infrequently used code.") 2//展开后等价如下 3type FLAG_collect_code = Flags::Register_bool(&FLAG_collect_code, collect_code, false, 4 "Attempt to GC infrequently used code.");

3.3 Flags::Register_bool

[-> third_party/dart/runtime/vm/flags.cc]

1bool Flags::Register_bool(bool* addr, 2 const char* name, 3 bool default_value, 4 const char* comment) { 5 Flag* flag = Lookup(name); //[见小节3.4] 6 if (flag != NULL) { 7 return default_value; 8 } 9 flag = new Flag(name, comment, addr, Flag::kBoolean); 10 AddFlag(flag); 11 return default_value; 12}

3.4 Flags::Lookup

[-> third_party/dart/runtime/vm/flags.cc]

1Flag* Flags::Lookup(const char* name) { 2 //遍历flags_来查找是否已存在 3 for (intptr_t i = 0; i < num_flags_; i++) { 4 Flag* flag = flags_[i]; 5 if (strcmp(flag->name_, name) == 0) { 6 return flag; 7 } 8 } 9 return NULL; 10}

Flags类中有3个重要的静态成员变量:

1static Flag** flags_; //记录所有的flags对象指针 2static intptr_t capacity_; //代表数组的容量大小 3static intptr_t num_flags_; //代表当前flags对象指针的个数

3.5 Flag初始化

[-> third_party/dart/runtime/vm/flags.cc]

1class Flag { 2 Flag(const char* name, const char* comment, void* addr, FlagType type) 3 : name_(name), comment_(comment), addr_(addr), type_(type) {} 4 5 const char* name_; 6 const char* comment_; 7 union { 8 void* addr_; 9 bool* bool_ptr_; 10 int* int_ptr_; 11 uint64_t* uint64_ptr_; 12 charp* charp_ptr_; 13 FlagHandler flag_handler_; 14 OptionHandler option_handler_; 15 }; 16 FlagType type_; 17}

3.6 Flags::AddFlag

[-> third_party/dart/runtime/vm/flags.cc]

1class Flag { 2 3 void Flags::AddFlag(Flag* flag) { 4 if (num_flags_ == capacity_) { 5 if (flags_ == NULL) { 6 capacity_ = 256; //初始化大小为256 7 flags_ = new Flag*[capacity_]; 8 } else { 9 intptr_t new_capacity = capacity_ * 2; //扩容 10 Flag** new_flags = new Flag*[new_capacity]; 11 for (intptr_t i = 0; i < num_flags_; i++) { 12 new_flags[i] = flags_[i]; 13 } 14 delete[] flags_; 15 flags_ = new_flags; 16 capacity_ = new_capacity; 17 } 18 } 19 //将flag记录到flags_ 20 flags_[num_flags_++] = flag; 21 } 22}

最终,所有的flag信息都记录在Flags类的静态成员变量flags_中。

四、总结

  • Product标记:可以在任何部署模式中设置
  • Release标志:通常可用的标志,除Product模式以外
  • Precompile标志:通常可用的标志,除Product模式或已预编译的运行时以外
  • Debug标志:只能在启用C++断言的VM调试模式中设置
<br/> 本文转自 [http://gityuan.com/2019/09/22/dartvm\_flags/](http://gityuan.com/2019/09/22/dartvm_flags/),如有侵权,请联系删除。
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid