内存泄漏修复示例

Android基础 Service详解 ##概述: 和Activity一样,Service同样继承至Context,是Android的四大组件之一,但是和Activity不一样的是Service的使用场景,Service使用于后台运行代码,而不现实界面,一般用于执行耗时较长的操作,当然Service默认运行在主线程,需要执行耗时操作需要在Service中创建一个新的线程. ###生命周期说明: ◦onCreate():  首次创建服务... 阅读详情

集成leakcanary

usdebugImplementation libs.leakcanary.android 
debuggable true

工具介绍

集成leakcanary之后,在运行过程中,如果有内存泄漏,会有弹窗提示,通过如下命令可启动泄漏日志页面

adb shell am start -n com.xxx.xxx/leakcanary.internal.activity.LeakLauncherActivity

泄漏修复示例

列举1.0版本中检测并修复的内存泄漏示例

1. BaseBleService非静态内部类MyBinder泄漏

泄漏日志如下:

┬───
                 │ GC Root: Global variable in native code
                 │
                 ├─ com.xxxxx.bluetooth.service.BaseBleService$MyBinder instance
                 │    Leaking: UNKNOWN
                 │    Retaining 2.2 kB in 20 objects
                 │    this$0 instance of com.xxx.bluetooth.service.BaseBleService
                 │    ↓ BaseBleService$MyBinder.this$0
                 │                              ~~~~~~
                 ╰→ com.xxxxxx.bluetooth.service.BaseBleService instance
                 •     Leaking: YES (ObjectWatcher was watching this because com.xxxx.bluetooth.service.BaseBleService received
                 •     Service#onDestroy() callback and Service not held by ActivityThread)
                 •     Retaining 1.6 kB in 19 objects
                 •     key = eca2c1ba-6c10-43a1-90b0-1d12bc112f11
                 •     watchDurationMillis = 11852
                 •     retainedDurationMillis = 6640
                 •     mApplication instance of com.xxxx.xxxx.MyApplication
                 •     mBase instance of android.app.ContextImpl

大致定位到BaseBleService 的MyBinder 因持有this对象导致BaseBleService 泄漏

查看代码,在 BaseBleService 中有一个非静态的内部类 MyBinder ,在内部类中通过this隐式持有外部BaseBleService 实例,导致在 BaseBleService destroy的时候,但 MyBinder 仍持有其引用,阻止垃圾回收

BaseBleService.java

public class MyBinder extends Binder {
    public MyBinder() {
    }

    public void clearDevice() {
        BaseBleService.this.mBleScanManager.clear();
    }
    ...
  }

修改方案将MyBinder 改为静态内部类,并通过WeakReference对BaseBleService进行弱引用,从而解决泄漏

BaseBleService.java

public static class MyBinder extends Binder {
    private WeakReference<BaseBleService> serviceRef;

    public MyBinder(BaseBleService service) {
        this.serviceRef = new WeakReference<>(service);
    }

    public void clearDevice() {
        BaseBleService baseBleService = serviceRef.get();
        if (baseBleService != null) {
            baseBleService.mBleScanManager.clear();
        }
    }
    ....
    
  }

2. BaseBluetoothFragment onNewDataCallbackLister泄漏

泄漏日志:

                 ┬───
                 │ GC Root: System class
                 │
                 ├─ android.app.ActivityThread class
                 │    Leaking: NO (ActivityThread↓ is not leaking and a class is never leaking)
                 │    ↓ static ActivityThread.sCurrentActivityThread
                 ├─ android.app.ActivityThread instance
                 │    Leaking: NO (BaseBleService↓ is not leaking and ActivityThread is a singleton)
                 │    mInitialApplication instance of com.xxx.xxx.MyApplication
                 │    mSystemContext instance of android.app.ContextImpl
                 │    mSystemUiContext instance of android.app.ContextImpl
                 │    ↓ ActivityThread.mServices
                 ├─ android.util.ArrayMap instance
                 │    Leaking: NO (BaseBleService↓ is not leaking)
                 │    ↓ ArrayMap.mArray
                 ├─ java.lang.Object[] array
                 │    Leaking: NO (BaseBleService↓ is not leaking)
                 │    ↓ Object[7]
                 ├─ com.xxxx.bluetooth.service.BaseBleService instance
                 │    Leaking: NO (Service held by ActivityThread)
                 │    mApplication instance of com.xxx.xxxx.MyApplication
                 │    mBase instance of android.app.ContextImpl
                 │    ↓ BaseBleService.lConnect
                 │                     ~~~~~~~~
                 ├─ com.xxxxx.common.base.BaseBluetoothFragment$$ExternalSyntheticLambda3 instance
                 │    Leaking: UNKNOWN
                 │    Retaining 12 B in 1 objects
                 │    ↓ BaseBluetoothFragment$$ExternalSyntheticLambda3.f$0
                 │                                                      ~~~
                 ╰→ com.xxxx.xxx.ui.exercisepreparation.LandExercisePreparationFragment instance
                 •     Leaking: YES (ObjectWatcher was watching this because com.xxxx.xxxx.ui.exercisepreparation.
                 •     xxxxxxFragment received Fragment#onDestroy() callback. Conflicts with Fragment.
                 •     mLifecycleRegistry.state is INITIALIZED)
                 •     Retaining 1.2 MB in 3977 objects
                 •     key = 39fc801c-5bf6-45ea-86ec-29621ba613aa
                 •     watchDurationMillis = 5995
                 •     retainedDurationMillis = 993

链路说明,LandExercisePreparationFragment 因BaseBluetoothFragment中的this对象被BaseBleService 中的lConnect持有,导致LandExercisePreparationFragment 在destroy的时候,因为还有持有链路而无法销毁,造成泄漏

结合代码


BaseBluetoothFragment.kt

binder.setConnectDeviceLister { connected ->
    LogUtils.v("蓝牙基类 -- > 设备连接监听 $connected  $activelyDisconnect ")
    .......
}

BaseBluetoothFragment在 Service bind之后,通过lambda设置了setConnectDeviceLister 监听器,这个匿名内部类隐式的持有fragment的this对象,这个对象最终被baseBleService的lConnect持有。

修复方案

在 fragment销毁的时候,断开引用链路,将setConnectDeviceLister 设置为null


BaseBluetoothFragment.kt

override fun onDestroy() {
    if (::binder.isInitialized) {
            binder.setNewDataLister(null)
            binder.setConnectDeviceLister(null)
        }
  }

3. MainFragment 因被静态变量持有导致泻漏

 ┬───
                 │ GC Root: Thread object
                 │
                 ├─ android.net.ConnectivityThread instance
                 │    Leaking: NO (PathClassLoader↓ is not leaking)
                 │    Thread name: 'ConnectivityThread'
                 │    ↓ Thread.contextClassLoader
                 ├─ dalvik.system.PathClassLoader instance
                 │    Leaking: NO (NetworkChange↓ is not leaking and A ClassLoader is never leaking)
                 │    ↓ ClassLoader.runtimeInternalObjects
                 ├─ java.lang.Object[] array
                 │    Leaking: NO (NetworkChange↓ is not leaking)
                 │    ↓ Object[3764]
                 ├─ com.xxxx.common.utils.network.NetworkChange class
                 │    Leaking: NO (a class is never leaking)
                 │    ↓ static NetworkChange.listener
                 │                           ~~~~~~~~
                 ╰→ com.xxxxx.main.MainFragment instance
                 •     Leaking: YES (ObjectWatcher was watching this because com.xxxxx.main.MainFragment received
                 •     Fragment#onDestroy() callback. Conflicts with Fragment.mLifecycleRegistry.state is INITIALIZED)
                 •     Retaining 493.7 kB in 8263 objects
                 •     key = ecc337e3-aef3-45eb-8995-8a2008ea86e4
                 •     watchDurationMillis = 12461
                 •     retainedDurationMillis = 7461
                 

链路分析:MainFragment 因被NetworkChange 中的listener持有,导致onDestroy的时候无法回收

结合代码

public class NetworkChange {
    public static final String TAG = "NetworkChange";
    private static boolean isRegister = false;
    private static NetStateChangeObserver listener;
    
     public static void registerReceiver(Context context, NetStateChangeObserver lis) {
        listener = lis;
        ........
        isRegister = true;
    }
    .....
}

MainFragment.kt
        NetworkChange.registerReceiver(requireContext(), this)

NetworkChange 中持有一个静态变量NetStateChangeObserver listener,在MainFragment registerReceiver的时候直接将this对象传递给了静态变量。导致在fragment销毁的时候,因为还被静态引用,所以无法销毁,导致泄漏

解决方案:在取消注册的时候,将静态listener置为null

    public static void unRegisterReceiver(Context context) {
     .......
        if (listener != null) {
            listener = null;
        }
    }

4.服务广播未解绑导致泻漏

 ┬───
                 │ GC Root: System class
                 │
                 ├─ android.provider.FontsContract class
                 │    Leaking: NO (MyApplication↓ is not leaking and a class is never leaking)
                 │    ↓ static FontsContract.sContext
                 ├─ com.xxxx.xxxx.MyApplication instance
                 │    Leaking: NO (Application is a singleton)
                 │    mBase instance of android.app.ContextImpl
                 │    ↓ Application.mLoadedApk
                 │                  ~~~~~~~~~~
                 ├─ android.app.LoadedApk instance
                 │    Leaking: UNKNOWN
                 │    Retaining 4.3 MB in 50494 objects
                 │    mApplication instance of com.xxxx.xxxx.MyApplication
                 │    Receivers
                 │    ..xxxxActivity@342657624
                 │    ....xxxxFragment$onCreate$usBroadcastReceiver$1@359382944
                 │    ..MyApplication@319447736
                 │    ....CJ@359062408
                 │    ....v4@359062472
                 │    ....ZV@359062536
                 │    ....ProxyChangeListener$ProxyReceiver@359062600
                 │    ....MediaRouter$VolumeChangeReceiver@359062664
                 │    ....MediaRouter$WifiDisplayStatusChangedReceiver@359062720
                 │    ....cs@359062776
                 │    ....v4@359062840
                 │    ....v4@359062904
                 │    ....d@359062968
                 │    ....C4@359063032
                 │    ....VisibilityTracker@359063096
                 │    ....RegisteredMediaRouteProviderWatcher$1@359063168
                 │    ....FI@359063232
                 │    ....jV@359063288
                 │    ....z10@358194080
                 │    ....NetworkTypeObserver$Receiver@359063392
                 │    ....o@359063456
                 │    ..ControllerService@319399632
                 │    ....ControllerService$1@340346088
                 │    ↓ LoadedApk.mServices
                 │                ~~~~~~~~~
                 ├─ android.util.ArrayMap instance
                 │    Leaking: UNKNOWN
                 │    Retaining 4.3 MB in 50395 objects
                 │    ↓ ArrayMap.mArray
                 │               ~~~~~~
                 ├─ java.lang.Object[] array
                 │    Leaking: UNKNOWN
                 │    Retaining 4.3 MB in 50393 objects
                 │    ↓ Object[2]
                 │            ~~~
                 ╰→ com.xxxxx.main.MainActivity instance
                 •     Leaking: YES (ObjectWatcher was watching this because com.xxx.main.MainActivity received
                 •     Activity#onDestroy() callback and Activity#mDestroyed is true)
                 •     Retaining 8.9 kB in 338 objects
                 •     key = f273584b-ac53-45b9-926a-8c4dddbecb3d
                 •     watchDurationMillis = 12488
                 •     retainedDurationMillis = 7482
                 •     mApplication instance of com.xxxx.xxxx.MyApplication
                 •     mBase instance of androidx.appcompat.view.ContextThemeWrapper

日志分析,MainActivity 有已关联的广播,服务,但是在destroy的时候未注销关联,导致MainActivity 无法回收,可以看到 usBroadcastReceiver,ControllerService等等

结合代码

SocketService

/**
 * 绑定长连接服务
 */
fun bindSocketService(context: Activity, serviceConnection: ServiceConnection){
    LogUtils.v("长链接  -->   绑定长连接服务")
    val service = Intent(context, SocketService::class.java)
    context.bindService(service, serviceConnection, Context.BIND_AUTO_CREATE)
}

解决方案

在销货的时候添加解绑

/**
 * 解绑长连接服务
 */
fun untieSocketService(context: Activity, serviceConnection: ServiceConnection){
    LogUtils.v("长链接  -->   解绑长连接服务")
    context.unbindService(serviceConnection)
}

usBroadcastReceiver:

val filter = IntentFilter()
filter.addAction(ACTION)
requireContext().registerReceiver(usBroadcastReceiver, filter)

解决方案

override fun onDestroy() {
    .....
    requireContext().unregisterReceiver(usBroadcastReceiver)
}

6.播发器SubtitleView 泄漏

 ┬───
09:37:07.203  D  │ GC Root: Thread object
09:37:07.203  D  │
09:37:07.203  D  ├─ android.net.ConnectivityThread instance
09:37:07.203  D  │    Leaking: NO (PathClassLoader↓ is not leaking)
09:37:07.203  D  │    Thread name: 'ConnectivityThread'
09:37:07.203  D  │    ↓ Thread.contextClassLoader
09:37:07.203  D  ├─ dalvik.system.PathClassLoader instance
09:37:07.203  D  │    Leaking: NO (GSYExoSubTitleVideoManager↓ is not leaking and A ClassLoader is never leaking)
09:37:07.203  D  │    ↓ ClassLoader.runtimeInternalObjects
09:37:07.203  D  ├─ java.lang.Object[] array
09:37:07.203  D  │    Leaking: NO (GSYExoSubTitleVideoManager↓ is not leaking)
09:37:07.204  D  │    ↓ Object[4815]
09:37:07.204  D  ├─ com.xxxxx.common.view.video.GSYExoSubTitleVideoManager class
09:37:07.204  D  │    Leaking: NO (a class is never leaking)
09:37:07.204  D  │    ↓ static GSYExoSubTitleVideoManager.videoManager
09:37:07.204  D  │                                        ~~~~~~~~~~~~
09:37:07.204  D  ├─ com.xxxx.common.view.video.GSYExoSubTitleVideoManager instance
09:37:07.204  D  │    Leaking: UNKNOWN
09:37:07.204  D  │    Retaining 460.0 kB in 3925 objects
09:37:07.204  D  │    context instance of com.xxxx.xxxx.MyApplication
09:37:07.204  D  │    ↓ GSYVideoBaseManager.playerManager
09:37:07.204  D  │                          ~~~~~~~~~~~~~
09:37:07.204  D  ├─ com.xxxx.common.view.video.GSYExoSubTitlePlayerManager instance
09:37:07.204  D  │    Leaking: UNKNOWN
09:37:07.204  D  │    Retaining 459.8 kB in 3919 objects
09:37:07.204  D  │    context instance of com.xxxx.xxx.MyApplication
09:37:07.204  D  │    ↓ GSYExoSubTitlePlayerManager.mediaPlayer
09:37:07.204  D  │                                  ~~~~~~~~~~~
09:37:07.204  D  ├─ com.xxx.common.view.video.GSYExoSubTitlePlayer instance
09:37:07.204  D  │    Leaking: UNKNOWN
09:37:07.205  D  │    Retaining 459.8 kB in 3918 objects
09:37:07.205  D  │    mAppContext instance of com.xxx.xxx.MyApplication
09:37:07.205  D  │    ↓ GSYExoSubTitlePlayer.mTextOutput
09:37:07.205  D  │                           ~~~~~~~~~~~
09:37:07.205  D  ├─ com.google.android.exoplayer2.ui.SubtitleView instance
09:37:07.205  D  │    Leaking: YES (View.mContext references a destroyed activity)
09:37:07.205  D  │    Retaining 375.1 kB in 3382 objects
09:37:07.205  D  │    View not part of a window view hierarchy
09:37:07.205  D  │    View.mAttachInfo is null (view detached)
09:37:07.205  D  │    View.mID = R.id.sub_title_view
09:37:07.205  D  │    View.mWindowAttachCount = 1
09:37:07.205  D  │    mContext instance of com.xxx.login.ui.EntranceActivity with mDestroyed = true
09:37:07.205  D  │    ↓ View.mContext
09:37:07.205  D  ╰→ com.xxx.login.ui.EntranceActivity instance
09:37:07.205  D  •     Leaking: YES (ObjectWatcher was watching this because com.xxx.login.ui.EntranceActivity received
09:37:07.205  D  •     Activity#onDestroy() callback and Activity#mDestroyed is true)
09:37:07.205  D  •     Retaining 47.4 kB in 942 objects
09:37:07.205  D  •     key = 49ed1eca-f233-43c3-96d4-37500f393238
09:37:07.205  D  •     watchDurationMillis = 8566
09:37:07.205  D  •     retainedDurationMillis = 3068
09:37:07.206  D  •     mApplication instance of com.xxx.xxx.MyApplication
09:37:07.206  D  •     mBase instance of androidx.appcompat.view.ContextThemeWrapper

泄漏日志分析:

EntranceActivity 无法回收,是因为被 SubtitleView 持有,此链路比较深,需要结合代码分析,

GSYExoSubTitlePlayerManager 中的GSYExoSubTitlePlayer mediaPlayer通过TextOutput mTextOutput的 SubtitleView

GSYExoSubTitleVideoManager(单例)→ GSYExoSubTitlePlayerManager → GSYExoSubTitlePlayer → SubtitleView → 已销毁的EntranceActivity。

`GSYExoSubTitlePlayer`中的`mTextOutput`(即`SubtitleView`)未及时释放,其`mContext`引用了已销毁的Activity。

单例`GSYExoSubTitleVideoManager`长期持有`PlayerManager`及`Player`实例,间接导致`SubtitleView`无法释放。

修复方案

GSYExoSubTitlePlayerManager.java

@Override
public void release() {
    if (mediaPlayer != null) {
        .....
        mediaPlayer.setTextOutput(null);
        mediaPlayer.release();
    }
  }
  
  public static void releaseAllVideos() {
    if (GSYExoSubTitleVideoManager.instance().listener() != null) {
        GSYExoSubTitleVideoManager.instance().listener().onCompletion();
    }
    GSYExoSubTitleVideoManager.instance().releaseMediaPlayer();
    videoManager = null;
}

在播放器释放的时候将setTextOutput置空,断开Manager和 SubtitleView的引用,从而阻断SubtitleView中context对EntranceActivity的引用链路

7.Handler message未取消导致泄漏

泄漏日志:

┬───
                 │ GC Root: System class
                 │
                 ├─ android.app.ActivityThread class
                 │    Leaking: NO (MessageQueue↓ is not leaking and a class is never leaking)
                 │    ↓ static ActivityThread.sMainThreadHandler
                 ├─ android.app.ActivityThread$H instance
                 │    Leaking: NO (MessageQueue↓ is not leaking)
                 │    ↓ Handler.mQueue
                 ├─ android.os.MessageQueue instance
                 │    Leaking: NO (MessageQueue#mQuitting is false)
                 │    HandlerThread: "main"
                 │    ↓ MessageQueue[1]
                 │                  ~~~
                 ├─ android.os.Message instance
                 │    Leaking: UNKNOWN
                 │    Retaining 1.3 MB in 3549 objects
                 │    Message.what = 0
                 │    Message.when = 20885133 (134 ms after heap dump)
                 │    Message.obj = null
                 │    Message.callback = instance @322976080 of com.xxx.xxx.service.CadenceDeviceService$1
                 │    Message.target = instance @321540304 of android.os.Handler
                 │    ↓ Message.callback
                 │              ~~~~~~~~
                 ├─ com.xxxx.bluetooth.service.CadenceDeviceService$1 instance
                 │    Leaking: UNKNOWN
                 │    Retaining 1.3 MB in 3547 objects
                 │    Anonymous class implementing java.lang.Runnable
                 │    this$0 instance of com.xxxx.bluetooth.service.CadenceDeviceService
                 │    ↓ CadenceDeviceService$1.this$0
                 │                             ~~~~~~
                 ╰→ com.xxx.bluetooth.service.CadenceDeviceService instance
                 •     Leaking: YES (ObjectWatcher was watching this because com.xxx.bluetooth.service.CadenceDeviceService
                 •     received Service#onDestroy() callback and Service not held by ActivityThread)
                 •     Retaining 1.3 MB in 3546 objects
                 •     key = 57d1c887-d6d4-46ad-b2fe-6670be28b88b
                 •     watchDurationMillis = 7292
                 •     retainedDurationMillis = 2291
                 •     mApplication instance of com.xxx.xxx.MyApplication
                 •     mBase instance of android.app.ContextImpl
                 

因有未处理的message导致CadenceDeviceService 无法回收导致泄漏

结合代码

CadenceDeviceService.java

private Runnable mCounter =new Runnable() {
    @Override
    public void run() {
        time++;
        hourMeterHandler.postDelayed(this,1000);
    }
};


 this.mHandler.postDelayed(new Runnable() {
                public void run() {
                    CadenceDeviceService.this.mScanning = false;
                    CadenceDeviceService.this.mBluetoothAdapter.stopLeScan(CadenceDeviceService.this.mLeScanCallback);
                }
            }, SCAN_PERIOD);
            

CadenceDeviceService中的mHandler,hourMeterHandler都有延时任务,这些任务在CadenceDeviceService销毁的时候,因为延时还没得到处理,从而阻止了CadenceDeviceService的回收

解决方案:

@Override
public void onDestroy() {
    super.onDestroy();
    hourMeterHandler.removeCallbacksAndMessages(null);
    mHandler.removeCallbacksAndMessages(null);
}

以上大概是总结的几种类型的泄漏和修复方案,类似的问题不重复展示,后续有典型的问题,继续补充

内存泄漏中JVM调优错误的报错与修复 本文探讨了Java应用程序中内存泄漏导致的JVM调优错误及其解决方案。内存泄漏表现为内存占用持续增长和频繁GC操作,最终引发OutOfMemoryError。修复方法包括:合理设置堆内存参数(-Xms/-Xmx)、选择合适的垃圾回收器(如G1GC)、加强监控(使用jstat/jmap等工具)、使用MAT分析堆转储文件定位泄漏点,以及修复代码中的常见泄漏原因(静态集合、未关闭资源等)。文中还提供了代码示例和修复方法对照表,帮助开发者快速定位和解决内存泄漏问题。 阅读详情

相关推荐

Android 10.0+内存泄漏新特征与实战修复指南

本文深入探讨了Android 10.0+环境下内存泄漏的新特征和解决方案。分析了Android 10.0+系统变化对内存管理的影响,包括后台进程限制增强、隐式广播限制和Binder机制优化。针对跨进程通信、前台服务、动态资源加载和WorkManager等Android 10.0+特有的泄漏场景,提供了详细的代码示例和修复方法。介绍了LeakCanary和Android Profiler等检测工具在Android 10.0+环境中的使用技巧。

全栈 1407

Fragment中调用getActivity为null的解决办法

Fragment中调用getActivity为null的解决办法

xiaoxiaocaizi123的博客 1305

Python 中的内存泄漏问题

内存泄漏是一个常见的编程问题,很难调试和修复。本文将通过小型和大型示例程序探讨 Python 内存泄漏。我们将了解如何找到内存泄漏的根源以及如何修复它。

迹忆客 810

android常见内存泄漏主要有以下几类:

一、Handler 引起的内存泄漏。 在Android开发中,我们经常会使用Handler来控制主线程UI程序的界面变化,使用非常简单方便,但是稍不注意,很容易引发内存泄漏。 我们知道,Handler、Message、MessageQueue是相互关联在一起的,Handler通过发送消息Message与主线程进行交互,如果Handler发送的消息Message尚未被处理,该Message及

qq_34272093的博客 958

如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测

什么是valgrind:**valgrind是一个构建动态分析工具的框架,它提供了一系列的工具用于检测和分析内存管理和线程的bug。 其中,最常用的工具就是**Memcheck。 Memcheck能够检测出内存相关的,在C/C++中常见的可能导致程序Crashes以及发生不可预知错误的行为。valgrind本文将通过实例介绍如何使用valgrind进行内存泄漏检测。(再此之前我们的Linux上必须先

Windeal 1231

Windows修复多项漏洞,提升用户体验!

内存泄漏是一个常见的问题,可能导致系统资源耗尽和性能下降。微软的更新补丁修复了Windows中的多个内存泄漏问题,确保系统能够正确释放不再使用的内存。近期,微软发布了一系列的更新补丁,修复了Windows操作系统中的多个漏洞,为用户带来了更加稳定和安全的使用体验。希望本文提供的源代码示例能够帮助读者更好地理解Windows漏洞修复的过程,并鼓励大家保持系统的最新状态,以确保安全和稳定的计算环境。在这篇文章中,我们将探讨一些主要的漏洞修复,并提供相应的源代码示例,以帮助读者理解这些修复的工作原理。

MwDart的博客 138

Android 在Service中启动Activity的大坑

转载地址:http://blog.csdn.net/fang323619/article/details/74388804公司集成界面劫持监测SDK,刚好可以借鉴弹出透明Activity在其他应用上层,来警告界面劫持风险。一    Context的继承关系图二    异常如何产生三    解决这个异常后会出现问题四    ActivitystartActivity为什么不出现这个异常呢五    A...

ZhangQiang_0的博客 4036

C++内存泄漏详细定位:准确找到代码中的缺陷

具体来说,程序丢失了4字节内存,这是因为LeakClass的构造函数中使用了new操作符,但在析构函数中没有使用delete操作符释放该内存。具体来说,程序在两个位置分别丢失了128字节内存,共计256字节,这是因为我们在程序中使用new分配了内存,但没有使用delete释放它。在下面的示例程序中,我们使用了一个名为LeakClass的类,在该类中使用new操作符分配了一段内存。为了修复上述示例程序中的内存泄漏问题,我们需要在LeakClass的析构函数中使用delete操作符来释放m_ptr指向的内存。

2301_79365003的博客 223

深入理解内存泄漏

一、JVM内存模型 常见jvm内存模型,主要分为堆区,本地方法栈,虚拟机栈,程序计数器,和方法区。如下图所示:(1)程序计数器每个线程都会有自己私有的程序计数器(PC)。可以看作是当前线程...

Android技术之家 899

Agisoft Metashape相机标定笔记

使用Metashape进行自动相机标定是可能的。(可选:使用打印的棋盘格图案,但需保证它是平坦的且单元格是正方形)。相机标定步骤支持全相机标定矩阵的估计,包含非线性的畸变参数。相机模型的细节请参照附录D——相机模型板块。:在通用的工作流程中,相机标定步骤可以跳过。因为Metashape会在图像定向过程中进行相机自标定。但是,如果定向结果不稳定,例如,由于影像之间缺乏连接点,额外进行单独的相机标定步骤也许是有用的。

天桥飞熊的博客 3981

【工具使用】Keil常用的调试操作整理介绍

2、当选择了非0级优化时,调试可能会变得困难,具体表现在断点调试。该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的置。:如果是在C语言窗口中,则是按单条语句执行,与单步调试不同的是,遇到函数不会进入函数内部,而是直接全速运行函数,并跳到下一条语句。但我的Keil软件中无法显示这个视图,并且通过修改系统试图,调试时,点击打开系统视图发生了闪退的现象,目前能想到的原因是:重新安装Keil,安装最新版本。

MEYOU_Cc 不吃香菜! 1万+

内存泄漏不再难:Chrome开发者工具实战教程

有了前面的理论基础,本篇从一个简单的内存泄漏例子开始,先掌握如何使用 Chrome 开发者工具进行内存泄漏分析。之后,讲解几个实际项目中遇到的不同类型的内存泄漏示例,让您学会如何识别和修复内存泄漏,之后再遇到类似问题能够从容面对。一个简单的内存泄漏示例这一个简单的示例,我们的目的主要是学习如何生成堆快照、分析内存泄漏及掌握 Chrome 开发者工具 Memory 面板各视图代表的含义。准备一份产生...

weixin_44829437的博客 774

【Flink cdc】Data row is smaller than a column index, internal schema representation is probably xxx

翻译一下:当scan.startup.mode=EARLIEST_OFFSET时,如果在最早的offset之后表结构有过变化就无法支持。原因应该是在binlog 的earliest_offset之后,表结构被修改过。我的解决方案:source配置中使用。mysql source配置使用。,以时间戳为消费依据。

integrity 2085

Android 内存泄漏实战:从排查到修复的完整指南

在 Android 中的表现:Activity 或 Fragment 被销毁后,仍然被其他对象持有引用,导致无法被垃圾回收器回收。定义:内存泄漏是指程序中已动态分配的内存由于某种原因未能释放,导致系统内存的浪费,最终可能导致应用崩溃或性能下降。通过本文的实战指南,你可以掌握 Android 内存泄漏的排查和修复技巧,提升应用的质量和性能。将非静态内部类改为静态内部类,并使用 WeakReference 持有外部类引用。内存泄漏是 Android 开发中的常见问题,可能导致应用崩溃或性能下降。

tangweiguo03051987的博客 1615

全面解析智能座舱芯片参数:高通 (SA8295)vs 联发科,真实案例一行行讲给你听!

使用场景推荐芯片中低端车型 + 1屏导航语音SA8155P / MT8628(性价比高)中控+副驾+仪表+全景影像SA8255P / MT8678(性能强)高阶自动驾驶+域控融合SA8295P(顶级安全+算力)

weixin_43199439的博客 2080

《备考系统架构设计师》 - 专栏介绍和目录

本专栏包括所有历年真题及详解、章节知识核心总结、精选高分论文、补充知识、专题总结等。欢迎订阅专栏。

数据知道的博客 4万+

『每周译Go』定位并修复 Go 中的内存泄漏

这篇文章回顾了我是如何发现内存泄漏、如何修复它、如何修复 Google 中的 Go 示例代码中的类似问题,以及我们是如何改进我们的基础库防止未来再次发生这种情况。Google 云的 Go ...

Go中国 580

HTOL集成电路老化测试学习总结-20250510

电子元器件的可靠性在产品开发中至关重要,尤其是在微电子技术迅速发展的今天。电子元器件的失效率通常遵循“浴盆曲线”,分为早期失效期、可使用期和老化期。为了评估芯片的可靠性,常采用高温操作寿命测试(HTOL),通过高温和高压加速芯片老化,以筛选出早期失效的芯片并评估其长期可靠性。HTOL测试中,芯片在高温下运行并监控其性能变化,通过阿伦尼乌斯公式计算加速因子,预测芯片的失效率和寿命。此外,Burn-in测试用于加速芯片老化,提前发现并剔除不合格产品,而早期失效率测试(ELFR)则用于评估产品初期使用阶段的可靠性

歌颂苦难的行为是无耻的; 2106

如何诊断Java应用的内存泄漏问题?

Java应用程序在运行过程中可能会遇到各种性能问题,其中内存泄漏是一个常见但又难以诊断和解决的问题。内存泄漏不仅会导致应用程序消耗越来越多的内存,还可能最终导致应用程序崩溃或性能下降。因此,对内存泄漏问题的及时诊断和解决是至关重要的。本文档提供了一个详细的Java内存泄漏诊断和修复方案。该方案涵盖了从问题确认、工具准备、堆转储、分析、代码审查,到修复和测试的全过程。同时,文档还包括一个模拟内存泄漏的Java Demo以及相应的修复Demo,以便读者更好地理解和应用这一方案。

新手学堂 362

AppStore逆向分析(登录、查询、下单)

某网站全协议流程逆向与分析(自动登录、激活、查询、下单)

吴秋霖的博客 3029

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java中的内存泄漏检测与排查

内存泄漏是一个复杂的问题,需要通过合理的工具和方法进行检测和排查。内存泄漏是指在程序运行过程中,内存被分配但不再使用,且无法被垃圾回收器回收,最终可能导致应用程序的内存消耗不断增长。在缓存实现中,如果长生命周期的对象(如缓存)持有短生命周期的对象(如临时数据),这些短生命周期的对象可能不会被及时回收。Java VisualVM 是 JDK 附带的工具,用于监视应用程序的内存使用情况,并生成堆转储文件进行分析。大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!

微赚淘客系统开发者博客 1777

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

VS 2012内存泄漏检测之 vld ( cocos2d-x 检测内存泄漏)

因为写项目难免会有内存泄漏情况,所有我们就找个方法来检测内存泄漏,在代码和工具比较之后,最终选择VLD强大的检测工具,具体方法如下: 首先下载安装 vld, 目前最新版是2.3   下载地址:https://vld.codeplex.com/releases ,下载完成后双击安装,安装过程中请注意一个弹框: 建议选是,他会自动帮我们在系统的环境变量里添加vld的动态链接库,如果选否也可

JinGui 5067

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

内存泄漏的8种情况(附代码示例)

一. 内存泄漏(memroy leak) 严格来说,只有对象不会再被程序用到了,但是GC又不能回收它们的情况,才叫内存泄漏 宽泛的讲,实际情况中很多时候一些不太好的实践会导致对象的生命周期变得很长甚至导致OOM,也叫“内存泄漏” 申请了内存用完了不释放,如申请了1024M内存,分配了512M内存一直不回收,那么可用内存就只有512M,仿佛泄漏掉一部分。 二. 内存溢出(out of memory) 申请内存时,没用足够的内存可以使用。 三. 两者的关系 内存泄漏的增多,最终会导致内存溢出。 .

枫陵的博客 2万+

[Golang] timer可能造成的内存泄漏

背景 前两天,跟一位学长交流Golang;然后,他突然问我:你知道timer可能造成内存泄漏嘛? 当时,甚是一脸懵逼,毕竟之前写的Agent测了好久,都没发现这个问题啊。今天,就索性了解了下。这里先说下结论,timer的误用可能造成某些等待timer的Goroutine无法正常退出,导致资源无法释放;(ps. 虽然的确算是内存泄漏,但是对于我这种写C出身的人来说,感觉还是怪怪的) 接下来进入正题...

moliyiran的专栏 1645

处理内存泄漏的一种MFC方法

2000年11月28日 07:16:00 信息产业部数据所 廖 铮 ---- Windows使用复杂的内存管理器控制和优化内存的使用(包括磁盘缓冲)。一旦内存管理出现纰漏就会导致内存泄漏。内存泄漏的实质一般是因为在堆上分配了某块内存但以后不再对其重新分配,使得该部分内存失去重用性。出现这一问题的多数应用程序一开始往往正常运行,所以要检测出该类问题是较为困难的。不过,要将其找出并得到正确的

秦梦瑶的专栏 407
上一篇: rememberLauncherForActivityResult使用示例
下一篇: apk图片资源优化,减小APK大小
lynn8570_blog
博客等级 码龄10年 254粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值