一、概述
在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_names | true | 收集所有动态函数名称以标识唯一目标 |
enable_kernel_expression_compilation | true | 启用内核前端来编译表达式 |
enable_mirrors | true | 允许导入dart:mirrors |
enable_ffi | true | 允许导入dart:ffi |
guess_icdata_cid | true | 创建算法等操作的类型反馈 |
lazy_dispatchers | true | 懒惰地生成调度程序 |
polymorphic_with_deopt | true | 反优化的多态调用、巨形调用 |
reorder_basic_blocks | true | 对基本块重新排序 |
use_bare_instructions | true | 启用裸指令模式 |
truncating_left_shift | true | 尽可能优化左移以截断 |
use_cha_deopt | true | 使用类层次分析,即使会导致反优化 |
use_strong_mode_types | true | 基于强模式类型的优化 |
enable_slow_path_sharing | true | 启用共享慢速路径代码 |
enable_multiple_entrypoints | true | 启用多个入口点 |
experimental_unsafe_mode_use_ at_your_own_risk | false | 省略运行时强模式类型检查并禁用基于类型的优化 |
abort_on_oom | false | 如果内存分配失败则中止,仅与–old-gen-heap-size一起使用 |
collect_code | false | 尝试GC不常用代码 |
dwarf_stack_traces | false | 在dylib快照中发出dwarf行号和内联信息,而不表示堆栈跟踪 |
fields_may_be_reset | false | 不要优化静态字段初始化 |
link_natives_lazily | false | 懒加载链接本地调用 |
precompiled_mode | false | 预编译编译器模式 |
print_snapshot_sizes | false | 打印生成snapshot的大小 |
print_snapshot_sizes_verbose | false | 打印生成snapshot的详细大小 |
print_benchmarking_metrics | false | 打印其他内存和延迟指标以进行基准测试 |
shared_slow_path_triggers_gc | false | 测试:慢路径触发GC |
trace_strong_mode_types | false | 跟踪基于强模式类型的优化 |
use_bytecode_compiler | false | 从字节码编译 |
use_compactor | false | 当在旧空间执行GC时则压缩堆 |
enable_testing_pragmas | false | 启用神奇的编译指示以进行测试 |
enable_interpreter | false | 启用解释内核字节码 |
verify_entry_points | false | 通过native API访问无效成员时抛出API错误 |
background_compilation | USING_MULTICORE | 根据是否多核来决定是否后台运行优化编译 |
concurrent_mark | USING_MULTICORE | 老年代的并发标记 |
concurrent_sweep | USING_MULTICORE | 老年代的并发扫描 |
use_field_guards | !USING_DBC | 使用字段gurad,跟踪字段类型 |
interpret_irregexp | USING_DBC | 使用irregexp字节码解释器 |
causal_async_stacks | !USING_PRODUCT | 非product 则开启改进异步堆栈 |
marker_tasks | USING_MULTICORE ? 2 : 0 | 老生代GC标记的任务数,0代表在主线程执行 |
idle_timeout_micros | 1000 * 1000 | 长时间后将空闲任务从线程池隔离,单位微秒 |
idle_duration_micros | 500 * 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_tasks | 2 | 并行压缩使用的任务数 |
getter_setter_ratio | 13 | 用于double拆箱启发式的getter/setter使用率? |
huge_method_cutoff_in_tokens | 20000 | 令牌中的大量方法中断:禁用大量方法的优化? |
max_polymorphic_checks | 4 | 多态检查的最大数量,否则为巨形的? |
max_equality_polymorphic_checks | 32 | 等式运算符中的多态检查的最大数量 |
compilation_counter_threshold | 10 | 在解释执行函数编译完成前的函数使用次数要求,-1表示从不 |
optimization_counter_threshold | 30000 | 函数在优化前的用法计数值,-1表示从不 |
optimization_level | 2 | 优化级别:1(有利大小),2(默认),3(有利速度) |
optimization_level这是一个可以尝试的参数
2.2 Release flags
用法:RELEASE_FLAG_MARCO(名称,product_value,类型,默认值,注解)
名称 | product值 | 默认值 | 注解 |
---|