Java &Android虚拟机
lin-0410
最痛苦的事情,不是失败了,而是我本可以......
所以,如果目标还没去实现,不要感叹为时已晚,因为种一棵树最好的时间是十年前,其次是现在!
展开
-
Java字节码指令大全
常量入栈指令 指令码 操作码(助记符) 操作数 描述(栈指操作数栈) 0x01 aconst_null null值入栈。 0x02 iconst_m1 ...原创 2020-01-09 22:13:41 · 180 阅读 · 0 评论 -
Android ART VM可执行文件格式-ELF(二)
ART虚拟机,通过dex2oat将dex预编译成机器码的oat文件,是基于linux中的可执行文件格式ELF所做的扩展。ELF(Executable and Linkable Format)的处理流程:它至少支持三种文件形态:可重定向文件(Relocatable File),可执行文件(Executable File),可共享的对象文件(Shared Object File)。Relocatabl...原创 2018-02-12 21:58:24 · 1046 阅读 · 0 评论 -
Android 动态库的加载system.loadlibary(三)
System.loadlibary,System.load是怎么加载so库的?他们是在Runtime的启动过程中通过loadnativelibary来加载libjavacore.so的动态库,这个动态库是这两个函数的实现体。libcore/ojluni/src/main/java/java/lang/System.java public static void loadLibrary(Str...原创 2018-02-13 20:59:58 · 4514 阅读 · 0 评论 -
Android ART VM的文件格式-OAT(四)
一,与oat相关的文件后缀参考老罗的博客:OAT文件1).oat,OAT是由dex2oat产生的,本质上也是属于elf文件。2).odex,在Dalvik中,odex表示被优化后的dex文件;ART虚拟机中,它实际上是oat文件。oat文件除了遵循elf文件规范,又根据虚拟机的需求进行了扩展--最大的区别增加了两个重要的字段 oat data section 和oat exec section,其...原创 2018-02-14 07:40:36 · 1364 阅读 · 0 评论 -
Android ART VM的启动流程(五)
Android系统的第一个进程是init,init通过解析init.rc脚本来启动关键的守护进程和各种系统服务--其中包括zygote这个应用程序的孵化器。system/core/rootdir/init.zygote64.rc(这个文件会被import进init.rc中)service zygote /system/bin/app_process64 -Xzygote /system/bin -...原创 2018-02-14 19:30:37 · 1243 阅读 · 0 评论 -
Android ART VM启动流程(六)
接着前一篇博文 ART VM的启动流程,继续分析启动虚拟机的核心函数是startVM,frameworks/base/core/jni/AndroidRuntime.cppint AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote){ /* * Initialize the VM. ...原创 2018-02-14 19:35:51 · 1370 阅读 · 0 评论 -
Android ART虚拟机中的线程管理(七)
一,线程的创建在java代码中可以有多种方式创建一个线程,常用的方法是:Thread thd = new Thread();这个创建会调用init,init2初始化一个线程:libcore/ojluni/src/main/java/java/lang/Thread.java private void init(ThreadGroup g, Runnable target, String na...原创 2018-02-24 07:31:38 · 1728 阅读 · 0 评论 -
Android ART虚拟机执行引擎-Interpreter(八)
ART虚拟机是一个Interpreter+JIT+AOT的共存环境。ART虚拟机中解释器的实现源码在art/runtime/interpreter中,其中与平台相关的汇编代码保存在目录art/runtime/interpreter/mterp中,因为interpreter有两个版本,一种是C语言实现的,一种是汇编版本的。汇编版本的解释器执行效率高,但是要对不同的硬件架构进行适配。解释器的任务就是解...原创 2018-02-25 16:08:06 · 2260 阅读 · 0 评论 -
Android ART虚拟机执行引擎-JIT(九)
Just-in-time compilation是一种动态编译,是在程序运行过程中才执行编译工作。相对于ART的核心技术ahead-of-time,JIT有几个有点:比AOT更节省存储空间;不需要在每次安装,或者系统升级、应用升级后都做AOT优化。因为不需要在程序安装时执行AOT预编译,所以不会出现漫长的安装等待,不会影响程序的启动速度。JIT的编译过程是在独立的线程中完成的,并且只编译有必要的函...原创 2018-02-25 21:15:33 · 1324 阅读 · 0 评论 -
Android ART虚拟机执行引擎-本地代码的执行(十)
以前面分析的虚拟机的启动流程 ART 虚拟机的启动 为例。zygote在调用AndroidRuntime的start函数时传入一个class名称:runtime.start("com.android.internal.os.ZygoteInit", args, zygote); 这个classname就是要被执行的类对象,一旦虚拟机启动完成,就会调用这个类的main方法。因为zygote程序本身有...原创 2018-02-26 22:14:02 · 1152 阅读 · 0 评论 -
ART的垃圾收集过程
ART运行时垃圾收集机制简要介绍和学习计划https://blog.csdn.net/luoshengyang/article/details/42072975转载 2018-06-13 22:52:25 · 647 阅读 · 0 评论 -
安卓开发热修复技术原理
https://www.jianshu.com/p/b9ed58405ded安卓开发热修复技术原理及选型转载 2018-06-19 21:26:36 · 237 阅读 · 0 评论 -
Android 查看进程内存的方式
查看Android系统,单个进程、多个进程内存的使用情况,通常有那些方法:1,通过Android API函数使用ActivityManager查看可用内存,具体是其内部类MemoryInfo。ActivityManager.MemoryInfo memInfo = new ActivityManager.MemoryInfo();am.getMemoryInfo(memInfo);原创 2018-02-06 22:28:27 · 5350 阅读 · 0 评论 -
Android运行时ART简要介绍和学习计划
转自:老罗的博客ART VMAndroid运行时ART简要介绍和学习计划 Android在4.4就已推出新运行时ART,准备替代用了有些时日的Dalvik。不过当时尚属测试版,主角仍是Dalvik。 直到今年的Google I/O大会...转载 2018-02-12 20:54:27 · 326 阅读 · 0 评论 -
深入理解Java虚拟机-虚拟机字节码执行引擎(八)
虚拟机字节码执行引擎 在不同的虚拟机实现里面,执行引擎在执行Java代码的时候可能会有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,也可能两者兼备,甚至还可能会包含几个不同级别的编译器执行引擎。但从外观上看起来,所有的Java虚拟机的执行引擎都是一致的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果。 8.2运行是的栈帧结构 ...原创 2017-12-21 17:31:27 · 1891 阅读 · 0 评论 -
深入理解Java虚拟机-Java内存区域与内存溢出异常(二)
第二章 Java内存区域与内存溢出异常2.2 运行时数据区域 Java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干不同的数据区域。2.2.1 程序计数器 程序计数器(program Counter Register)是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。字节码解释器工作时是通过改变这个计数原创 2017-12-13 19:02:14 · 632 阅读 · 0 评论 -
深入理解Java虚拟机-垃圾收集器与内存分配策略(三)
深入理解Java虚拟机第二版学习笔记。垃圾收集器与内存分配策略 第二章java内存运行时区域的各个部分,启动程序计数器、虚拟机栈、本地方法栈三个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出有条不紊的执行着出栈和入栈操作。每一个栈帧中分配多少内存基本是类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具备确定性,不需要过多考虑回收的问题,因为方法结束或线原创 2017-12-14 19:42:16 · 713 阅读 · 0 评论 -
深入理解Java虚拟机-Java内存模型与线程(12)
深入理解Java虚拟机 学习笔记第十二章 java内存模型与线程在许多情况下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统速度的差距太大,大量的时间都花费在磁盘I/O、网络通信或者数据库访问上。 12.2 硬件的效率与一致性由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统原创 2017-12-28 10:56:41 · 471 阅读 · 0 评论 -
Java的内存分配和管理
Java的内存分配和管理Java内存分配时涉及的区域:寄存器:在程序中无法控制;栈:存放基本类型的数据和对象的引用,但是对象本身不存放在栈中,而是存放在堆中;堆:存放用new产生的数据;静态域:存放在对象中用static定义的静态成员;常量池:存放常量。内存分配中的栈和堆1.栈在函数中定义的一些基本类型的变量数据,还有对象的引用变量都在函数的栈内存中分配。...原创 2018-01-14 22:46:13 · 6169 阅读 · 1 评论 -
Android 虚拟机的进程管理
一Android 虚拟机的进程管理Android 虚拟机进程管理是依赖linux的进程体系结构的,要为应用程序创建一个进程,它会使用linux的fork机制来复制一个进程(复制进程比创建进程更高效) 。执行这个操作的就是zygote。zygote是一个虚拟机进程,也是一个虚拟机实例的孵化器。当一个应用程序启动时,会通过socket发出请求,zygote在收到请求后会fork一个新的应用程序原创 2018-01-13 22:47:50 · 2026 阅读 · 0 评论 -
Android进程-zygote进程
一,zygote进程zygote进程的父进程是init,zygote也是所有应用的父进程,也是system_server进程的父进程。 1.1 Zygote系统源码组成1) Zygote.java(frameworks/base/core/java/com/android/internal/os/)提供访问vm的zygote接口,主要是包装Linux系统的fork,以原创 2018-01-31 17:49:32 · 470 阅读 · 0 评论 -
深入理解Java虚拟机-虚拟机类加载机制(四)
7.1概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。 在java语言中,类型的加载、连接、初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载稍微增加一些性能开销,但是为java应用程序提供了高度的灵活性,java里天生可以动态扩展的语言特性就是依赖运行期动态...原创 2017-12-19 16:09:59 · 552 阅读 · 0 评论 -
Android Dalvik虚拟机基础
Android Dalvik虚拟机(尽管现在被art取代,但不代表它一无是处,了解dalvik有助于理解art)在Android 4.4之前,Dalvik一直是Android中默认的虚拟机,后面推出了ART运行环境机制,逐步完全取代了Dalvik。Dalvik 和art都可以支持已经转换为.dex格式的java应用程序的运行。 一、Dalvik VM,JVM的差异:1)多数JVM都是基于堆栈的,而...原创 2018-02-11 16:56:28 · 753 阅读 · 0 评论 -
Android ART虚拟机(一)
Android的应用程序开发语言首选的是java,所以Android虚拟机或多或少都会借鉴JVM中的一些设计思想和技术实现。虽然严格意义上讲Android的dalvik/art并不是纯正的java虚拟机(因为没有完全遵循JVM规范),但是本质上跟hotspot等jvm又有很多相似。所以先理解java虚拟机对理解Android虚拟机是会有很大帮助的。java虚拟机解决的核心问题是:write onc...原创 2018-02-12 09:15:25 · 5938 阅读 · 0 评论 -
深入理解Java虚拟机第二版学习笔记(一)
深入理解Java虚拟机第二版学习笔记。第一章, 走进Java。1.2 Java技术体系Sun官方定义的Java技术体系包括以下几个组成部分:Java程序设计语言;各种硬件平台上的Java虚拟机;Class文件格式;Java API类库;来自商业机构和开源社区的第三方Java类库。 通常把Java程序设计语言、Java虚拟机、Java API类库这原创 2017-12-12 18:09:26 · 1633 阅读 · 1 评论