
dalvik/art虚拟机、多线程
文章平均质量分 83
安卓虚拟机、多线程
baiiu
每天前进三十公里
展开
-
Android ART&Dalvik虚拟机 追踪对象分配
本文介绍Dalvik虚拟机中的Allocation Tracker,用于追踪dalvik内存分配,能直观的看到分配了什么对象,和分配对象的堆栈。原创 2023-04-09 15:20:53 · 170 阅读 · 0 评论 -
Android ART虚拟机 GC流程分析
本文分析ART虚拟机的GC流程,主要函数从CollectGarbageInternal开始。当配置CMS为默认回收器时:- collector_type_为kCollectorTypeCMS。- foreground_collector_type_取值为kCollectorTypeCMS。它代表程序位于前台时使用的回收器类型。- background_collector_type_的取值为kCollectorTypeHomogeneousSpaceCompact。它代表程序位于后台时使用的回收器类型。原创 2023-04-05 14:01:14 · 801 阅读 · 0 评论 -
Android ART虚拟机 GC的各种类型
本文介绍ART虚拟机的GC类型,为下篇介绍ART的GC做准备。每个Space都有自己的gc回收策略,如下图所示:- kGcRetentionPolicyNeverCollect:不需要回收某个Space所包含的垃圾对象(因为该Space可能不存在垃圾对象)。- kGcRetentionPolicyAlwaysCollect:每次垃圾回收都需要处理某个Space空间。- kGcRetentionPolicyFullCollect:直到最后时刻才回收某个Space空间中的垃圾对象。原创 2023-04-04 23:23:13 · 677 阅读 · 0 评论 -
Android ART虚拟机 对象创建内存分配流程
本篇文章介绍我们在日常开发使用Java时new对象的时,ART在堆上的内存分配是如何分配的。内存又和gc相关,下篇文章会分析ART的gc流程。本文可以参考之前写的Dalivk虚拟机下的对象创建时内存分配流程一起看,会对ART虚拟机理解的更深刻些。原创 2023-04-03 23:38:55 · 659 阅读 · 0 评论 -
Android ART虚拟机 Space类体系
在ART虚拟机实现中,内存分配和释放的算法是封装在不同的Space中来完成的。而外部使用者只能借助Space及派生类的接口来完成内存的分配与释放。通过阅读这些Space的实现,可以看出ART虚拟机的一个重要的特点就是大量使用映射内存,相较于Dalvik虚拟机来说在内存分配上管理的更细致。原创 2023-04-02 18:41:38 · 1434 阅读 · 0 评论 -
Android ART虚拟机 堆Heap类构造函数
本文主要介绍Heap的构造函数,从构造函数里大量使用各种Space,可以看出ART虚拟机的一个重要的特点就是大量使用映射内存。主要代码在art/runtime/gc/heap.cc里。原创 2023-04-01 23:04:10 · 1025 阅读 · 0 评论 -
Android ART虚拟机 关键类
本文介绍ART虚拟机中的关键类,方便之后对ART更方便的理解。此处几个类和dalvik一脉相承,也可以更好的理解dalvik里面的GC模块。原创 2023-03-31 22:56:40 · 587 阅读 · 0 评论 -
Andriod ART虚拟机 启动和初始化
之前整理了一系列Dalvik虚拟机的关于堆内存和GC的文章,轮到对ART内存进行分析优化了,继续整理输出一波,本篇为ART虚拟机系列的第一篇,介绍ART虚拟机的启动和初始化。本ART系列基于7.0代码分析。原创 2023-03-29 20:30:07 · 729 阅读 · 0 评论 -
Android Dalvik虚拟机 堆内存管理 增长&释放
本篇继续介绍安卓dalvik虚拟机系列,介绍Dalvik虚拟机的堆内存管理,即堆是如何增长和释放的。原创 2023-03-04 14:46:36 · 983 阅读 · 0 评论 -
Android Dalvik虚拟机 GC流程分析
本篇继续介绍安卓dalvik虚拟机,介绍Dalvik虚拟技的GC流程。原创 2023-03-01 21:26:02 · 1077 阅读 · 0 评论 -
Android Dalvik虚拟机 对象创建内存分配流程
本篇文章介绍我们在日常开发使用Java时new对象的时,Dalvik在堆上的内存分配是如何分配的。内存又和gc相关,下篇文章会分析Dalvik的gc流程。原创 2023-02-12 16:55:59 · 684 阅读 · 0 评论 -
Android Dalvik虚拟机 堆初始化流程
Dalvik虚拟机中,堆是由heap[0] Active堆和heap[1] Zygote堆两部分组成的。其中,Zygote堆用来管理Zygote进程在启动过程中预加载和创建的各种对象,而Active堆是在Zygote进程fork第一个子进程之前创建的。之后无论是Zygote进程还是其子进程,都在Active堆上进行对象分配和释放。这样做的目的是使得Zygote进程和其子进程最大限度地共享Zygote堆所占用的内存。原创 2023-02-11 18:48:38 · 912 阅读 · 1 评论 -
Android Dalvik虚拟机 启动和初始化
本文整理Dalvik虚拟机在启动流程和初始化流程,为下篇分析Dalvik的内存分配流程和gc流程打一个基础。本系列代码均基于4.4.2分析。Dalvik虚拟机启动流程、Dalvik虚拟机初始化流程、Dalvik虚拟机核心变量gDvm含义原创 2023-02-05 17:07:28 · 579 阅读 · 0 评论 -
Android 虚拟机 内存优化 分析GC日志
Android虚拟机在发生垃圾回收 (GC) 事件时,会把相应消息会输出到 Logcat 中,可以看出来虚拟机的内存情况,这为我们做内存优化提供了另外一个可参考的依据,要尽量减少stop the world类型的GC。本文介绍如何查看GC日志,先做到看懂GC日志。原创 2023-01-07 17:04:20 · 2838 阅读 · 0 评论 -
Java并发 lockInterruptibly导致IllegalMonitorStateException异常研究
前言使用ReentrantLock过程中遇到IllegalMonitorStateException崩溃,于是研究一番。复现使用如下代码可以复现:public class LockTest { public static void test() { Thread thread = new Thread(new TestRunnable()); thread.start(); // 加上sleep代码不会IllegalMonitorStateE原创 2020-12-17 19:23:10 · 671 阅读 · 4 评论 -
Java并发 线程安全的三个条件
前言本篇文章介绍一些多线程的相关的深入概念。理解后对于线程的安全性会有更深的理解。先说一个格言,摘自Java核心技术: 如果向一个变量写入值,而这个变量接下来可能会被另一个线程读取;或者一个变量读值,而这个变量可能是之前被另一个线程写入的,此时必须同步。下面就是概念了。1. Monitor机制:Monitor其实是一种同步工具、同步机制,通常被描述成一个对象,主要特点是:同步。 对象的所有方法原创 2017-03-31 22:48:13 · 1686 阅读 · 1 评论 -
Java并发 Java内存模型 happens-before原则
1. 两个关键问题并发编程中,需要处理两个关键问题:线程之间如何通信 和 线程之间如何同步。通信是指线程之间怎样交换信息。同步是指怎样控制不同线程间操作发生的相对顺序。在命令式编程中,线程之间的通信机制有两种:共享内存 和 消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信;并且它的同步也是显示进行的,必须显示指定某段代码需要在线程之间互斥...原创 2020-05-07 11:28:09 · 368 阅读 · 1 评论 -
深入理解Java虚拟机 第二章 Java运行时数据区域
运行时数据区域Java虚拟机在执行Java程序过程中会把它所管理的内存划分为若干个不同的数据区域。其中方法区和堆是由所有线程共享的数据区域。 虚拟机栈、本地方法栈和程序计数器是线程私有的内存。2.2.1 程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变原创 2017-08-09 11:58:23 · 518 阅读 · 0 评论 -
Java虚拟机 对象创建流程、初始化流程
前言梳理对象创建流程对象创建流程new指令时,定位该指令的参数在常量池中的符号引用如果没有,则进行类的加载、连接和初始化。虚拟机为新生对象分配内存将分配到的内存空间都初始化为零值,不包括对象头,并初始化对象头(哈希码、gc年龄等)调用对象方法1. 类加载流程深入理解Java虚拟机 第七章 虚拟机类加载时机与过程2. 对象的内存布局对象在内存中的布局分为三块区域:对象...原创 2020-05-07 11:16:19 · 626 阅读 · 1 评论 -
深入理解Java虚拟机 第七章 虚拟机类加载时机与过程
虚拟机类加载机制:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。类在虚拟机中的生命周期包括加载、连接、初始化、使用、卸载。连接又有三个部分:验证、准备、解析。虚拟机并没有约束什么时候情况下进行类加载阶段,但虚拟机规定有且只有5种情况必须立即对类进行初始化阶段,如果没有初始化的话。被动引用时不会触发类的加载原创 2017-07-30 17:32:22 · 520 阅读 · 0 评论 -
深入理解Java虚拟机 第七章 虚拟机类加载器
7.4 类加载器类加载阶段中 通过一个类的全限定名来获取描述此类的二进制字节流 这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。 实现这个动作的代码模块成为类加载器。1. 类与类加载器-对于任何一个类,都需要由它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性。每一个类加载器,都拥有一个独立的类名称空间。 即比较两个类是否相等,只有在这两个类是由同原创 2017-08-01 12:43:51 · 466 阅读 · 1 评论 -
Java并发 锁优化和锁升级
前言本篇文章介绍Java Synchronized锁优化。锁是存在哪里的,怎么标识是什么锁Monitor机制在Java中怎么表现的锁优化锁升级1. 锁存在哪里对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。Hotspot虚拟机的对象头主要包括两部分数据:Mark Word(标记字段)、Klass Pointer(类型指针),数组会多1字宽(32位: 4字节)来存储...原创 2020-05-07 11:29:07 · 334 阅读 · 1 评论 -
Java并发 示例
1. 死锁private static class DeadLockRunnable implements Runnable { private final Object objA; private final Object objB; DeadLockRunnable(Object objA, Object objB) { this.objA = objA;原创 2017-03-30 22:07:31 · 584 阅读 · 0 评论 -
Java并发 并发机制的底层实现原理
前言代码最终需要转变为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令。本文将深入底层去理解并发机制的底层实现原理。会介绍:volatile的实现原理final的实现原理synchronized的实现原理原子操作的实现原理1. volatile的定义和实现原理volatile定义Java语言允许线程访问共享变量,为了确保共享变量能被准确和...原创 2020-05-07 11:29:26 · 534 阅读 · 1 评论 -
Java并发 并发基础概念
前言介绍多线程基本概念1. 并行和并发并行:多个CPU实例后者多台机器同时执行处理逻辑,是真正的同时 并发:通过CPU调度算法,让用户看上去同时执行,实际上从CPU层面不是真正的同时(操作系统将CPU时间片分配给每一个进程,给人并行处理的感觉)。时间片是分时操作系统分配给每个正在运行的进程微观上的一段CPU时间(在抢占内核中是:从进程开始运行直到被抢占的时间)。2. 进程和线程进程 进程就是正原创 2017-03-30 17:07:19 · 645 阅读 · 1 评论 -
Java并发 并发编程一定快么
前言在进行多线程编程时,是希望程序运行的更快,但也会有很多挑战,如上下文切换、死锁、以及受限于硬件和软件的资源限制等问题。本文会介绍这些挑战 :多线程运行时的上下文切换概念多线程一定快么,因为线程的创建和上下文切换是耗时的,可能会比同步执行慢如何测量上下文切换耗时 和 上下文切换次数如何减少上下文切换死锁的挑战,如何解决资源限制的挑战,如何解决什么是上下文切换CPU通过时间...原创 2020-05-30 23:29:35 · 353 阅读 · 0 评论 -
EffectiveJava第十章:并发
本章的建议可以帮助写出清晰、正确的并发程序。66. 同步访问共享的可变数据对数据操作的原子性和可见性要区分清楚,才能明白什么时候使用synchronized、volatile来保持数据被多个线程共享。同步的全部意义 如果没有同步,一个线程的变化就不能被其他线程看到。 同步不仅可以阻止一个线程看到对象处于不一致的状态之中,还可以保证进入同步方法或同步代码块的每个线程,都看到由同一个锁保护的之前所原创 2017-04-01 21:42:54 · 584 阅读 · 0 评论