虛擬機(二):Android 篇

虛擬機(一):Java 篇

虛擬機(二):Android 篇


Dalvik和JVM區別

在這里插入圖片描述

  • Dalvik 基于寄存器,而 JVM 基于棧。
    • 基于棧的架構具有更好的可移植性,因為其實現不依賴于物理寄存器
    • 基于棧的架構通常指令更短,因為其操作不需要指定操作數和結果的地址
    • 基于寄存器的架構通常運行速度更快,因為有寄存器的支撐
    • 基于寄存器的架構通常需要較少的指令來完成同樣的運算,因為不需要進行壓棧和出棧
    • 棧屬于內存,速度稍慢,空間更大。寄存器屬于CPU,速度更快,空間更小。
  • dex
    • dex格式是專為Dalvik設計的一種壓縮格式,可以減少整體文件尺寸,提高I/O操作的速度,適合內存和處理器速度有限的系統。
    • dex文件格式相對來說更加的緊湊。dex文件按照類型(例如:常量,字段,方法)劃分,將同一類型的元素集中到一起并且去掉了重復項進行存放。這樣可以更大程度上避免重復,減少文件大小。
    • 為了便于開發者分析dex文件中的內容,Android系統中內置了dexdump工具。借助這個工具,我們可以詳細了解到dex的文件結構和內容。oat文件也有對應的dump工具oatdump。

ART和Dalvik區別

在這里插入圖片描述

  • Dalvik是為32位設計的,不適用于64位CPU。
  • 編譯
    • Dalvik:通過dexopt的工具將 APK 中內容 DEX 轉化為 ODEX。在應用安裝后,利用JIT進行部分編譯,其他直接將字節碼存儲起來,在每次運行時,需要將字節碼編譯成機器語言。
    • ART:通過dex2oat的工具將 APK 中內容 DEX 編譯成包含本地機器碼 OAT。應用在安裝后,會進行一次AOT(Ahead Of Time 運行前編譯)預編譯,將應用安裝包中的字節碼轉換成機器語言存儲在本地(系統只能運行二進制程序),這樣,應用在運行時,可以直接執行這些二進制程序。Art上應用啟動快,運行快,但是耗費更多存儲空間,安裝時間長,總的來說ART的功效就是"空間換時間"。
  • 內存分配器 內存空間
  • 垃圾回收
    • 將GC的停頓由2次改成1次
    • 在僅有一次的GC停頓中進行并行處理
    • 前后臺劃分

JIT的回歸

  • 解決系統、應用的安裝、升級慢的問題
  • 編譯生成的Oat文件中,既包含了原先的Dex文件,又包含了編譯后的機器代碼。而實際上,對于用戶來說,并非會用到應用程序中的所有功能,因此很多時候編譯生成的機器碼是一直用不到的。
  • Android 7.0 中,Google又為Android添加了即時 (JIT) 編譯器。JIT和AOT的配合,是取兩者之長,避兩者之短:在APK安裝時,并不是一次性將所有代碼全部編譯成機器碼。而是在實際運行過程中,對代碼進行分析,將熱點代碼編譯成機器碼,讓它可以在應用運行時持續提升 Android 應用的性能。

AOT和JIT配合:

  • 最初在安裝應用程序的時候不執行任何AOT編譯。應用程序運行的前幾次都將使用解釋模式,并且經常執行的方法將被JIT編譯。
  • 當設備處于空閑狀態并正在充電時,編譯守護進程會根據第一次運行期間生成的Profile文件對常用代碼運行AOT編譯。
  • 應用程序的下一次重新啟動將使用Profile文件引導的代碼,并避免在運行時為已編譯的方法進行JIT編譯。在新運行期間得到JIT編譯的方法將被添加到Profile文件中,然后被編譯守護進程使用。

ART 內存模型

在這里插入圖片描述
在這里插入圖片描述

  • ImageSpace
    • 永遠不GC
  • ZygoteSpace
    • “full”gc條件下才會掃描該區域
    • 本身沒有創建相關的內存資源,而是通過外部傳入的MemMap對象,作為內存資源,自身只是起到了一個管理作用
    • 繼承自Zygote進程的資源存放地
  • MallocSpace
    • 每次GC都會嘗試清除該區域
    • DlmallocSpace:采用的是dlmalloc內存分配管理模型,它是一個開源庫,也是c語言malloc調用的具體實現。
    • RosAllocSpace:采用的是谷歌自己的內存分配rosalloc完成。rosalloc是一種動態分配內存算法,專門為了art虛擬機做了適配,其實它是一種多粒度內存分配算法,ros的意思就是run of slot,可以理解為一個run是RosAllocSpace中內存分配的單元,每個Run有自己的內存分配粒度(slot)
  • LargeObjectSpace
    • 每次GC都會嘗試清除該區域
    • 采用mmap去分配內存空間
    • 不連續
    • large_object_threshold_默認為12kb
  • RegionSpace
    • 每次GC都會嘗試清除該區域
    • 內存塊分配
    • 內存對齊,由屬性kRegionSize決定(每個Region默認1m)
    • 每個Region本身還對應一個狀態RegionState
    • Copying Collection(拷貝垃圾回收機制)的內存分配模型
  • BumpPointerSpace
    • 每次GC都會嘗試清除該區域
    • 順序分配

