android—性能优化2—内存优化

2023-05-16

文章目录

  • 性能优化:
  • 工具:
    • memory profiler
    • LeakCanary
    • arthook
    • epic 库
  • java内存管理机制
    • java 内存回收机制
    • Android内存管理机制
      • Dalvik与 Art区别
      • Low Memory Killer
  • 内存抖动解决
  • 内存泄漏解决
    • 第一个内存泄漏点
    • 内存很大的bitmap
      • 第一个地方 生成二维码的时候每隔一定时间会动态创建二维码
        • 解决方案:
      • 如何定位问题
      • native 内存一直在增加 分析
      • 发现个问题 android studio 插线后使用profile内存自动升高, 感觉是android studio 的bug
    • Bitmap内存模型
    • bitmap 优化
    • 内存优化细节
    • 优化结果:

性能优化:

工具:

memory profiler

android studio 自带的. 找不到profile 的话 顶部导航栏

  1. 点击下载样式的按钮可以找到当前的内存

这样可以看到当前内存是哪里消耗的最多,还有一些其他的内存信息, 最主要看一个bitmap

LeakCanary

https://square.github.io/leakcanary/getting_started/

大致原理

监听Activity生命周期->onDestroy以后延迟5秒判断Activity有没有被回收->如果没有回收,调用GC,再此判断是否回收,如果还没回收,则内存泄露了,反之,没有泄露。

引入:

dependencies {
  // debugImplementation because LeakCanary should only run in debug builds.
  debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.6'
}

arthook

epic 库

支持ART上的Java方法HOOK

