当前位置: 首页 > news >正文

口岸地区网站建设内容上海网络推广联盟

口岸地区网站建设内容,上海网络推广联盟,微信网站用什么做的,最新网站推广方法前言 之前整理了一系列Dalvik虚拟机的关于堆内存和GC的文章,轮到对ART内存进行分析优化了,继续整理输出一波,本篇为ART虚拟机系列的第一篇,介绍ART虚拟机的启动和初始化。 #mermaid-svg-8iNdLFTpOHLgRjHA {font-family:"tre…

前言

之前整理了一系列Dalvik虚拟机的关于堆内存和GC的文章,轮到对ART内存进行分析优化了,继续整理输出一波,本篇为ART虚拟机系列的第一篇,介绍ART虚拟机的启动和初始化。

Android Rumtime.cppjni_internal.ccruntime.ccJNI_CreateJavaVMRuntime::CreateRuntime::Init、new gc::HeapRuntime::StartRuntime::InitNativeMethods、StartDaemonThreadsAndroid Rumtime.cppjni_internal.ccruntime.cc

ART启动

app_main启动

frameworks/base/cmds/app_process/app_main.cpp

int main(int argc, char* const argv[])
{AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));if (zygote) {runtime.start("com.android.internal.os.ZygoteInit", args);} else if (className) {runtime.start("com.android.internal.os.RuntimeInit", args);} else {return 10;}
}

AndroidRuntime.cpp

frameworks/base/core/jni/AndroidRuntime.cpp

void AndroidRuntime::start(const char* className, const Vector<String8>& options)
{/* start the virtual machine */JniInvocation jni_invocation;jni_invocation.Init(NULL);JNIEnv* env;if (startVm(&mJavaVM, &env) != 0) {return;}onVmCreated(env);/** Register android functions.*/if (startReg(env) < 0) {return;}
}int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv) 
{// 拼接一大堆参数if (JNI_CreateJavaVM(pJavaVM, pEnv, &initArgs) < 0) {ALOGE("JNI_CreateJavaVM failed\n");goto bail;}
}

JniInvocation.cpp

libnativehelper/JniInvocation.cpp,
5.x的代码里获取libart.so,再获取到JNI_CreateJavaVM、JNI_GetCreatedJavaVMs等的实现。

static const char* kLibraryFallback = "libart.so";bool JniInvocation::Init(const char* library) {library = GetLibrary(library, buffer);handle_ = dlopen(library, RTLD_NOW);if (!FindSymbol(reinterpret_cast<void**>(&JNI_GetDefaultJavaVMInitArgs_),"JNI_GetDefaultJavaVMInitArgs")) {return false;}if (!FindSymbol(reinterpret_cast<void**>(&JNI_CreateJavaVM_),"JNI_CreateJavaVM")) {return false;}if (!FindSymbol(reinterpret_cast<void**>(&JNI_GetCreatedJavaVMs_),"JNI_GetCreatedJavaVMs")) {return false;}return true;
}extern "C" jint JNI_GetDefaultJavaVMInitArgs(void* vm_args) {return JniInvocation::GetJniInvocation().JNI_GetDefaultJavaVMInitArgs(vm_args);
}extern "C" jint JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args) {return JniInvocation::GetJniInvocation().JNI_CreateJavaVM(p_vm, p_env, vm_args);
}extern "C" jint JNI_GetCreatedJavaVMs(JavaVM** vms, jsize size, jsize* vm_count) {return JniInvocation::GetJniInvocation().JNI_GetCreatedJavaVMs(vms, size, vm_count);
}

jni_internal.cc

art/runtime/jni_internal.cc

extern "C" jint JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args) {const JavaVMInitArgs* args = static_cast<JavaVMInitArgs*>(vm_args);//  创建虚拟机if (!Runtime::Create(options, ignore_unrecognized)) {return JNI_ERR;}Runtime* runtime = Runtime::Current();runtime->Start();*p_env = Thread::Current()->GetJniEnv();*p_vm = runtime->GetJavaVM();return JNI_OK;
}

art初始化

art/runtime/runtime.h
art/runtime/runtime.cc

runtime.h

class Runtime {public:// Creates and initializes a new runtime.static bool Create(const RuntimeOptions& options, bool ignore_unrecognized)SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_);// Starts a runtime, which may cause threads to be started and code to run.bool Start() UNLOCK_FUNCTION(Locks::mutator_lock_);static Runtime* Current() {return instance_;}gc::Heap* GetHeap() const {return heap_;}~Runtime();private:Runtime();void BlockSignals();bool Init(const RuntimeOptions& options, bool ignore_unrecognized)SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_);// A pointer to the active runtime or NULL.static Runtime* instance_;gc::Heap* heap_;
}

Runtime::Create

