企业网站建设总结/seo搜狗排名点击

企业网站建设总结,seo搜狗排名点击,疫情下的经济发展,株洲芦淞区虚拟机(一):Java 篇 虚拟机(二):Android 篇 Dalvik和JVM区别 Dalvik 基于寄存器,而 JVM 基于栈。 基于栈的架构具有更好的可移植性,因为其实现不依赖于物理寄存器基于栈的架构通常指…

虚拟机(一):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.mzph.cn/pingmian/73592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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;随着工业自动化…

集成学习(下):Stacking集成方法

一、Stacking的元学习革命 1.1 概念 Stacking&#xff08;堆叠法&#xff09; 是一种集成学习技术&#xff0c;通过组合多个基学习器&#xff08;base learner&#xff09;的预测结果&#xff0c;并利用一个元模型&#xff08;meta-model&#xff09;进行二次训练&#xff0c…

vmware虚拟机突然连不上网

1.一般是自己的主机把服务给关掉了&#xff0c;右击我的电脑&#xff0c;然后找到管理->服务&#xff0c;确保下面虚拟机的网络服务是否打开 Vmware虚拟机突然连接不上网络【方案集合】_vmware虚拟机连不上网-CSDN博客 2.识别到无效网络 控制面板->网络和共享中心&…

【JavaScript 简明入门教程】为了Screeps服务的纯JS入门教程

0 前言 0-1 Screeps: World 众所不周知&#xff0c;​Screeps: World是一款面向编程爱好者的开源大型多人在线即时战略&#xff08;MMORTS&#xff09;沙盒游戏&#xff0c;其核心机制是通过编写JavaScript代码来控制游戏中的单位&#xff08;称为“Creep”&#xff09;&#…

LabVIEW远程控制通讯接口

abVIEW提供了多种远程控制与通讯接口&#xff0c;适用于不同场景下的设备交互、数据传输和系统集成。这些接口涵盖从基础的网络协议&#xff08;如TCP/IP、UDP&#xff09;到专用技术&#xff08;如DataSocket、远程面板&#xff09;&#xff0c;以及工业标准协议&#xff08;如…

LeetCode hot 100—寻找重复数

题目 给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返回 这个重复的数 。 你设计的解决方案必须 不修改 数组 nums…

31天Python入门——第15天:日志记录

你好&#xff0c;我是安然无虞。 文章目录 日志记录python的日志记录模块创建日志处理程序并配置输出格式将日志内容输出到控制台将日志写入到文件 logging更简单的一种使用方式 日志记录 日志记录是一种重要的应用程序开发和维护技术, 它用于记录应用程序运行时的关键信息和…

AI Agent开发大全第八课-Stable Diffusion 3的本地安装全步骤

前言 就像我们前面几课所述,本系列是一门体系化的教学,它不像网上很多个别存在的单篇博客走“吃快餐”模式,而是从扎实的基础来带领大家一步步迈向AI开发高手。所以我们的AI课程设置是相当全面的,除了有牢固的基础知识外还有外面互联网上也搜不到的生产级实战。 前面讲过…

用selenium+ChromeDriver豆瓣电影 肖申克的救赎 短评爬取(pycharm 爬虫)

一、豆瓣电影 肖申克的救赎 短评urlhttps://movie.douban.com/subject/1292052/comments 二、基本知识点讲解 1. Selenium 的基本使用 Selenium 是一个用于自动化浏览器操作的库&#xff0c;常用于网页测试和爬虫。代码中使用了以下 Selenium 的核心功能&#xff1a; webdriv…

JavaScrip-模版字符串的详解

1.模版字符串的详解 1.1 模版字符串的使用方法 在ES6之前&#xff0c;如果我们想要将字符串和一些动态的变量&#xff08;标识符&#xff09;拼接到一起&#xff0c;是非常丑陋的&#xff08;ugly) ES6允许我们使用模版字符串来嵌入变量或者表达式来进行拼接 首先&#xff0c;…

海康设备http监听接收报警事件数据

http监听接收报警事件数据 海康获取设备报警事件数据两种方式&#xff1a; 1、sdk 布防监听报警事件数据&#xff08;前面文章有示例&#xff09; 2、http监听接收报警事件数据 http监听接收报警事件数据&#xff0c;服务端可以使用netty通过端口来监听获取事件数据。 WEB 端…

【STM32】编写程序控制开发板的RGB LED灯

目录 1、原理图2、文件结构3、使用寄存器模式点亮3.1、什么是寄存器3.2、寄存器开发的本质3.3、寄存器开发步骤3.4、主要源码3.4.1、main.c3.4.2、drv_gpio.h3.4.3、drv_gpio.c3.4.4、使用BSRR和BRR影子寄存器优化drv_gpio.c3.4.5、效果演示 4、使用标准库模式点亮4.1、使用标准…

MyBatis-Plus 的加载及初始化

在 Spring Boot 启动过程中&#xff0c;MyBatis-Plus 的加载和初始化涉及多个阶段的工作。这些工作包括 MyBatis-Plus 自身的配置解析、Mapper 接口的扫描与注册、SQL 语句的动态注入以及底层 MyBatis 的初始化等。以下是对整个过程的详细分析&#xff1a; 1. Spring Boot 启动…

关于解决Ubuntu终端及系统字体大小的问题

在Ubuntu中调整终端和系统字体大小可以通过以下方法&#xff08;可能不仅仅只是这几种&#xff09;实现&#xff1a; 1. 调整系统字体大小 打开终端并输入以下命令&#xff0c;安装GNOME Tweaks&#xff0c;等待安装完成&#xff1a; sudo apt install gnome-tweaks 接着进行…