內存分配器:

  • Davlik虛擬機使用的是傳統的 dlmalloc 內存分配器進行內存分配。這個內存分配器是Linux上很常用的
  • Google為ART虛擬機開發了一個基于位圖的新內存分配器:RoSalloc,它的全稱是Rows of Slots allocator。RoSalloc相較于dlmalloc來說,在多線程環境下有更好的支持,具有分片鎖:在dlmalloc中,分配內存時使用了全局的內存鎖,這就很容易造成性能不佳。而在RoSalloc中,當分配規模較小時可添加線程的本地緩沖區,允許在線程本地區域存儲小對象,這就是避免了全局鎖的等待時間。
  • ART虛擬機中,這兩種內存分配器都有使用。
  • RegionTLAB:從 Android 8 (Oreo) 開始,默認垃圾回收方案是并發復制 (CC)。CC 支持使用名為“RegionTLAB”的觸碰指針分配器。此分配器可以向每個應用線程分配一個線程本地分配緩沖區 (TLAB),這樣,應用線程只需觸碰“棧頂”指針,而無需任何同步操作,即可從其 TLAB 中將對象分配出去。
  • RosAlloc 是基于空閑列表的分配器,與 RegionTLAB 相比,該分配器的分配成本較高。由于 CMS 很少進行壓縮,因此空閑對象可能會不連續,導致碎片更多。

ART GC

觸發垃圾回收:

  • kGcCauseForAlloc 內存分配失敗
  • kGcCauseBackground 后臺進程的垃圾回收,為了確保內存的充足
  • kGcCauseExplicit 明確的System.gc()調用
  • kGcCauseForNativeAlloc 由于native的內存分配
  • kGcCauseCollectorTransition 垃圾收集器發生了切換
  • kGcCauseHomogeneousSpaceCompact 當前景和后臺收集器都是CMS時,發生了后臺切換
  • kGcCauseClassLinker ClassLinker導致
    拋開System.gc引起的主動gc,大部分GC由ConcurrentGCTask與分配時AllocInternalWithGc觸發

回收策略:

  • Sticky 僅僅釋放上次GC之后創建的對象。基于“分代”的垃圾回收思想
  • Partial 僅僅對應用程序的堆進行垃圾回收,但是不處理Zygote的堆
  • Full 會對應用程序和Zygote的堆都會進行垃圾回收

綜述:

  • ART 有多個不同的 GC 方案,這些方案包括運行不同垃圾回收器。在heap.cc的CollectGarbageInternal方法中,會根據當前的GC類型和原因,選擇合適的垃圾回收器,然后執行垃圾回收。
  • CMS(Concurrent Mark Sweep,并發標記清除)方案,主要使用粘性(sticky)CMS 和部分(partial)CMS。
  • 粘性(sticky)CMS
    • 粘性CMS是ART的不移動(non-moving )分代垃圾回收器,增加了GC吞吐量。
    • 它僅掃描堆中自上次 GC 后修改的部分,并且只能回收自上次GC后分配的對象。
    • 不同于普通的分代GC,粘性 CMS 不會移動。年輕對象被保存在一個分配堆棧(基本上是 java.lang. Object 數組)中,而非為其設置一個專用區域。這樣可以避免移動所需的對象以維持低暫停次數,但缺點是容易在堆棧中加入大量復雜對象圖像而使堆棧變長。
  • 前后臺
    • 當應用將進程狀態更改為察覺不到卡頓的進程狀態(例如,后臺或緩存)時,ART 將暫停應用線程以執行堆壓縮。
    • Compact類型的垃圾回收器便是“標記-壓縮”算法。這種類型的垃圾回收器,會在將對象清理之后,將最終還在使用的內存空間移動到一起,這樣可以既可以減少堆中的碎片,也節省了堆空間。但是由于這種垃圾回收器需要對內存進行移動,所以耗時較多,因此這種垃圾回收器適合于切換到后臺的應用。
    • 垃圾回收器的決定會在Heap初始化的時候,選擇垃圾回收器,需要指定前臺垃圾回收器與后臺垃圾回收器
    • 在前臺環境下,用戶對于卡頓會更加敏感,因此需要選擇更快的垃圾回收,而后臺環境下,卡頓不敏感,因此需要進行內存的整理,便于內存塊的整合
    • android7前臺是CMS(Concurrent Mark Sweep,并發標記清除),后臺是HSC。
  • 并發復制 (CC)
    • 從 Android 8 (Oreo) 開始,默認方案是并發復制 (CC)。
    • 通過在不暫停應用線程的情況下并發復制對象來執行堆碎片整理。這是在讀取屏障的幫助下實現的,讀取屏障會攔截來自堆的引用讀取,無需應用開發者進行任何干預。
    • GC 只有一次很短的暫停,對于堆大小而言,該次暫停在時間上是一個常量。
    • 在 Android 10 及更高版本中,CC 會擴展為分代 GC。輕松回收存留期較短的對象,并顯著延遲執行全堆 GC 的需要。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73592.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73592.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73592.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android Token的原理和本地安全存儲