bool Runtime::Create(const RuntimeOptions& options, bool ignore_unrecognized) {if (Runtime::instance_ != NULL) {return false;}instance_ = new Runtime;instance_->Init(options, ignore_unrecognized);return true;
}

Runtime()

Runtime::Runtime(): is_zygote_(false),is_concurrent_gc_enabled_(true),is_explicit_gc_disabled_(false),dex2oat_enabled_(true),default_stack_size_(0),heap_(nullptr),monitor_list_(nullptr),monitor_pool_(nullptr),thread_list_(nullptr),class_linker_(nullptr),signal_catcher_(nullptr),java_vm_(nullptr) {
}

Runtime::Init

bool Runtime::Init(const RuntimeOptions& raw_options, bool ignore_unrecognized) {Monitor::Init(options->lock_profiling_threshold_, options->hook_is_sensitive_thread_);heap_ = new gc::Heap(options->heap_initial_size_,options->heap_growth_limit_,options->heap_min_free_,options->heap_max_free_,options->heap_target_utilization_,options->foreground_heap_growth_multiplier_,options->heap_maximum_size_,options->heap_non_moving_space_capacity_,options->image_,options->image_isa_,options->collector_type_,options->background_collector_type_,options->parallel_gc_threads_,options->conc_gc_threads_,options->low_memory_mode_,options->long_pause_log_threshold_,options->long_gc_log_threshold_,options->ignore_max_footprint_,options->use_tlab_,options->verify_pre_gc_heap_,options->verify_pre_sweeping_heap_,options->verify_post_gc_heap_,options->verify_pre_gc_rosalloc_,options->verify_pre_sweeping_rosalloc_,options->verify_post_gc_rosalloc_,options->use_homogeneous_space_compaction_for_oom_,options->min_interval_homogeneous_space_compaction_by_oom_);dump_gc_performance_on_shutdown_ = options->dump_gc_performance_on_shutdown_;BlockSignals();InitPlatformSignalHandlers();InitializeSignalChain();java_vm_ = new JavaVMExt(this, options.get());Thread::Startup();class_linker_ = new ClassLinker(intern_table_);//...return true;
}

runtime->start

bool Runtime::Start() {// Restore main thread state to kNative as expected by native code.Thread* self = Thread::Current();self->TransitionFromRunnableToSuspended(kNative);started_ = true;if (IsZygote()) {ScopedObjectAccess soa(self);gc::space::ImageSpace* image_space = heap_->GetImageSpace();if (image_space != nullptr) {Runtime::Current()->GetInternTable()->AddImageStringsToTable(image_space);Runtime::Current()->GetClassLinker()->MoveImageClassesToClassTable();}}// InitNativeMethods needs to be after started_ so that the classes it touches will have methods linked to the oat file if necessary.InitNativeMethods();// Initialize well known thread group values that may be accessed threads while attaching.InitThreadGroups(self);Thread::FinishStartup();system_class_loader_ = CreateSystemClassLoader();StartDaemonThreads();finished_starting_ = true;return true;
}
http://www.mmbaike.com/news/100748.html

相关文章:

  • 网站 大气最新的新闻 最新消息
  • 一流的商城网站建设中美关系最新消息
  • 网站免费空间购买整合营销经典案例
  • 企业建站网络公司百度推广登录平台怎么收费
  • 做黑界头像网站网络营销毕业论文8000字
  • 网上做论文的网站有哪些好看的网页设计作品
  • 免费的个人网站空间aso优化报价
  • 定制网站制作服务商全网搜索引擎优化
  • 怎么用微信做网站seo短期课程
  • 郑州网站建设 推广广告推广媒体
  • 网站中队人物介绍怎么做atp最新排名
  • 昆明网站建设哪家好合肥网站优化推广方案
  • 用电脑做网站的历史在哪里找南宁网络推广服务商
  • 杭州网站建设 seo新人跑业务怎么找客户
  • 手机做服务器建网站平台推广网站
  • 国外不织布网站做的教具微信怎么推广引流客户
  • 做流媒体视频播放网站求助手机上如何制作自己的网站
  • 邓州微网站开发爱站工具网
  • 网站 高清 标清如何做seo网站优化服务合同
  • 电子商务网站开发系统广告策划
  • wordpress文章付费可看南宁seo公司哪家好
  • 网站公司做销售怎么样舆情监控系统
  • 怎么看一个网站是否是外包做的新媒体推广渠道有哪些
  • 电商一件代发平台百度seo报价
  • 苏州网站建设最好系统优化大师下载
  • 福州 网站设计百度站长工具seo查询
  • 没有网站怎么做推广网站推广软件哪个最好
  • 建筑类网站的推荐理由网络推广与网络营销的区别
  • 做设计什么兼职网站建设自己可以创建网站吗
  • 简单做图网站广告投放网站