diff --git a/common/settings.cc b/common/settings.cc index b1ef2161fa56173a1808c4495a506bc49fda2d29..c6a0d8a32a2e7773a2df6ce385eb2699ae01e7e6 100644 --- a/common/settings.cc +++ b/common/settings.cc @@ -58,6 +58,7 @@ std::string Settings::ToString() const { stream << "assets_path: " << assets_path << std::endl; stream << "frame_rasterized_callback set: " << !!frame_rasterized_callback << std::endl; + stream << "old_gen_heap_size: " << old_gen_heap_size << std::endl; return stream.str(); } diff --git a/common/settings.h b/common/settings.h index 761b7734fbf73bf4e4e5f8af897133a9ef033bf2..6db62483f4ca4dae13aaa1e89cdff818e037caae 100644 --- a/common/settings.h +++ b/common/settings.h @@ -191,6 +191,13 @@ struct Settings { // the buffer must be as small as possible. std::shared_ptr persistent_isolate_data; + /// Max size of old gen heap size in MB, or 0 for unlimited, -1 for default + /// value. + /// + /// See also: + /// https://github.com/dart-lang/sdk/blob/ca64509108b3e7219c50d6c52877c85ab6a35ff2/runtime/vm/flag_list.h#L150 + int64_t old_gen_heap_size = -1; + std::string ToString() const; }; diff --git a/runtime/dart_vm.cc b/runtime/dart_vm.cc index 234e06f87eff73dff7539b3da5e7606624595223..de058443adab1dd3dc4654344f71feca4d68d05a 100644 --- a/runtime/dart_vm.cc +++ b/runtime/dart_vm.cc @@ -7,6 +7,7 @@ #include #include +#include #include #include "flutter/common/settings.h" @@ -111,6 +112,12 @@ static const char* kDartTraceStreamsArgs[] = { "--timeline_streams=Compiler,Dart,Debugger,Embedder,GC,Isolate,VM,API", }; +static std::string DartOldGenHeapSizeArgs(uint64_t heap_size) { + std::ostringstream oss; + oss << "--old_gen_heap_size=" << heap_size; + return oss.str(); +} + constexpr char kFileUriPrefix[] = "file://"; constexpr size_t kFileUriPrefixLength = sizeof(kFileUriPrefix) - 1; @@ -366,6 +373,13 @@ DartVM::DartVM(std::shared_ptr vm_data, PushBackAll(&args, kDartTraceStartupArgs, fml::size(kDartTraceStartupArgs)); } + std::string old_gen_heap_size_args; + if (settings_.old_gen_heap_size >= 0) { + old_gen_heap_size_args = + DartOldGenHeapSizeArgs(settings_.old_gen_heap_size); + args.push_back(old_gen_heap_size_args.c_str()); + } + #if defined(OS_FUCHSIA) PushBackAll(&args, kDartFuchsiaTraceArgs, fml::size(kDartFuchsiaTraceArgs)); PushBackAll(&args, kDartTraceStreamsArgs, fml::size(kDartTraceStreamsArgs)); diff --git a/runtime/dart_vm_unittests.cc b/runtime/dart_vm_unittests.cc index 3b4d169a502d36c19bfdcddde8e715f6338055bf..26fa4231fdfb710c418e56d5d5ccb6e0085453db 100644 --- a/runtime/dart_vm_unittests.cc +++ b/runtime/dart_vm_unittests.cc @@ -32,5 +32,15 @@ TEST_F(DartVMTest, SimpleIsolateNameServer) { ASSERT_TRUE(ns->RemoveIsolateNameMapping("foobar")); } +TEST_F(DartVMTest, OldGenHeapSize) { + ASSERT_FALSE(DartVMRef::IsInstanceRunning()); + auto settings = CreateSettingsForFixture(); + settings.old_gen_heap_size = 1024; + auto vm = DartVMRef::Create(settings); + // There is no way to introspect on the heap size so we just assert the vm was + // created. + ASSERT_TRUE(vm); +} + } // namespace testing } // namespace flutter diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index 6b45e0b8e88e713549e8c5721dcf1f8e9257aba2..fdbafe1f0c5b1f9c74d670d2c2f87c03664419aa 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -664,6 +664,7 @@ FlutterEngineResult FlutterEngineInitialize(size_t version, settings.icu_data_path = icu_data_path; settings.assets_path = args->assets_path; settings.leak_vm = !SAFE_ACCESS(args, shutdown_dart_vm_when_done, false); + settings.old_gen_heap_size = SAFE_ACCESS(args, dart_old_gen_heap_size, -1); if (!flutter::DartVM::IsRunningPrecompiledCode()) { // Verify the assets path contains Dart 2 kernel assets. diff --git a/shell/platform/embedder/embedder.h b/shell/platform/embedder/embedder.h index 796d9bc90a2dd6d8aff35a241158a45eb6470613..aefb1e98781fd7ae1adbe5d565644e35158b4866 100644 --- a/shell/platform/embedder/embedder.h +++ b/shell/platform/embedder/embedder.h @@ -1114,6 +1114,13 @@ typedef struct { /// absence, platforms views in the scene are ignored and Flutter renders to /// the root surface as normal. const FlutterCompositor* compositor; + + /// Max size of the old gen heap for the Dart VM in MB, or 0 for unlimited, -1 + /// for default value. + /// + /// See also: + /// https://github.com/dart-lang/sdk/blob/ca64509108b3e7219c50d6c52877c85ab6a35ff2/runtime/vm/flag_list.h#L150 + int64_t dart_old_gen_heap_size; } FlutterProjectArgs; //------------------------------------------------------------------------------