Android Token的原理和本地安全存儲 前言 在移動應用開發中,Token是實現用戶身份驗證和授權的重要機制。本文將深入介紹Token的原理,以及在Android平臺上如何安全地存儲Token,幫助開發者構建可靠的身份驗證系統。 基礎知識 1. Token概述 1.1 Token的作用 身份驗證授權訪…

Vue Kubernetes項目 局部布局 下拉菜單

下拉菜單 [el-dropdown] 下拉菜單也比較簡單&#xff0c;就是類似于按鈕下面來一個下拉菜單。 示例Demo如下&#xff1a; <template><el-dropdown><span class"el-dropdown-link">下拉菜單<i class"el-icon-arrow-down el-icon--right&q…

Android之卡片式滑動

文章目錄 前言一、效果圖二、實現步驟1.主界面xml2.自定義的viewpage3.卡片接口類4.陰影和縮放變化類5.卡片adapter6.卡片adapter的xml7.style8.CardItem9.activity實現10.指示器drawable 總結 前言 對于這個需求&#xff0c;之前的項目也有做過&#xff0c;但是過于趕項目就沒…

(UI自動化測試web端)第二篇:元素定位的方法_css定位之css選擇器

看代碼里的【find_element_by_css_selector( )】( )里的表達式怎么寫&#xff1f; 文章介紹了第三種寫法css選擇器&#xff0c;你要根據網頁中的實際情況來判斷自己到底要用哪一種方法來進行元素定位。每種方法都要多練習&#xff0c;全都熟了之后你在工作當中使用起來元素定位…

使用vscode搭建pywebview集成vue項目示例

文章目錄 前言環境準備項目源碼下載一、項目說明1 目錄結構2 前端項目3 后端項目獲取python安裝包(選擇對應版本及系統) 三、調試與生成可執行文件1 本地調試2 打包應用 四、核心代碼說明1、package.json2、vite.config.ts設置3、main.py后端入口文件說明 參考文檔 前言 本節我…

C stm32f10x LED亮

#include<stm32f10x.h>int main(){#if 0 //APIOA 時鐘初始化unsigned int * p(unsigned int*)0x40021018;*p | 0x1<<2;//A0 推挽輸出p(unsigned int*)0x40010800;*p *p & ~0xf | 0x1;//A0低電平p(unsigned int*)0x4001080c;*p & ~0x1;#endifRCC->APB2E…

redux ,react-redux,redux-toolkit 簡單總結

Redux、React-Redux 和 Redux Toolkit 是協同工作的三個庫&#xff0c;各自承擔不同角色&#xff0c;相互協同。 Redux&#xff1a;基礎底座 底層狀態管理庫&#xff0c;負責狀態存儲、Action 派發和 Reducer 執行 ?React-Redux&#xff1a;連接 React 組件與 Redux Store 通…

智能制造:物聯網和自動化之間的關系

工業自動化 工業自動化是機器設備或生產過程在不需要人工直接干預的情況下按預期的目標實現測量、操縱等信息處理和過程控制的統稱。 在傳統的工業生產過程中&#xff0c;很多環節需要人工操作&#xff0c;比如設備調試、生產監控、質量檢測等。然而&#xff0c;隨著工業自動化…

“自動駕駛背后的數學” 專欄導讀

