Low Memory状态下app状态的恢复

Android 高质量开发之崩溃优化 做了很久的面试专题,不知道对各位需要面试和有跳槽想法的小伙伴有没有帮助,今天收集一篇关于崩溃优化方面的文章,面试方面的收集,后续我还会持续更新如果觉得有用可以点个关注 前言 开发人员碰到 APP 崩溃(闪退)什么办?不少人会说根据 Log,找到闪退的代码,捕获异常,“消化”掉了所有 Java 崩溃。至于程序是否会出现其他异常表现,那是上帝要管的事情。是的,这种方法对于紧急情况下不失为一种解决办... 阅读详情

app结构
     activity带有ViewPager
     ViewPager上带有4个fragment


这是非常典型的结构


操作过程
     点icon打开app
     点击home键隐藏app
     再次点击icon唤回app
     点击home键隐藏app
     开启多个其他app,要很耗费内存那种
     点击home键隐藏这些app
     再次点击icon唤回app
     app虽然唤回,但是上面的fragment已经不听招呼,空白,无反应


仔细debug,发现按键能够操作fragment,并且fragment能否反馈,但屏幕上还是显示一个空白fragment以及一个初始状态的变量值
所谓初始状态的变量值,是指静态代码设置的值,比如如下的字符串:

     public class FragmentListview extends Fragment {
         String currentPath = "static_ini_code_null";


在静态代码之后的初始化过程中这个值应该被改变,但是却没有,可见这是一个仅仅静态代码初始化的fragment

困扰了很久。在activity和fragment的所有生命周期函数处添加了打印,终于发现端倪

以下是第一次唤回app的流程,打印了activity,以及0和1两个fragment

lifecycle: DirPlayerActivity.onRestart()
lifecycle: FragmentListview.onStart() 0:/mnt/sdcard FragmentListview{41c2c1a0 #0 id=0x7f0a0001 android:switcher:2131361793:0}
lifecycle: FragmentListview.onStart() 1:/mnt/sdcard FragmentListview{41c3f848 #1 id=0x7f0a0001 android:switcher:2131361793:1}
lifecycle: DirPlayerActivity.onStart()
lifecycle: MyArrayAdapter.MyArrayAdapter()
lifecycle: MyArrayAdapter.MyArrayAdapter()
lifecycle: FragmentListview.setListviewAdapter() 0:/mnt/sdcard FragmentListview{41c2c1a0 #0 id=0x7f0a0001 android:switcher:2131361793:0}
lifecycle: FragmentListview.setListviewAdapter() 0:/mnt/sdcard FragmentListview{41c2c1a0 #0 id=0x7f0a0001 android:switcher:2131361793:0}
lifecycle: DirPlayerActivity.updateFileInfor()! FragmentListview{41c2c1a0 #0 id=0x7f0a0001 android:switcher:2131361793:0} [Lcom.maxproj.android.dirplayer.MyArrayAdapter;@41c2c018
lifecycle: MyArrayAdapter.MyArrayAdapter()
lifecycle: FragmentListview.setListviewAdapter() 1:/mnt/sdcard FragmentListview{41c3f848 #1 id=0x7f0a0001 android:switcher:2131361793:1}
lifecycle: FragmentListview.setListviewAdapter() 1:/mnt/sdcard FragmentListview{41c3f848 #1 id=0x7f0a0001 android:switcher:2131361793:1}
lifecycle: DirPlayerActivity.updateFileInfor()! FragmentListview{41c3f848 #1 id=0x7f0a0001 android:switcher:2131361793:1} [Lcom.maxproj.android.dirplayer.MyArrayAdapter;@41c2c018
lifecycle: MyArrayAdapter.MyArrayAdapter()
lifecycle: DirPlayerActivity.onResume()
lifecycle: FragmentListview.onResume() 0:/mnt/sdcard FragmentListview{41c2c1a0 #0 id=0x7f0a0001 android:switcher:2131361793:0}
lifecycle: FragmentListview.onResume() 1:/mnt/sdcard FragmentListview{41c3f848 #1 id=0x7f0a0001 android:switcher:2131361793:1}
lifecycle: DirPlayerActivity.onResumeFragments()
lifecycle: FragmentListview.onPause() 0:/mnt/sdcard FragmentListview{41c2c1a0 #0 id=0x7f0a0001 android:switcher:2131361793:0}
lifecycle: FragmentListview.onPause() 1:/mnt/sdcard FragmentListview{41c3f848 #1 id=0x7f0a0001 android:switcher:2131361793:1}
lifecycle: DirPlayerActivity.onPause()
lifecycle: FragmentListview.onStop() 0:/mnt/sdcard FragmentListview{41c2c1a0 #0 id=0x7f0a0001 android:switcher:2131361793:0}
lifecycle: FragmentListview.onStop() 1:/mnt/sdcard FragmentListview{41c3f848 #1 id=0x7f0a0001 android:switcher:2131361793:1}
lifecycle: DirPlayerActivity.onStop()
lifecycle: FragmentListview.onDestroy() 0:/mnt/sdcard FragmentListview{41c2c1a0 #0 id=0x7f0a0001 android:switcher:2131361793:0}
lifecycle: FragmentListview.onDetach() 0:/mnt/sdcard FragmentListview{41c2c1a0 #0 id=0x7f0a0001 android:switcher:2131361793:0}
lifecycle: FragmentListview.onDestroy() 1:/mnt/sdcard FragmentListview{41c3f848 #1 id=0x7f0a0001 android:switcher:2131361793:1}
lifecycle: FragmentListview.onDetach() 1:/mnt/sdcard FragmentListview{41c3f848 #1 id=0x7f0a0001 android:switcher:2131361793:1}
lifecycle: DirPlayerActivity.onDestroy()


可见唤回时是从onRestart()开始,且没有重新生成fragment的操作
这是第二次唤回app的流程,仍然打印了activity,以及0和1两个fragment

lifecycle: FragmentListview.newInstance() 0 FragmentListview{41c40198}
lifecycle: DirPlayerActivity.StaticCodeIniFragment{} 0 FragmentListview{41c40198}
lifecycle: FragmentListview.newInstance() 1 FragmentListview{41c4e3e8}
lifecycle: DirPlayerActivity.StaticCodeIniFragment{} 1 FragmentListview{41c4e3e8}
lifecycle: FragmentListview.onAttach() 0:static_ini_code_null FragmentListview{41c5ee80 #0 id=0x7f0a0001 android:switcher:2131361793:0}
lifecycle: FragmentListview.onCreate() 0:static_ini_code_null FragmentListview{41c5ee80 #0 id=0x7f0a0001 android:switcher:2131361793:0}
lifecycle: FragmentListview.onAttach() 0:static_ini_code_null FragmentListview{41c5f0c8 #1 id=0x7f0a0001 android:switcher:2131361793:1}
lifecycle: FragmentListview.onCreate() 0:static_ini_code_null FragmentListview{41c5f0c8 #1 id=0x7f0a0001 android:switcher:2131361793:1}
lifecycle: DirPlayerActivity.onCreate()
lifecycle: FragmentListview.onCreateView() 0:static_ini_code_null FragmentListview{41c5ee80 #0 id=0x7f0a0001 android:switcher:2131361793:0}
lifecycle: FragmentListview.onActivityCreated() 0:static_ini_code_null FragmentListview{41c5ee80 #0 id=0x7f0a0001 android:switcher:2131361793:0}
lifecycle: FragmentListview.onCreateView() 0:static_ini_code_null FragmentListview{41c5f0c8 #1 id=0x7f0a0001 android:switcher:2131361793:1}
lifecycle: FragmentListview.onActivityCreated() 0:static_ini_code_null FragmentListview{41c5f0c8 #1 id=0x7f0a0001 android:switcher:2131361793:1}
lifecycle: FragmentListview.onStart() 0:static_ini_code_null FragmentListview{41c5ee80 #0 id=0x7f0a0001 android:switcher:2131361793:0}
lifecycle: FragmentListview.onStart() 0:static_ini_code_null FragmentListview{41c5f0c8 #1 id=0x7f0a0001 android:switcher:2131361793:1}
lifecycle: DirPlayerActivity.onStart()
lifecycle: MyArrayAdapter.MyArrayAdapter()
lifecycle: MyArrayAdapter.MyArrayAdapter()
lifecycle: FragmentListview.setListviewAdapter() 0:static_ini_code_null FragmentListview{41c40198}
lifecycle: FragmentListview.setListviewAdapter() 0:/mnt/sdcard FragmentListview{41c40198}
lifecycle: DirPlayerActivity.updateFileInfor()! FragmentListview{41c40198} [Lcom.maxproj.android.dirplayer.MyArrayAdapter;@41c3f260
lifecycle: MyArrayAdapter.MyArrayAdapter()
lifecycle: FragmentListview.setListviewAdapter() 1:static_ini_code_null FragmentListview{41c4e3e8}
lifecycle: FragmentListview.setListviewAdapter() 1:/mnt/sdcard FragmentListview{41c4e3e8}
lifecycle: DirPlayerActivity.updateFileInfor()! FragmentListview{41c4e3e8} [Lcom.maxproj.android.dirplayer.MyArrayAdapter;@41c3f260
lifecycle: MyArrayAdapter.MyArrayAdapter()
lifecycle: DirPlayerActivity.onResume()
lifecycle: FragmentListview.onResume() 0:static_ini_code_null FragmentListview{41c5ee80 #0 id=0x7f0a0001 android:switcher:2131361793:0}
lifecycle: FragmentListview.onResume() 0:static_ini_code_null FragmentListview{41c5f0c8 #1 id=0x7f0a0001 android:switcher:2131361793:1}
lifecycle: DirPlayerActivity.onResumeFragments()
lifecycle: FragmentListview.onPause() 0:static_ini_code_null FragmentListview{41c5ee80 #0 id=0x7f0a0001 android:switcher:2131361793:0}
lifecycle: FragmentListview.onPause() 0:static_ini_code_null FragmentListview{41c5f0c8 #1 id=0x7f0a0001 android:switcher:2131361793:1}
lifecycle: DirPlayerActivity.onPause()
lifecycle: FragmentListview.onSaveInstanceState() 0:static_ini_code_null FragmentListview{41c5ee80 #0 id=0x7f0a0001 android:switcher:2131361793:0}
lifecycle: FragmentListview.onSaveInstanceState() 0:static_ini_code_null FragmentListview{41c5f0c8 #1 id=0x7f0a0001 android:switcher:2131361793:1}
lifecycle: DirPlayerActivity.onSaveInstanceState()
lifecycle: FragmentListview.onStop() 0:static_ini_code_null FragmentListview{41c5ee80 #0 id=0x7f0a0001 android:switcher:2131361793:0}
lifecycle: FragmentListview.onStop() 0:static_ini_code_null FragmentListview{41c5f0c8 #1 id=0x7f0a0001 android:switcher:2131361793:1}
lifecycle: DirPlayerActivity.onStop()


可见,app不是从onRestart()开始,而是完全从activity静态代码开始初始化activity并且到达onCreate()
并且看到来历不明的两个fragment被onAttach()过来,这并不是activity静态代码生成的fragment


一个诀窍:可以将一个fragment或其他object当成字符串打印,会打印出该fragment的内存地址(估计是)
通过这个我们可以看出每次操作的是哪个fragment或其他object,尽管它们可能是同一类对象


如果高亮上面被打印出的各个fragment地址,就会发现activity静态代码生成的两个fragment被后续的activity代码初始化了
比如被setListviewAdapter()设置了adapter,但是这两个fragment却走不到onCreateView()和onResume()


被attach过来的fragment未经历activity代码的初始化,但是却走到了onCreateView()和onResume()
也即,app显示了被attach过来的fragment,仅仅被该fragment的静态代码初始化过
这正可以解释操作时看到的现象,被attach过来的应该是系统帮忙恢复的fragment


在官网上找到了low memory下系统可能的恢复操作,其中包括帮忙恢复fragment
但是,这个恢复的fragment怎样接收?怎样关联回activity?官网上却找不到具体的处理方法


在stackoverflow上找到若干类似的问题,其中之一和我预想的方法一致
也即,在fragment的onAttach()中将自己关联给activity,具体关键代码如下

//fragment代码
public class FragmentListview extends Fragment {
    int tab = -1; // attach时如果为-1,说明是系统帮忙恢复的。正常初始化后会被设置为0和1

    @Override
    public void onAttach(Activity activity){
        super.onAttach(activity);
        
        if (tab == -1){ // 系统帮忙创建的,更新到activity
         tab = ((DirPlayerActivity) getActivity()).sysAttachFragment; // 这里计数被系统attach了多少个fragment
         fragmentListviewInterface.sysAttachFragmentListviewLowMem(
         tab, 
         this);
         ((DirPlayerActivity) getActivity()).sysAttachFragment++;
        }
    }

}
//activity代码
public class DirPlayerActivity extends FragmentActivity implements
    FragmentListview.FragmentListviewInterface
    {
        int sysAttachFragment = 0;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_dir_player);
            for (int i = 0; i < LocalConst.tabCount; i++) {
                if(sysAttachFragment == 0){ // 正常启动,而不是系统帮忙恢复
                    fragmentListview[i] = FragmentListview.newInstance(i);
                }
        }
    }

    public void sysAttachFragmentListviewLowMem(int tab, FragmentListview fragment){
               fragmentListview[tab] = fragment;
    }

}

简单测试了一下,似乎可行

但是,感觉很不好
因为fragment也许和activity有很多关联,有很复杂的初始化过程
系统帮忙恢复的操作却非常的粗鲁
直接生成一个未正常初始化的fragment就强塞过来,并占领了对应的位置
这时候千头万绪,关联和恢复处理相当麻烦不可靠


在low memory的情况下恢复app的状态有必要吗?值得吗?
至少有一些app不会有这样的需求
所以,系统应该提供一个选项,让app自己选择要不要恢复原来的状态
有这样的选项吗?我没找到。或有,只是我不知道而已?


在我的这个项目中我就不希望系统帮忙恢复fragment
让app代码自己处理,结果会干净清爽得多,安心得多

从Android内存回收机制看APP生命周期管理的艺术 本文深入探讨了Android内存回收机制及其对APP生命周期管理的影响,揭示了系统如何通过OOM Killer和Low Memory Killer策略动态管理内存。文章重点分析了Application类在内存回收中的陷阱,并提供了避免APP崩溃的实用解决方案,如进程冷冻技术和低端设备优化策略,帮助开发者提升应用性能和用户体验。 阅读详情

相关推荐

从咕咚、乐动力看Android保活:揭秘主流运动APP的黑科技与避坑指南

本文深入解析Android运动类APP如咕咚、乐动力的保活技术,揭秘其通过降低oom_adj值、进程复活等黑科技实现后台常驻内存的原理。提供从Low Memory Killer机制到实战避坑指南的完整方案,帮助开发者优化APP保活策略,平衡性能与用户体验。

weixin_30872337的博客 482

Android 异常重启--踩坑归来--干货篇

Android 异常重启--踩坑归来--干货篇

qq_38086481的博客 1680

memory.md:轻量级文件化Agent记忆系统设计

在大模型Agent开发中,记忆系统需满足实时性、关联性、可编辑性与上下文感知等核心要求,而传统RAG因检索延迟高、状态缺失、不可版本化等固有缺陷,难以胜任会话级动态记忆任务。基于语义蒸馏、结构化元数据与文件系统原语,memory.md以纯文本+YAML frontmatter+语义锚点实现毫秒级记忆唤起,在token预算紧张场景下显著提升多轮对话一致性与推理稳定性。该方案不替代RAG,而是与其形成‘知识库(静态权威)—记忆中枢(动态临时)’的分层协同架构,适用于金融、工业、SaaS等对可靠性与可追溯性要求严

weixin_33730836的博客 351

android因为memory low杀掉的activity 会不会再restore出来?

============问题描述============ android外行人,问个问题 activity不是在栈里管理嘛、那是不是memorylow的时候,先从栈底开始杀?(有没有杀的优先级?) 栈底下的被杀时候,当出栈到这个被杀的activity时,会发生什么? ...

weixin_30251829的博客 120

Android 系统低内存lowmemorykiller关于阈值修改 low memory killer优化

在系统rom定制化开发中,在对于运行内存ram 1G和2G的设备中,对于内存使用高峰期时,low memory killer优化很关键 调整合理的minfree,让内存合理的使用很关键,接下来分析相关功能的实现

安卓兼职framework和app工程师的博客 525

APP开发实战121-APP内存优化节省内存

30.3.1节省内存 1 当UI不可见时,释放相关资源: 在Activity的onPause函数中停止动画、停止视频播放和停止获取和传递设备当前的经纬度给服务器等。 在Activity的onStop函数中,取消当前页面的网络请求等。 在onTrimMemory() 方法中,接收到TRIM_MEMORY_UI_HIDDEN信号时,释放 UI 使用的内存资源,如图片占据的内存,这样减少内存消耗

xjbclz的专栏 508

Android 如何避免后台音乐被low memory结束生命 M

前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          优快云:http://www.youkuaiyun.com          雨季o莫忧离:http://blog.youkuaiyun.com/luckkof 正文   为防止某些进程被low memory意外杀掉,可以将其加入白名单,降低误伤的概率;

奥特曼 2640

rag综述——RAG技术发展流程、最新技术挑战与系统级优化

RAG技术发展综述:本文系统梳理了检索增强生成(RAG)技术的演进历程,从2017年开放域问答中的早期探索,到2020年正式提出RAG架构并与大模型深度融合,再到2025年向系统化、可信化和智能体化发展。当前RAG面临检索可靠性、系统效率和生成可信度三大核心挑战,解决方案包括领域自适应训练、强化语义编码、迭代检索策略等优化方向。未来RAG将向GraphRAG、SafeRAG等方向发展,从单纯性能优化转向构建可控、可审计的语言系统框架,成为高可靠大模型应用的基础设施。

lovehu6686的博客 1242

android onLowMemory低内存回调方法详解

onLowMemory方法顾名思义就是在app内存低的时候回调,那么怎样才是内存低的标准,回调流程又是如何?我们一起带着问题去看源代码解析。 onLowMemory方法在Activity,Servier,ContentProvider,Application中都有回调,但是BroadcastReceiver没有这个回调。这里简单介绍一下Android系统的内存分配机制。Android系统中一个个的

一航jason 8441

【vue看板】

大屏看板提示:以下是本篇文章正文内容,下面案例可供参考提示:这里对文章进行总结:代码量较多,看板中的。

weixin_46223284的博客 2772

ThingsBoard - 设备接入

设备接入笔记

qq_53839898的博客 1454

Low memory Killer

Low memory Killer 代码位置 drivers/staging/android/lowmemorykiller.c 控制节点 sys/module/lowmemorykiller/parameters/ adj adj_max_shift cost debug_level enable_adaptive_lmk enable_lmk lmk_fast_run minfree ...

Kian_G 的博客 656

雨流计数法的matlab实现,采用三点法与四点法

介绍雨流计数法是20世纪50年代由英国的两位工程师M.Matsuishi和T.Endo提出来的。该计数法的主要功能是把实测载荷历程简化为若干个载荷循环,供疲劳寿命估算和编制疲劳试验载荷谱使用。它以双参数法为基础,考虑了动强度(幅值)和静强度(均值)两个变量,符合疲劳载荷本身固有的特性。雨流计数法主要用于工程界,特别在疲劳寿命计算中运用非常广泛计数规则(1)雨流依次从载荷时间历程的峰值位置的内侧沿着...

u011391128的博客 3万+

android+"low+memory"+消息,Android 应用内存优化 之 onLowMemory & onTrimMemory

OnLowMemory:是Android提供的API,在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,系统会调用OnLowMemory。OnTrimMemory:是Android 4.0之后提供的API,系统会根据不同的内存状态来回调。根据不同的内存状态,来响应不同的内存释放策略。onTrimMemory传入的几个内存级别释放内存:TRIM_ME...

weixin_39517289的博客 299

告别SendKeys!用DD驱动级模拟在Windows 10/11上实现真·后台键鼠操作(Python实战)

本文详细介绍了如何使用DD驱动级模拟技术在Windows 10/11上实现真后台键鼠操作,解决传统方法如pyautogui和SendKeys的局限性。通过Python实战案例,展示了驱动级模拟在游戏自动化、RPA等场景中的高效应用,包括环境配置、核心API解析及高级优化技巧。

weixin_42519985的博客 800

用AI生成React/Vue页面?实测Locofy等5款工具,教你选最适合的

本文深度评测了2024年五大AI生成前端页面工具,包括Locofy、Builder.io等,从代码质量、可视化编辑器成本到企业级落地方案进行全面分析。通过实测数据和实战案例,揭示如何利用AI生成技术高效创建React/Vue页面,提升开发效率并优化性能。

m5n6o7的博客 606

Low Memory Killer(一)- android源码分析

标签: Low_Memory_Killer 低内存管理机制 系统内存管理 Low Memory Killer Android 系统中运行的APP退出到后台时并不会真正杀死这个进程,而是将其缓存起来,以便下次能快速启用(热启动)。在系统内存不足情况下,系统会依据Low Memory Killer机制来杀死进程; Low Memory Killer 基本原理 所有进程都是从zygote孵化出来的,记...

邓焱兵的博客 504

执行任务赚积分

接下来N行,每行两个空格分隔的整数(SLA和V),SLA表示任务的最晚处理时间,V表 示任务对应的积分。每个任务都有最晚处理时间限制和积分值,在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。现有N个任务需要处理,同一时间只能处理一个任务,处理每个任务所需要的时间固定为1。可用于处理任务的时间有限,请问在有限的时间内,可获得的最多积分。第2个时间单位内,处理任务4,获得5个积分。输入描述:第一行为一个数N,表示有N个任务,1

面试高手的博客 4694

memory warning

Phone下每个app可用的内存是被限制的,如果一个app使用的内存超过20M,则系统会向该app发送Memory Warning消息。苹果公司系统工程师建议,应用程序所占内存不应该超过20MB,开发人员圈内流传着一个粗略的经验法则:当应用程序占用了大约20MB内存时,iphone开始发出内存警告。当应用程序所占内存大约为30MB时,iphone OS会关闭应用程序。收到此消息后,app必须正

sinat_15584029的专栏 658

DCMM评估报告模板样例

这篇DCMM评估报告对某数据管理公司2020年的数据管理能力进行了全面分析。报告显示,该公司在数据战略方面取得初步进展,但在数据治理和数据架构方面仍存在明显不足,包括缺乏有效治理流程、数据质量监控不足,以及数据标准化和转换灵活性不足等问题。评估报告提出了针对性改进建议,包括完善数据战略、建立治理流程、加强质量监控和提升数据转换灵活性等,为提升数据管理成熟度提供了重要指导。

cdfunlove的博客 166

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Direct-memory-access-CS2-DMA开发者指南:内存同步与网络数据传输实现

Direct-memory-access-CS2-DMA是一个专门为《反恐精英2》(CS2)设计的**低级别直接内存访问框架**。这个开源项目通过PCIe DMA技术实现游戏内存的高效读取,为开发者提供了研究内存获取、实体状态解析和网络同步的完整工具链。如果你是想要深入理解游戏逆向工程、内存操作和实时数据同步的开发者,这个项目将为你提供宝贵的实践平台。 在前100个字的介绍中,我们已经明确了项目

gitblog_01048的博客 971

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Direct-memory-access-CS2-DMA高级配置:提升性能与稳定性的10个专业技巧

Direct-memory-access-CS2-DMA是一款专为《反恐精英2》(CS2)设计的直接内存访问(DMA)框架,为游戏内存获取、实体状态解析和同步提供了强大的技术基础。对于追求极致性能和稳定性的高级用户,正确的配置可以显著提升使用体验。本文将分享10个专业技巧,帮助你优化Direct-memory-access-CS2-DMA的性能和稳定性。🚀 ## 1. 📊 优化WebRada

gitblog_00494的博客 426

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LangGraph实战—构建可记忆、可恢复的智能体

LangGraph应用的核心数据结构 它定义了应用的所有数据,在所有节点间传递,并被持久化保存类似游戏存档机制 在每个节点执行后自动保存状态,可以随时恢复到任意历史节点支持任务的断点恢复运行 适用于长时间的任务、复杂的任务用于实现断点,例如中间有任务需要人工审核的 2、使用MemorySaver进行状态保存 3、使用sqliteSaver进行持久化 运行代码后,可以在项目当前目录下查看到生成的chat_history.db持久化文件,使用数据库连接工具连接这个文件,可以查看到里面的3张表,保存着状态数

u010198709的博客 270

Android 性能优化【篇五:应用启动分析流程】

本篇主要围绕Android性能优化,应用启动类性能问题为主题,先结合MTK的文档阐述应用启动流程,然后结合MTK的分析思路,其他厂商的思路,和我之前有段时间研究过某音的TOP300分析思路的案例,进行说明。

qq_27672101的博客 410

深入理解Direct-memory-access-CS2-DMA架构:低级别编程与PCIe交互原理

Direct-memory-access-CS2-DMA是一个针对CS2的低级直接内存访问(DMA)框架,专为内存获取、实体状态解析、同步以及PCIe/逆向工程研究而设计。本文将深入剖析其核心架构与工作原理,帮助开发者和研究人员掌握这一强大工具的内部机制。 ## DMA技术在游戏内存访问中的革命性应用 🚀 直接内存访问(DMA)技术通过绕过CPU直接与硬件设备交互,实现对系统内存的高效访问。

gitblog_00163的博客 418

揭秘Direct-memory-access-CS2-DMA:CS2内存交互的终极DMA框架详解

想要深入了解CS2游戏内存的高级交互技术吗?Direct-memory-access-CS2-DMA(简称KevqDMA)是一个专为研究PCIe直接内存访问技术而设计的开源框架。这个强大的CS2 DMA工具提供了完整的内存读取、实体状态解析和同步解决方案,为游戏逆向工程和硬件级内存交互研究提供了终极平台。 ## 🔍 什么是CS2 DMA框架? Direct-memory-access-CS2

gitblog_01026的博客 716
上一篇: android横竖屏切换与activity的销毁重建
下一篇: 在notification中设置PendingIntent
Max2005
博客等级 码龄22年 45粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值