java内存管理机制

  1. 方法区: 存储 java静态变量 ,常量.这块区域所有线程都共享.和Java堆一样也是各个线程共享的内存区域,他存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。。
  2. 虚拟机栈: Java虚拟机栈 .用于存储局部变量、操作数、操作数栈、动态链接、方法出口等信息. 局部变量表存放了编译期可知的各种基本数据类型、对象引用和returnAddress类型。如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机可以动态扩展,如扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。
  3. 本地方法栈: :与虚拟机栈类似,他们之间的区别是虚拟机栈为虚拟机执行Java方法(字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。
  4. 堆: Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域。在此内存区域中唯一目的就是存放对象实例,几乎所有的对象都在这里分配内存。
  5. 程序计数器:是一块较小内存,可以看作是当前线程所执行的字节码的行号指示器。每条线程都需要有一个独立的程序计数器,各个线程之间计数器互不影响。
    比如当前程序执行到第几行.

java 内存回收机制

(1).标记-清除算法:

最基础的垃圾收集算法,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成之后统一回收掉所有被标记的对象。

标记-清除算法的缺点有两个:首先,效率问题,标记和清除效率都不高。其次,标记清除之后会产生大量的不连续的内存碎片,空间碎片太多会导致当程序需要为较大对象分配内存时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

(2).复制算法:

将可用内存按容量分成大小相等的两块,每次只使用其中一块,当这块内存使用完了,就将还存活的对象复制到另一块内存上去,然后把使用过的内存空间一次清理掉。这样使得每次都是对其中一块内存进行回收,内存分配时不用考虑内存碎片等复杂情况,只需要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。

复制算法的缺点显而易见,可使用的内存降为原来一半。

(3).标记-整理算法:

标记-整理算法在标记-清除算法基础上做了改进,标记阶段是相同的标记出所有需要回收的对象,在标记完成之后不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,在移动过程中清理掉可回收的对象,这个过程叫做整理。

标记-整理算法相比标记-清除算法的优点是内存被整理以后不会产生大量不连续内存碎片问题。

复制算法在对象存活率高的情况下就要执行较多的复制操作,效率将会变低,而在对象存活率高的情况下使用标记-整理算法效率会大大提高。

(4).分代收集算法:

根据内存中对象的存活周期不同,将内存划分为几块,java的虚拟机中一般把内存划分为新生代和年老代,当新创建对象时一般在新生代中分配内存空间,当新生代垃圾收集器回收几次之后仍然存活的对象会被移动到年老代内存中,当大对象在新生代中无法找到足够的连续内存时也直接在年老代中创建。

  • 结合多种收集算法的优势
  • 新生代对象存活率低,复制算法
  • 老年代对象存活率高,标记-整理算法.

Android内存管理机制

  • 内存弹性分配,分配值与最大值受具体设备影响
  • OOM场景: 内存真正不足. 可用内存不足

Dalvik与 Art区别

Dalvik是Google公司自己设计用于Android平台的虚拟机
ART代表AndroidRuntime 应用安装的时候就预编译字节码到机器语言,这一机制叫Ahead-Of-Time(AOT)预编译。在移除解释代码这一过程后,应用程序执行将更有效率,启动更快

  • Dalvik仅固定一种回收算法,没有改变
  • 5.0以后用art虚拟机.art回收算法可运行期间选择(在不同情况下选择不同垃圾回收机制-) 比如当前应用在前台,对用户来说响应速度最重要.那么就选择最简单的算法: 标记清除算法, 当应用界面在后台.就可以选择使用标记-整理算法补充

Low Memory Killer

  • 进程分类,有优先级.优先回收低优先级的进程
  • 回收收益

内存抖动解决

  • 定义: 内存频繁废品和回收导致内存不稳定

  • 表现: 频繁GC. 内存曲线呈锯齿状

  • 危害: 导致卡顿 , OOM

  • 使用Memor Profiler初步排查

  • 使用Memor Profiler 或cpu Profile结合代码排查

内存泄漏解决

内存抖动的优化

尽量避免在循环体或者频繁调用的函数内创建对象,应该把对象创建移到循环体外。总之就是尽量避免频繁GC。

项目中出现的问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jZdUgVJa-1617777245772)(https://liudao01.github.io/picture/img/686db9de-e141-44d9-ab7f-67de6aa2b134.png)]

第一个内存泄漏点

拉开看

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VfQPra93-1617777245775)(https://github.com/liudao01/picture/img/20210202215043.png)]

接着我们点击Allocations进行对象分配数量排序,之所以点击这个是因为一般在循环,频繁调用的地方可能发生内存抖动

排名第一的是String ,
Cleaner是垃圾回收相关的对象,NativeAllocationRegistry是内存分配相关的额对象,我们查看其调用栈如图:
我一看咋还有百度的. 我进百度工具类N多个循环在打印信息.难怪内存抖动. 如下

 StringBuffer sb = new StringBuffer(256);
//                sb.append("time : ");
//                /**
//                 * 时间也可以使用systemClock.elapsedRealtime()方法 获取的是自从开机以来,每次回调的时间;
//                 * location.getTime() 是指服务端出本次结果的时间,如果位置不发生变化,则时间不变
//                 */
//                sb.append(location.getTime());
//                sb.append("\nlocType : ");// 定位类型
//                sb.append(location.getLocType());
//                sb.append("\nlocType description : ");// *****对应的定位类型说明*****
//                sb.append(location.getLocTypeDescription());
//                sb.append("\nlatitude : ");// 纬度
//                sb.append(location.getLatitude());
//                sb.append("\nlongtitude : ");// 经度
//                sb.append(location.getLongitude());
//                sb.append("\nradius : ");// 半径
//                sb.append(location.getRadius());
//                sb.append("\nCountryCode : ");// 国家码
//                sb.append(location.getCountryCode());
//                sb.append("\nProvince : ");// 获取省份
//                sb.append(location.getProvince());
//                sb.append("\nCountry : ");// 国家名称
//                sb.append(location.getCountry());
//                sb.append("\ncitycode : ");// 城市编码
//                sb.append(location.getCityCode());
//                sb.append("\ncity : ");// 城市
//                sb.append(location.getCity());
//                sb.append("\nDistrict : ");// 区
//                sb.append(location.getDistrict());
//                sb.append("\nTown : ");// 获取镇信息
//                sb.append(location.getTown());
//                sb.append("\nStreet : ");// 街道
//                sb.append(location.getStreet());
//                sb.append("\naddr : ");// 地址信息
//                sb.append(location.getAddrStr());
//                sb.append("\nStreetNumber : ");// 获取街道号码
//                sb.append(location.getStreetNumber());
//                sb.append("\nUserIndoorState: ");// *****返回用户室内外判断结果*****
//                sb.append(location.getUserIndoorState());
//                sb.append("\nDirection(not all devices have value): ");
//                sb.append(location.getDirection());// 方向
//                sb.append("\nlocationdescribe: ");
//                sb.append(location.getLocationDescribe());// 位置语义化信息
//                sb.append("\nPoi: ");// POI信息
//                if (location.getPoiList() != null && !location.getPoiList().isEmpty()) {
//                    for (int i = 0; i < location.getPoiList().size(); i++) {
//                        Poi poi = (Poi) location.getPoiList().get(i);
//                        sb.append("poiName:");
//                        sb.append(poi.getName() + ", ");
//                        sb.append("poiTag:");
//                        sb.append(poi.getTags() + "\n");
//                    }
//                }
//                if (location.getPoiRegion() != null) {
//                    sb.append("PoiRegion: ");// 返回定位位置相对poi的位置关系,仅在开发者设置需要POI信息时才会返回,在网络不通或无法获取时有可能返回null
//                    PoiRegion poiRegion = location.getPoiRegion();
//                    sb.append("DerectionDesc:"); // 获取POIREGION的位置关系,ex:"内"
//                    sb.append(poiRegion.getDerectionDesc() + "; ");
//                    sb.append("Name:"); // 获取POIREGION的名字字符串
//                    sb.append(poiRegion.getName() + "; ");
//                    sb.append("Tags:"); // 获取POIREGION的类型
//                    sb.append(poiRegion.getTags() + "; ");
//                    sb.append("\nSDK版本: ");
//                }
//                sb.append(mClient.getVersion()); // 获取SDK版本

我给注释后就好很多了

内存很大的bitmap

bitmap 反复创建销毁的问题

有两个地方 一个是首页轮播图的图片, 另一个是

闪电付的图片存在重复创建问题. 有两图片一个是二维码一个是条形码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XTb2N5Lx-1617777245777)(https://github.com/liudao01/picture/blob/master/img/20210202-222641.jpg)]

第一个地方 生成二维码的时候每隔一定时间会动态创建二维码

     /**
     * 生成二维码
     *
     * @param content
     */
    private void createQRCode(String content) {
        //生成二维码相关放在子线程里面
        ThreadManager.getDownloadPool().execute(() -> {
            

            qrCodeBitmap = CodeUtils.createQRCode(content, 540, null);
            if (activity != null) {
                activity.runOnUiThread(() -> {
                    //显示二维码ivQrCode
//                    final int byteCount = qrCodeBitmap.getByteCount();
//                    LogUtil.d("二维码占得内存字节 = "+byteCount);
                    ivQrCode.setImageBitmap(qrCodeBitmap);
                });
            }
        });


    

优化前内存消耗

  • 优化方案1

生成图片前先把图片清空,再用新的bitmap给他赋值

代码如下:

优化后内存消耗:

结果: 降低了将近50M 的内存 恐怖啊

  • 优化方案2

降低图片的质量:

先打印下生成的二维码所占的内存字节数

获取字节数方法:

bitmap.getByteCount
 二维码占得内存字节 = 1166400
 条形码占得内存字节 = 1166400

看一下内存消耗:

两张图所占内存 大约有2M 每次返回都要重新创建.这里可以优化一下.
这里我用的是库 默认创建的bitmap是ARGB_8888 那么我可以给优化下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-251XsXrP-1617777245780)(https://liudao01.github.io/picture/img/企业微信截图_99fd3f8d-fdac-4a96-bf3c-68bad123e323.png)]

解决方案:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3XRkMStC-1617777245781)(https://liudao01.github.io/picture/img/b5fa9ab8-4af3-4b99-84bc-d1021f1ddd2e.png)]

http://xingyun.xiaojukeji.com/docs/dokit/#/androidGuide

如何定位问题

开始的内存情况

运行一段时间后的内存情况

可以明显看到 graphics 内存增加 所以明显是图片的问题.

可以分析1 从网络 2 从本地. 网络的我先把加载网络大图的地方全部注释,依旧内存不断增大.

结合我的代码可以知道 我的页面存在循环创建对象的情况.

  for (int i = 0; i < size; i++) {
  
            if (i == 0) {
                rl_ecard_root.setBackgroundResource(R.mipmap.me_e_card1);
            } else if (i == 1) {
                rl_ecard_root.setBackgroundResource(R.mipmap.me_e_card2);
            } else if (i % 3 == 2) {
                rl_ecard_root.setBackgroundResource(R.mipmap.me_e_card3);
            }
  }

有这样的代码 这样每次进入返回页面都会重复创建

优化后:

native 内存一直在增加 分析

  1. dump java heap
  2. 保存memory-20210204T161535.hprof 文件
  3. mat 下载 https://www.eclipse.org/mat/downloads.php
  4. 创建java虚拟机失败了 https://www.jianshu.com/p/15597858caa0 (我通过vim改才成功)

发现个问题 android studio 插线后使用profile内存自动升高, 感觉是android studio 的bug

Bitmap内存模型

获取bitmap内存占用

  • getBytecount
  • 宽 * 高 * 一个像素所占用的内存
  • 资源目录需要再乘以一个压缩比例

常规优化方案:

  • 背景: 图片对内存优化至关重要,图片宽高大于控件宽高

bitmap 优化

Bitmap的优化策略
经过上面的分析,我们可以得出Bitmap优化的思路:

  1. BitmapConfig的配置
  2. 使用decodeFile、decodeResource、decodeStream进行解析Bitmap时,配置inDensity和inTargetDensity,两者应该相等,值可以等于屏幕像素密度*0.75f
  3. 使用inJustDecodeBounds预判断Bitmap的大小及使用inSampleSize进行压缩
  4. 对Density>240的设备进行Bitmap的适配(缩放Density)
  5. 2.3版本inNativeAlloc的使用
  6. 4.4以下版本inPurgeable、inInputShareable的使用
  7. Bitmap的回收

所以我们根据以上的思路,我们将Bitmap优化的策略总结为以下3种:

  1. 对图片质量进行压缩
  2. 对图片尺寸进行压缩
  3. 使用libjpeg.so库进行压缩

https://blog.csdn.net/u012124438/article/details/66087785

内存优化细节

  • LargeHeap 属性 开启
  • onTrimMemory 当系统内存不足会回调这个. 我们可以在这里回收一些内存供应用使用
  • 使用优化过的集合: SparseArray
  • 谨慎使用SharedPreference
  • 谨慎使用外部库

优化结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nV1XaOAE-1617777245784)(https://liudao01.github.io/picture/img/企业微信截图_96d7a599-03fa-4ca9-ac26-fd6d40916525.png)]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android—性能优化2—内存优化 的相关文章

  • 为何某些公司不允许使用 C++ STL?

    最初开始禁用 C 43 43 STL xff0c 更多地是早期项目编码实践中留下的惯例 xff0c 被后来的程序员继承下来 老项目中这种选择尤其地多 不过如果有人将其上升到公司行为在不同项目中全面禁用 STL xff0c 则没有必要 xff
  • 手把手教你无线数传电台透明传输的配置全攻略

    透明传输 功能说明 任意电台发送数据 xff0c 具有相同地址且相同信道的电台均可同时接收数据 数据以透明方式发送和接收 xff0c 所发即所收 电台设置 1 需将 OPTION 特殊功能寄存器的第 7 位配置成 0 xff0c 透明传输模
  • unity寻路插件(A* Pathfinding)小结

    A Pathfinding 详细使用教程 基本功能 1 astarpath cs 核心组件 xff0c 相当于 路 xff0c 场景里应该只存在一个 2 Seeker cs 相当于一个代理 xff0c 寻找路径 xff0c 需要绑定在每一个
  • Socket网络通信C++编程总结

    概述 Socket编程有三种 xff0c 流式套接字 xff08 SOCK STREAM xff09 数据报套接字 SOCK DGRAM 原始套接字 SOCK RAW 前两者较常用 xff0c 这里简单总结前两种编程步骤以及一些参考资料 编
  • 【STM32+cubemx】0029 HAL库开发:HMC5883L磁力计的应用(电子指南针)

    今天我们来学习电子磁力计HMC5883L的使用 先介绍磁力计的基础知识 xff0c 再给一个获取磁力计数据的例子 xff0c 最后讲解HMC5883L磁力计的校准 xff0c 以及一些使用中的经验 1 xff09 HMC5883L磁力计的基
  • stm32F103R6之BKP(备份寄存器)

    目录 概述 侵入检测 RTC校准 概述 Stm32F103有42个16位的备份寄存器 他们处在备份域里 xff0c 当VDD电源被切断 xff0c 他们仍然由VBAT维持供电 当系统在待机模式下被唤醒 xff0c 或系统复位或电源复位时 x
  • Stm32F103R6之控制器局域网

    目录 概述 双CAN bxCAN工作模式 CAN协议特点 xff1a ISO11898标准CAN物理特性 CAN协议帧 概述 bxCAN是基本扩展CAN Basic Extended CAN 的缩写 xff0c 它支持CAN协议2 0A和2
  • 如何输出一个数的二进制数

    实现思想 xff1a 二进制数是以bit为操作数 xff0c 所以要想将一个数转换为二进制数 xff0c 我们需要先要将输入的数字转化为二进制数 xff0c 然后从高位到低位判断每一位是 1 还是 0 xff0c 最后把对应的 1 和 0
  • 使用libcurl库编写HTTP客户端(包括GET/POST/HTTPS)

    最近在写一个应用程序 需要与HTTP服务器进行数据交互 于是乎自己写了一个类似wget的功能的客户端 实现很简单 但是功能不给力 只可基本功能 于是又在网上找了找 发现使用libcurl库很方便 很强大 比起wget之类的 强大不是一点点
  • 修改系统默认shell为bash

    xfeff xfeff 从 ubuntu 6 10 开始 xff0c ubuntu 就将先前默认的bash shell 更换成了dash shell xff1b 其表现为 bin sh 链接倒了 bin dash而不是传统的 bin bas
  • 如何解决Reporting Services目录数据库文件存在的问题

    出处 xff1a http blog sina com cn s blog 6bace3cc0101jlxv html 错误提示 xff1a 自检时提示 Reporting Services目录数据库文件存在 失败 xff0c Report
  • 无线射频专题《射频合规,2.4GHz WIFI测试指标详解》

    目录 引言 Transmitter Power 发送功率 Transmit Spectrum Mask 发送信号频谱模版 Frequency Error 频率误差 EVM 矢量误差幅度 Band Edges and harmonics 频带
  • 获取当前访问的路径

    String returl 61 request getRequestURL 43 request getQueryString 61 61 null 34 34 34 34 43 request getQueryString
  • 抓取百度关键词排名

    最近在做百度关键词排名的功能 xff0c 发现网上资源比较少 xff0c 于是自己琢磨了一下 xff0c 写一下笔记 xff1b 本文重点在于提供思路 xff0c 请不要过分依赖 xff0c 本文主要靠抓取页面标签来完成 xff0c 如果百
  • 抓取百度关键词排名、标题、连接、描述

    抓取百度关键词排名 标题 连接 描述 转载请标明出处 最近在做百度关键词排名的功能 xff0c 发现网上资源比较这里写代码片少 xff0c 于是自己琢磨了一下 xff0c 写一下笔记 xff1b 本文重点在于提供思路 xff0c 请不要过分
  • Windows Server 2008远程桌面端口的修改

    Windows Server 2008远程桌面端口系统默认的是3389端口 xff0c 但出于安全考虑 xff08 谁都不希望任何都可以远程连接到自己的服务器吧 xff0c 哈哈 xff09 xff0c 经常我们把系统默认的3389端口更改
  • jsp 登陆成功后,显示登录的用户名

    首先在登陆界面将用户名保存起来 xff0c 我这里是将用户名提交到Servlet然后再进行保存 xff0c 从登录界面取用户参数 String uname 61 request getParameter 34 userName 34 req
  • 背景图片随网页的变化而变化(指大小)

    lt DOCTYPE HTML PUBLIC 34 W3C DTD HTML 4 01 Transitional EN 34 gt lt html xmlns 61 34 http www w3 org 1999 xhtml 34 gt l
  • 为什么vscode用久了电脑速度变慢?

    1 vscode 插件占用的内存 1 已经安装的插件 2 插件占用内存 我可以看到 xff0c vs code 这个程序下面有多个进程在跑 xff0c 插件占用的内存比我电脑剩下所有占用的内存还要高 xff0c 但是vs code 性能还是
  • ROS基础学习(一)---创建工作空间

    工作空间 xff08 workspace xff1a 是一个存放工程开发相关文件的文件夹 src xff1a 代码空间 xff08 Source Space build 编译空间 xff08 Build Space devel 开发空间 x

随机推荐

  • 一个简单的爬虫程序,爬取网站的图片

    最简单的爬虫是分析网页 xff0c 如果要爬取图片 xff0c 就要将图片在网页中的格式进行分析 xff0c 取到图片的连接 xff0c 接着下载图片 xff1b 由于网页中还会链接到其他的网页 xff0c 所以需要将其中的所有网页取出 x
  • python文件操作及引申的代码行数统计

    文件操作一般包括文件的读写 xff0c 文件夹的创建 xff0c 文件夹的删除等 第一部分 xff1a python文件读写的基本操作 python打开文件一般使用 open函数 xff1a open file mode 61 39 r 3
  • 超声波测距仪

    基本原理 超声波是利用反射的原理测量距离的 xff0c 被测距离一端为超声波传感器 xff0c 另一端必须有能反射超声波的物体 测量距离时 xff0c 将超声波传感器对准反射物发射超声波 xff0c 并开始计时 xff0c 超声波在空气中传
  • Authorization 值中Bearer空格加token值在python接口请求中如何实现

    在项目中每个接口请求都需要Authorization 值 xff0c 而Authorization他的值必须 Bearer 加token值 xff0c 刚开始自己忘记添加Bearer 接口请求一直拒绝访问 xff0c 后来用fiddler抓
  • printf格式化字符串漏洞原理解析

    读任意地址 printf 34 x 34 只给格式化字符串 xff0c 而不给参数 xff0c 会导致内存泄漏从而读到内存中其他地址的数据 N x参数可以以16进制方式打印第N个参数的内容 xff0c 通过修改N xff0c 我们可以遍历栈
  • 教程丨利用微软官方工具制作U盘安装Win10系统

    一 制作Win10安装U盘 1 登录网站 https www microsoft com zh cn software download windows10 下载 MediaCreationTool 工具 xff0c 这里我们直接点击 立即
  • Linux常用命令大全

    发布jar包 nohup java jar xxxx jar gt dev null 2 gt amp 1 amp 修改nginx conf 后刷新配置 usr local nginx sbin nginx t 测试配置文件修改是否正常 u
  • Zab协议详解

    什么是Zab协议 xff1f Zab协议 的全称是 Zookeeper Atomic Broadcast xff08 Zookeeper原子广播 xff09 Zookeeper 是通过 Zab 协议来保证分布式事务的最终一致性 Zab协议是
  • 谷歌浏览器安装json格式化插件

    实际开发工作中经常用到json数据 xff0c 那么就会有这样一个需求 xff1a 在谷歌浏览器中访问URL地址返回的json数据能否按照json格式展现出来 比如 xff0c 在谷歌浏览器中访问 xff1a http jsonview c
  • Seata详解(一)

    分布式事务 事务是数据库的概念 xff0c 数据库事务 xff08 ACID xff1a 原子性 一致性 隔离性和持久性 xff09 xff1b 分布式事务的产生 xff0c 是由于数据库的拆分和分布式架构 微服务 带来的 xff0c 在常
  • RocketMQ的事务消息和改造

    什么是 rmq分布式事务消息 xff1f Apache RocketMQ在4 3 0版中已经支持分布式事务消息 xff0c 这里RocketMQ采用了2PC的思想来实现了提交事务消息 xff0c 同时增加一个补偿逻辑来处理二阶段超时或者失败
  • session和token区别

    一 session的状态保持及弊端 xff08 1 xff09 当用户第1次通过浏览器使用用户名和密码访问服务器时 xff0c 服务器对用户名和密码进行验证 xff08 2 xff09 验证成功后 xff0c 在服务器端生成并保存sessi
  • 关于阿里云对RocketMQ的topic,tag,consumer关系的理解

    什么是订阅关系一致 消息队列RocketMQ版 阿里云帮助中心 RocketMQ 中Topic Tag GroupName基本概念介绍 Young丶的博客 CSDN博客 rocketmq topic和group的区别 转载
  • MySql Workbench 8.0汉化插件分享

    打开workbench的安装数据目录 xff0c 路径是 xff1a C Program Files MySQL MySQL Workbench 8 0 CE data 打开以后 xff0c 可以看到下面有一堆的xml结尾的文件 xff0c
  • Java-Jdk12版本下载后没有Jre的解决方案以及配置环境变量

    新本Jdk12版本下载后不像以前的版本会自动生成Jre文件夹 xff0c 通过dos命令行可以解决 1 下载jdk12 网址 xff1a https www oracle com technetwork java javase downlo
  • android--性能优化1--首屏优化&启动速度与执行效率检测

    文章目录 实战篇traceview 工具使用操作步骤操作步骤2 systrace 工具使用操作步骤 AOP 工具 hugo 的使用使用方法效果 BlockCanary 使用AOP 工具使用 AspectJ操作步骤 优化方案 异步线程优化 针
  • error Failed connect to github.com 443原因 Github更换认证方式

    Github更换认证方式 github近期调整了认证方式 xff0c 不再允许第三方工具基于账号密码来访问和管理项目了 除非使用github DeskTop 自带的客户端 好坑啊 我一直再用android studio 自带的提交工具很方便
  • AppCompatRatingBar备份用 下次拷贝直接用自定义图片背景

    控件 lt androidx appcompat widget AppCompatRatingBar android id 61 34 64 43 id rating bar 34 style 61 34 64 style myRating
  • 备份Edittext编辑框字数限制ui以及逻辑

    ui布局 etContent addTextChangedListener new TextWatcher 记录输入的字数 private CharSequence enterWords private int selectionStart
  • android—性能优化2—内存优化

    文章目录 性能优化 工具 memory profilerLeakCanaryarthookepic 库 java内存管理机制java 内存回收机制Android内存管理机制Dalvik与 Art区别Low Memory Killer 内存抖