專欄鏈接&#xff1a; 自動駕駛背后的數學 專欄以“自動駕駛背后的數學”為主題&#xff0c;從基礎到深入&#xff0c;再到實際應用和未來展望&#xff0c;全面解析自動駕駛技術中的數學原理。開篇用基礎數學工具搭建自動駕駛的整體框架&#xff0c;吸引兒童培養興趣&#xff0…

集成學習(下):Stacking集成方法

一、Stacking的元學習革命 1.1 概念 Stacking&#xff08;堆疊法&#xff09; 是一種集成學習技術&#xff0c;通過組合多個基學習器&#xff08;base learner&#xff09;的預測結果&#xff0c;并利用一個元模型&#xff08;meta-model&#xff09;進行二次訓練&#xff0c…

Dubbo 全面解析:從 RPC 核心到服務治理實踐

一、分布式系統與 RPC 框架概述 在當今互聯網時代&#xff0c;隨著業務規模的不斷擴大&#xff0c;單體架構已經無法滿足高并發、高可用的需求&#xff0c;分布式系統架構成為主流選擇。而在分布式系統中&#xff0c;遠程服務調用&#xff08;Remote Procedure Call&#xff0…

vmware虛擬機突然連不上網

1.一般是自己的主機把服務給關掉了&#xff0c;右擊我的電腦&#xff0c;然后找到管理->服務&#xff0c;確保下面虛擬機的網絡服務是否打開 Vmware虛擬機突然連接不上網絡【方案集合】_vmware虛擬機連不上網-CSDN博客 2.識別到無效網絡 控制面板->網絡和共享中心&…

Selenium之簡介

Selenium簡介 首先&#xff0c;讓我們看看官網是怎么定義的 Selenium是一個支持web瀏覽器自動化的一系列工具和庫的綜合項目&#xff0c;提供了擴展來模擬用戶和瀏覽器的交互&#xff0c;用于擴展瀏覽器分配的分發服務器&#xff1b;用于W3C WebDriver規范的基礎架構 其實&a…

SpringBoot 開發入門—Springboot基礎框架匯總

一、環境準備 Java&#xff1a;Spring Boot 3.0.2 需要 Java 17&#xff0c;并且與 Java 19 兼容 Maven&#xff1a;Apache Maven 3.5 或更高版本兼容 二、啟動器 以下應用程序啟動器由 Spring Boot 在該組下提供&#xff1a;org.springframework.boot 表 1.Spring 引導應…

前端批量導入方式

webpack批量導入 webpack中使用 require.context 實現自動導入 const files require.context(./modules, false, /\.ts$/); const modules {}; files.keys().forEach((key) > {if (key ./index.ts) { return; }modules[key.replace(/(\.\/|\.ts)/g, )] files(key).def…

阿里巴巴1688類網站高保真原型設計

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>1688類B2B平臺原型</title><script src…

C++設計模式-裝飾模式:從基本介紹,內部原理、應用場景、使用方法,常見問題和解決方案進行深度解析

一、裝飾模式基本介紹 裝飾模式&#xff08;Decorator Pattern&#xff09;是一種結構型設計模式&#xff0c;允許你在不改變對象自身的基礎上&#xff0c;動態地給一個對象添加額外的職責。這種模式創建了一個裝飾類&#xff0c;用來包裝原有的類&#xff0c;并在保持類方法簽…

2、學習Docker前置操作

docker三件套&#xff1a;鏡像、容器、倉庫 Docker hubhub.docker.com ubuntu安裝【待更新】 CentOS安裝 CentOS 僅發行版本中的內核支持 Docker。Docker 運行在 CentOS 7 (64-bit)上&#xff0c;要求系統為 64 位、Linux 系統內核版本為 3.8 以上&#xff0c;這里選用 Cen…

70. Linux驅動開發與裸機開發區別,字符設備驅動開發

一、裸機驅動開發回顧 1、底層&#xff0c;跟寄存器打交道&#xff0c;有些MCU提供了庫。 二、Linux驅動開發思維 1、Linux下驅動開發直接操作寄存器不現實。 2、根據Linux下的各種驅動框架進行開發。一定要滿足框架&#xff0c;也就是Linux下各種驅動框架的掌握。 3、驅動最…

【JavaScript 簡明入門教程】為了Screeps服務的純JS入門教程

0 前言 0-1 Screeps: World 眾所不周知&#xff0c;?Screeps: World是一款面向編程愛好者的開源大型多人在線即時戰略&#xff08;MMORTS&#xff09;沙盒游戲&#xff0c;其核心機制是通過編寫JavaScript代碼來控制游戲中的單位&#xff08;稱為“Creep”&#xff09;&#…