1.使用

LeakCancary 2.0使用,只需要配置如下代码,便可以进行使用,比LeakCanary1.0不知道高到哪里去了~

debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0-alpha-2'

2.源码分析

阅读源码后可以看到leakcancary-leaksentry模块的Androidmanifest文件,可以看到下面的内容:

<?xml version="1.0" encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.squareup.leakcanary.leaksentry"><application><providerandroid:name="leakcanary.internal.LeakSentryInstaller"android:authorities="${applicationId}.leak-sentry-installer"android:exported="false"/></application>
</manifest>

然后我们可以看到LeakSentryInstaller这个类到底做了什么

internal class LeakSentryInstaller : ContentProvider() {override fun onCreate(): Boolean {CanaryLog.logger = DefaultCanaryLog()val application = context!!.applicationContext as Application//利用系统自动调用ContentProvider的onCreate来进行安装InternalLeakSentry.install(application)return true}...

至于为什么系统会调用ContentProvider的onCreate方法,我们可以看看源码,在ActivityThread中的H中的handleMessage可以看到

public void handleMessage(Message msg) {if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));switch (msg.what) {case BIND_APPLICATION:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");AppBindData data = (AppBindData)msg.obj;//关键方法handleBindApplication(data);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;

然后在handleBindApplication中可以看到

// don't bring up providers in restricted mode; they may depend on the
// app's custom Application class
if (!data.restrictedBackupMode) {if (!ArrayUtils.isEmpty(data.providers)) {//contentprovider初始化,里面会调用onCreate方法installContentProviders(app, data.providers);}
}// Do this after providers, since instrumentation tests generally start their
// test thread at this point, and we don't want that racing.
try {mInstrumentation.onCreate(data.instrumentationArgs);
}
catch (Exception e) {throw new RuntimeException("Exception thrown in onCreate() of "+ data.instrumentationName + ": " + e.toString(), e);
}
try {//app的onCreate方法调用mInstrumentation.callApplicationOnCreate(app);
} catch (Exception e) {

具体调用contentprovider的onCreate代码逻辑如下

@UnsupportedAppUsage
private void installContentProviders(Context context, List<ProviderInfo> providers) {final ArrayList<ContentProviderHolder> results = new ArrayList<>();for (ProviderInfo cpi : providers) {···//installProvider方法ContentProviderHolder cph = installProvider(context, null, cpi,false /*noisy*/, true /*noReleaseNeeded*/, true /*stable*/);if (cph != null) {cph.noReleaseNeeded = true;results.add(cph);}}//installProvider方法,然后一步步跟进//1//XXX Need to create the correct context for this provider.localProvider.attachInfo(c, info);//2public void attachInfo(Context context, ProviderInfo info) {attachInfo(context, info, false);}//3private void attachInfo(Context context, ProviderInfo info, boolean testing) {mNoPerms = testing;mCallingPackage = new ThreadLocal<>();if (mContext == null) {···ContentProvider.this.onCreate();}}

通过上面的分析,可以知道在我们引入依赖后,依赖包中的AndroidMainfest.xml文件便会主动合并到主AndroidManifest.xml文件中,然后在程序启动过程中便会自动创建ContentProvider,然后进行InternalLeakSentry.install(application),接下来进行一些列的监控和dump操作等。

2.1 InternalLeakSentry.install(application)

下面来分析InternalLeakSentry.install(application)里面都做了一些什么,可以看到

fun install(application: Application) {CanaryLog.d("Installing LeakSentry")checkMainThread()if (this::application.isInitialized) {return}InternalLeakSentry.application = applicationval configProvider = { LeakSentry.config }// 1.监听 Activity.onDestroy()ActivityDestroyWatcher.install(application, refWatcher, configProvider)// 2.监听 Fragment.onDestroy()FragmentDestroyWatcher.install(application, refWatcher, configProvider)// 3.监听完成后进行一些初始化工作listener.onLeakSentryInstalled(application)}

从命名上可以看到在Activity和Fragment进行destory的时候进行watch

1. ActivityDestroyWatcher

internal class ActivityDestroyWatcher private constructor(private val refWatcher: RefWatcher,private val configProvider: () -> Config
) {private val lifecycleCallbacks = object : ActivityLifecycleCallbacksAdapter() {override fun onActivityDestroyed(activity: Activity) {if (configProvider().watchActivities) {// 监听到 onDestroy() 之后,通过 refWatcher 监测 ActivityrefWatcher.watch(activity)}}}companion object {fun install(application: Application,refWatcher: RefWatcher,configProvider: () -> Config) {val activityDestroyWatcher =ActivityDestroyWatcher(refWatcher, configProvider)application.registerActivityLifecycleCallbacks(activityDestroyWatcher.lifecycleCallbacks)}}
}

2. FragmentDestroyWatcher

internal interface FragmentDestroyWatcher {fun watchFragments(activity: Activity)companion object {private const val SUPPORT_FRAGMENT_CLASS_NAME = "androidx.fragment.app.Fragment"fun install(application: Application,refWatcher: RefWatcher,configProvider: () -> LeakSentry.Config) {val fragmentDestroyWatchers = mutableListOf<FragmentDestroyWatcher>()//大于等于android O  if (SDK_INT >= O) {fragmentDestroyWatchers.add(AndroidOFragmentDestroyWatcher(refWatcher, configProvider))}if (classAvailable(SUPPORT_FRAGMENT_CLASS_NAME)) {// androidx 使用 SupportFragmentDestroyWatcherfragmentDestroyWatchers.add(SupportFragmentDestroyWatcher(refWatcher, configProvider))}if (fragmentDestroyWatchers.size == 0) {return}application.registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacksAdapter() {override fun onActivityCreated(activity: Activity,savedInstanceState: Bundle?) {for (watcher in fragmentDestroyWatchers) {watcher.watchFragments(activity)}}})}private fun classAvailable(className: String): Boolean {return try {Class.forName(className)true} catch (e: ClassNotFoundException) {false}}}
}

Android O 及以后,androidx 都具备对 Fragment 生命周期的监听功能。为什么不监听Android O之前的呢???(待解决) 在版本为1.5.4之前是不支持Fragment内存泄漏监听的,后面版本才加了进来。

3. listener.onLeakSentryInstalled(application)

该listener的最终实现类是leakcanary-android-core中的InternalLeakCanary类

override fun onLeakSentryInstalled(application: Application) {this.application = applicationval heapDumper = AndroidHeapDumper(application, leakDirectoryProvider)//用于发现可能的内存泄漏之后手动调用 GC 确认是否真的为内存泄露val gcTrigger = GcTrigger.Defaultval configProvider = { LeakCanary.config }val handlerThread = HandlerThread(HeapDumpTrigger.LEAK_CANARY_THREAD_NAME)handlerThread.start()val backgroundHandler = Handler(handlerThread.looper)//用于确认内存泄漏之后进行 heap dump 工作。heapDumpTrigger = HeapDumpTrigger(application, backgroundHandler, LeakSentry.refWatcher, gcTrigger, heapDumper, configProvider)application.registerVisibilityListener { applicationVisible ->this.applicationVisible = applicationVisibleheapDumpTrigger.onApplicationVisibilityChanged(applicationVisible)}addDynamicShortcut(application)}

这里有个关于GC回收的知识点,我们可以看看优秀的第三方框架都是怎么写的

interface GcTrigger {fun runGc()object Default : GcTrigger {override fun runGc() {// Code taken from AOSP FinalizationTest:// https://android.googlesource.com/platform/libcore/+/master/support/src/test/java/libcore/// java/lang/ref/FinalizationTester.java// System.gc() does not garbage collect every time. Runtime.gc() is// more likely to perform a gc.Runtime.getRuntime().gc()enqueueReferences()System.runFinalization()}private fun enqueueReferences() {// Hack. We don't have a programmatic way to wait for the reference queue daemon to move// references to the appropriate queues.try {Thread.sleep(100)} catch (e: InterruptedException) {throw AssertionError()}}}
}

可以看到,它使用了Runtime.getRuntime().gc()而不是System.gc(),进入System.gc源码一看

public static void gc() {boolean shouldRunGC;synchronized (LOCK) {shouldRunGC = justRanFinalization;if (shouldRunGC) {justRanFinalization = false;} else {runGC = true;}}if (shouldRunGC) {Runtime.getRuntime().gc();}
}

可以看到System.gc源码的还是最终实现是Runtime.getRuntime().gc();但是需要一系列的判断条件,我们手动调用System.runFinalization()可以使gc方法中的justRanFinalizationw为true,从而保证Runtime.getRuntime().gc()会被执行。

3.如何判断对象可能泄露:ReferenceQueue含义及作用

在Activity/Fragment销毁后,会进行一系列的对象回收,我们把这些对象分别和引用队列进行关联,当某个对象被回收时,**(弱引用一旦变成弱可达(可达性算法分析),引用就会加到引用队列中,然后再进行回收)**我们对象的引用就会被加入到引用队列中。根据该原理进行一系列的操作,最终判断是否内存泄漏。

3.1 引用队列

通常我们将其ReferenceQueue翻译为引用队列,换言之就是存放引用的队列,保存的是Reference对象。其作用在于Reference对象所引用的对象被GC回收时,该Reference对象将会被加入引用队列中(ReferenceQueue)的队列末尾。

ReferenceQueue常用的方法

public Reference poll():从队列中取出一个元素,队列为空则返回null;

public Reference remove():从队列中出对一个元素,若没有则阻塞至有可出队元素;

public Reference remove(long timeout):从队列中出对一个元素,若没有则阻塞至有可出对元素或阻塞至超过timeout毫秒;

1、强引用
2、软引用
3、弱引用
4、虚引用(Phantom Reference)
虚引等同于没有引用,这意味着在任何时候都可能被GC回收,设置虚引用的目的是为了被虚引用关联的对象在被垃圾回收器回收时,能够收到一个系统通知。(被用来跟踪对象被GC回收的活动)虚引用和弱引用的区别在于:虚引用在使用时必须和引用队列(ReferenceQueue)联合使用,其在GC回收期间的活动如下:

ReferenceQueue queue=new ReferenceQueue();

PhantomReference pr=new PhantomReference(object,queue);

也即是GC在回收一个对象时,如果发现该对象具有虚引用,那么在回收之前会首先该对象的虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入虚引用来了解被引用的对象是否被GC回收。

3.2 GC Root对象

3.3 内存是否泄漏

知道引用队列的原理后,先大概描述一下如何判断是否泄漏,首先创建三个队列

/*** References passed to [watch] that haven't made it to [retainedReferences] yet.* watch() 方法传进来的引用,尚未判定为泄露*/private val watchedReferences = mutableMapOf<String, KeyedWeakReference>()/*** References passed to [watch] that we have determined to be retained longer than they should* have been.* watch() 方法传进来的引用,已经被判定为泄露*/private val retainedReferences = mutableMapOf<String, KeyedWeakReference>()private val queue = ReferenceQueue<Any>() // 引用队列,配合弱引用使用//KeyedWeakReference,对象和引用队列进行弱引用关联,所以这个对象一定会被回收    
class KeyedWeakReference(referent: Any,val key: String,val name: String,val watchUptimeMillis: Long,referenceQueue: ReferenceQueue<Any>
) : WeakReference<Any>(referent, referenceQueue
) {@Volatilevar retainedUptimeMillis = -1Lcompanion object {@Volatile@JvmStatic var heapDumpUptimeMillis = 0L}}    

如果一个obj对象,它和队列queue进行弱引用关联,在进行垃圾收集时,发现该对象具有弱引用,会把引用加入到引用队列中,我们如果在该队列中拿到引用,则说明该对象被回收了,如果拿不到,则说明该对象还有强/软引用未释放,那么就说明对象还未回收,发生内存泄漏了,然后dump内存快照,使用第三方库进行引用链分析

这里重点强调一点一个对象可能被多个引用持有,比如强引用,软引用,弱引用,只要这个对象还有强引用/软引用,与这个对象关联的任意引用队列就拿不到引用,引用队列就相当于一个通知,多个引用队列和一个对象关联,对象被回收时,多个队列都会受到通知

3.4 watch()

@Synchronized fun watch(watchedReference: Any,referenceName: String
) {if (!isEnabled()) {return}//移除队列中将要被 GC 的引用removeWeaklyReachableReferences()val key = UUID.randomUUID().toString()val watchUptimeMillis = clock.uptimeMillis()val reference = // 构建当前引用的弱引用对象,并关联引用队列 queueKeyedWeakReference(watchedReference, key, referenceName, watchUptimeMillis, queue)if (referenceName != "") {CanaryLog.d("Watching instance of %s named %s with key %s", reference.className,referenceName, key)} else {CanaryLog.d("Watching instance of %s with key %s", reference.className, key)}watchedReferences[key] = referencecheckRetainedExecutor.execute {//如果引用未被移除,则可能存在内存泄漏moveToRetained(key)}
}

removeWeaklyReachableReferences()

private fun removeWeaklyReachableReferences() {// WeakReferences are enqueued as soon as the object to which they point to becomes weakly// reachable. This is before finalization or garbage collection has actually happened.// 弱引用一旦变得弱可达,就会立即入队。这将在 finalization 或者 GC 之前发生。var ref: KeyedWeakReference?do {ref = queue.poll() as KeyedWeakReference? // 队列 queue 中的对象都是会被 GC 的if (ref != null) {val removedRef = watchedReferences.remove(ref.key)if (removedRef == null) {retainedReferences.remove(ref.key)}// 移除 watchedReferences 队列中的会被 GC 的 ref 对象,剩下的就是可能泄露的对象}} while (ref != null)}

moveToRetained()

@Synchronized private fun moveToRetained(key: String) {removeWeaklyReachableReferences() // 再次调用,防止遗漏val retainedRef = watchedReferences.remove(key)if (retainedRef != null) {retainedReferences[key] = retainedRefonReferenceRetained()}}

最后会回调到InternalLeakCanary的onReferenceRetained()方法

override fun onReferenceRetained() {if (this::heapDumpTrigger.isInitialized) {heapDumpTrigger.onReferenceRetained()}
}//1.HeapDumpTrigger 的 onReferenceRetained()
fun onReferenceRetained() {scheduleRetainedInstanceCheck("found new instance retained")
}//2.scheduleRetainedInstanceCheck
private fun scheduleRetainedInstanceCheck(reason: String) {backgroundHandler.post {checkRetainedInstances(reason)}
}//3.checkRetainedInstances
private fun checkRetainedInstances(reason: String) {CanaryLog.d("Checking retained instances because %s", reason)val config = configProvider()// A tick will be rescheduled when this is turned back on.if (!config.dumpHeap) {return}var retainedKeys = refWatcher.retainedKeys//当前泄露实例个数小于 5 个,不进行 heap dumpif (checkRetainedCount(retainedKeys, config.retainedVisibleThreshold)) returnif (!config.dumpHeapWhenDebugging && DebuggerControl.isDebuggerAttached) {showRetainedCountWithDebuggerAttached(retainedKeys.size)scheduleRetainedInstanceCheck("debugger was attached", WAIT_FOR_DEBUG_MILLIS)CanaryLog.d("Not checking for leaks while the debugger is attached, will retry in %d ms",WAIT_FOR_DEBUG_MILLIS)return}// 可能存在被观察的引用将要变得弱可达,但是还未入队引用队列。// 这时候应该主动调用一次 GC,可能可以避免一次 heap dumpgcTrigger.runGc()retainedKeys = refWatcher.retainedKeysif (checkRetainedCount(retainedKeys, config.retainedVisibleThreshold)) returnHeapDumpMemoryStore.setRetainedKeysForHeapDump(retainedKeys)CanaryLog.d("Found %d retained references, dumping the heap", retainedKeys.size)HeapDumpMemoryStore.heapDumpUptimeMillis = SystemClock.uptimeMillis()dismissNotification()val heapDumpFile = heapDumper.dumpHeap()if (heapDumpFile == null) {CanaryLog.d("Failed to dump heap, will retry in %d ms", WAIT_AFTER_DUMP_FAILED_MILLIS)scheduleRetainedInstanceCheck("failed to dump heap", WAIT_AFTER_DUMP_FAILED_MILLIS)showRetainedCountWithHeapDumpFailed(retainedKeys.size)return}refWatcher.removeRetainedKeys(retainedKeys)HeapAnalyzerService.runAnalysis(application, heapDumpFile)
}

一些细节可以看看代码注释,checkRetainedCount满足个数的话,就要发起head dump,具体的逻辑在AndroidHeapDumper.dumpHeap()中:

 override fun dumpHeap(): File? {val heapDumpFile = leakDirectoryProvider.newHeapDumpFile() ?: return null···return try {//Dump出文件Debug.dumpHprofData(heapDumpFile.absolutePath)heapDumpFile} catch (e: Exception) {CanaryLog.d(e, "Could not dump heap")// Abort heap dumpnull} finally {cancelToast(toast)notificationManager.cancel(R.id.leak_canary_notification_dumping_heap)}}

最后启动一个前台服务 HeapAnalyzerService 来分析 heap dump 文件。老版本中是使用 Square 自己的 haha 库来解析的,这个库已经废弃了,Square 完全重写了解析库,主要逻辑都在 moudle leakcanary-analyzer 中。这部分我还没有阅读,就不在这里分析了。对于新的解析器,官网是这样介绍的:

Uses 90% less memory and 6 times faster than the prior heap parser.

减少了 90% 的内存占用,而且比原来快了 6 倍。后面有时间单独来分析一下这个解析库。

后面的过程就不再赘述了,通过解析库找到最短 GC Roots 引用路径,然后展示给用户。

4.手动写内存泄漏检测

下面是参考Zero的Demo写的内存泄漏检测的一个例子,思路和LeakCanary一样


fun main() {class MyKeyedWeakReference(referent: Any,val key: String,val name: String,referenceQueue: ReferenceQueue<Any>) : WeakReference<Any>(referent, referenceQueue) {val className: String = referent.javaClass.nameoverride fun toString(): String {return "{key=$key,className=$className}"}}//需要观察的对象val watchedReferences = mutableMapOf<String,MyKeyedWeakReference>()//如果最后retainedReferences还存在引用,说明泄漏了val retainedReferences = mutableMapOf<String,MyKeyedWeakReference>()//当与之关联的弱引用中的实例被回收,则会加入到queueval gcQueue = ReferenceQueue<Any>()fun sleep(mills: Long){try {Thread.sleep(mills)}catch (e: Exception){e.printStackTrace()}}fun gc(){println("执行gc...")Runtime.getRuntime().gc()sleep(100)System.runFinalization()}fun removeWeaklyReachableReferences(){println("removeWeaklyReachableReferences")var ref: MyKeyedWeakReference?do {ref = gcQueue.poll() as MyKeyedWeakReference? //队列queue中的对象都是会被GC的println("ref=$ref,如果ref为null,说明对象还有强引用")if (ref != null){ //说明被释放了println("ref=$ref, 对象被释放了,key=${ref.key}")val removedRef = watchedReferences.remove(ref.key)println("removedRef=$removedRef, 如果removedRef为null,说明已经不在watchedReferences了,key=${ref.key}")if (removedRef == null){//不在watchedReferences则说明在retainedReferencesretainedReferences.remove(ref.key)}}}while (ref != null)}@Synchronizedfun moveToRetained(key: String){println("5.moveToRetained,key=$key")removeWeaklyReachableReferences()val retainedRef = watchedReferences.remove(key)println("retainedRef =$retainedRef 如果还有值说明没有被释放")if (retainedRef != null){ //添加到retainedReferencesretainedReferences[key] = retainedRef}}fun watch(obj: Any,referenceName: String = ""){println("2.watch...")removeWeaklyReachableReferences()val key = UUID.randomUUID().toString()println("3.key=$key")val reference = MyKeyedWeakReference(obj,key,referenceName,gcQueue)println("4.reference=$reference")//加入观察列表watchedReferences[key] = reference//过段时间查看是否释放thread(start = true){sleep(5000)moveToRetained(key)}}var obj : Any? = Object()println("1.创建一个对象obj=$obj")watch(obj!!,"")sleep(2000)obj = nullif (obj == null){println("obj=$obj 释放了")}gc()sleep(5000)println("watchedReferences=$watchedReferences")println("retainedReferences=$retainedReferences")println("执行完毕")

5. ContentProvider的优化

5.1 Content的初始化顺序

通过ContentProvider来进行初始化确实能给使用者带来便利,但是会影响启动速度,如果有多个ContentProvider,如何控制这些ContentProvider初始化的顺序呢,可以参考下面这篇文章https://sivanliu.github.io/2017/12/16/provider%E5%88%9D%E5%A7%8B%E5%8C%96/,如果一些第三方值只提供ContentProvider的初始化方式,我们又不想影响我们APP的启动时间,该如何处理呢?

5.2

如果一些第三方库只提供ContentProvider的初始化方式,我们又不想影响我们APP的启动时间,该如何处理呢?

我们可以使用AOP方式进行插桩,通过Gradle+Transform+ASM进行修改ContentProvider的onCreate方法,提前返回,然后手动去调用初始化代码,如果这些初始化代码是私有的或者只限制包内使用的,也可以通过ASM去修改访问权限,然后在我们想初始化的地方再进行初始化,这可能涉及到一个先后的问题,需要先修改完然后再在某个地方初始化,这里只是提供一个思路。

如果一个库初始化耗时很长,又在ContentProvider中进行初始化,ContentProvider中初始化的代码又臭又长,又没有提供其他初始化方法,这样的垃圾库你要它干嘛!

6.总结

  1. 利用ContentProvider自动初始化,无需用户手动初始化

  2. GC回收,引用队列

  3. 1.5.4之后支持fragment,支持androidx

  4. 当泄露引用到达 5 个时才会发起 heap dump

  5. 全新的 heap parser,减少 90% 内存占用,提升 6 倍速度

  6. ContentProvider的优劣,以及优化方案

参考文章

https://sivanliu.github.io/2017/12/16/provider%E5%88%9D%E5%A7%8B%E5%8C%96/

https://juejin.im/post/5d1225546fb9a07ecd3d6b71

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. OpenCV3.4.1+Contrib+Cuda+VS2015+Win10 编译

    网上已经有很多关于OpenCV的编译了 &#xff0c;官网上直接exe下载安装的OpenCV包从3.0版本之后就不含Contrib了&#xff0c;基本使用是够的&#xff0c;但是很多时候我们需要使用GPU编程&#xff0c;并且期望使用一些SIFT等这些包含在Contrib中的库&#xff0c;我自己配置成功…...

    2024/4/27 22:12:32
  2. 开机播放音乐,解锁后音乐暂停

    安卓小程序需求步骤代码展示需求 开机播放音乐&#xff0c;解锁后音乐暂停 步骤 1.监听开机广播 2.开启服务&#xff08;因为onReceive方法中不因执行耗时的操作&#xff0c;这些操作基本在服务中进行&#xff09;3.在服务当中播放音频文件4.监听手机解锁的广播在该广播接收…...

    2024/4/28 18:40:16
  3. 纯干货!北京市工作居住证个人办事指南

    个人经验&#xff0c;适合毕业工作两年的朋友进行参考&#xff0c;至于工作居住证的作用什么的&#xff0c;就不废话了&#xff0c;直接上干货 准备的材料 &#xff08;1&#xff09;学历证书、学位证书、职称证书及身份证原件和复印件&#xff1b; &#xff08;2&#xff09;…...

    2024/4/28 20:02:47
  4. 面试阿里P6惨败,室友怒怼:你这就是标准的程序员“垃圾简历”

    一石激起千层浪&#xff0c;三天收到两百多封简历。 花光了两个星期的所有空闲时间&#xff0c;一一点评&#xff0c;一一回复&#xff0c;一一讨论与修正。 看光了所有简历以后&#xff0c;能称得上为范本的寥寥无几。 有些同学非常有实力&#xff0c;但看到他的简历时&#…...

    2024/4/27 16:10:52
  5. 面试腾讯,字节跳动首先要掌握的Java多线程,一次帮你全掌握

    其实程序是一段静态的代码&#xff0c;它是应用程序执行的脚本。进程就是程序动态的执行过程&#xff0c;它具有动态性&#xff0c;并发性&#xff0c;独立性。线程是进程调度和执行的单位。 进程&#xff1a;每个进程都有独立的代码和数据空间&#xff08;进程上下文&#xf…...

    2024/4/28 18:40:33
  6. windows破解连接过的wife密码

    windows破解连接过的wife密码 step 1&#xff1a;打开控制台 step 2&#xff1a;输入命令&#xff1a;netsh wlan show profiles step 3&#xff1a;找到需要查找的网络名称&#xff0c;输入命令&#xff1a;netsh wlan show profiles 【网络名称】 keyclear...

    2024/4/27 22:58:26
  7. 【大数据】Hadoop安装(VMware + 进入BIOS开启Intel VT-x + Ubuntu16.04 + Hadoop2.7.7 + jdk1.8.0)

    环境&#xff1a;VMwareUbuntu16.04Hadoop2.7.7jdk1.8.0 1、超稳进入BIOS&#xff0c;开启虚拟技术&#xff0c;Intel VT-x 左下角右键&#xff0c;设置&#xff0c;更新和安全&#xff0c;恢复&#xff0c;立即重新启动。疑难解答&#xff0c;高级选项&#xff0c;UEFI固件设置…...

    2024/4/28 19:32:32
  8. 「Java并发编程」常见基础问题整理

    进程和线程&#xff1f; 进程&#xff1f; 进程是程序的一次执行过程&#xff0c;是系统运行程序的基本单位&#xff0c;进程是动态的。系统运行一个程序就是一个进程从创建&#xff0c;运行到消亡的过程。 Java中&#xff0c;启动main函数的时候其实就是启动了一个JVM进程&a…...

    2024/4/28 9:08:24
  9. 【Java并发编程】线程池相关知识点整理

    为什么要用线程池&#xff1f; 池化技术&#xff1a;减少每次获取资源的消耗&#xff0c;提高对资源的利用率。 线程池提供了一种限制和管理资源&#xff08;包括执行一个任务&#xff09;。 每个线程池还维护一些基本统计信息&#xff0c;例如已完成任务的数量。 使用线程池的…...

    2024/4/28 2:19:32
  10. Git 将本地项目上传到Github

    一、开始二、git add 命令1、详解2、总结三、相关地址一、开始 如图&#xff1a; 步骤&#xff1a; 1、git init &#xff08;建立本地仓库&#xff09;2、git add * (将代码添加到本地仓库&#xff0c;《*是添加全部代码&#xff0c;代码全部更新》)3、git commit -m &quo…...

    2024/4/28 22:08:14
  11. 自动化测试工程

    我想一个基本的自动化测试工程应该需要包含这些吧&#xff0c;当然不同的项目和不同的人最终出来的东西肯定有差别&#xff0c;我觉得应该大同小异吧 1.测试用例的组织逻辑&#xff0c;其中包括用例组织的存储方式&#xff0c;用例的测试开关&#xff0c;用例的描述&#xff0c…...

    2024/4/28 22:24:44
  12. layui扩展组件(组合输入框inputTags)

    inputTags.js内容(从layui官方网站下载后修改的,主要是将限定id改为class(id在html中是唯一的&#xff0c;当需要在同个html页面多处使用时就不能满足需求)) layui.define([jquery,layer],function(exports){"use strict";var $ layui.jquery,layer layui.layer,/…...

    2024/4/27 17:44:29
  13. PageHelper的基础使用

    0.从源码层面上理解PageHelper 简单的点击了一下&#xff0c;觉得挺复杂的&#xff0c;决定把设计模式透析之后&#xff0c;再来分析。PageHelper结合MyBatis进行使用&#xff0c;通过拦截器保证pageNum和pageSize以及total&#xff0c;然后一个 wrapper&#xff0c;还有一个代…...

    2024/4/12 6:11:34
  14. 树莓派编译安装Openssl

    wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz tar zxf openssl-1.1.1d.tar.gz cd openssl-1.1.1d ./config --prefix/usr/local/openssl --openssldir/usr/local/openssl make -j4 && make install...

    2024/4/24 10:22:58
  15. 【Window】解决window的bat脚本执行出现中文乱码的问题

    中文那么好&#xff0c;你为什么不好好善待她... window下通过新建txt文件然后改成.bat的文件&#xff0c;输入内容后&#xff0c;执行出现中文乱码&#xff1f; 原因&#xff1a; 批处理文件&#xff0c;是以ANSI编码方式。若以别的方式&#xff08;如UTF-8&#xff09;编辑…...

    2024/4/20 18:02:32
  16. log4j日志传送至flume至kafka显示输出

    妈耶&#xff0c;一个简简单单的功能&#xff0c;废了我大半天功夫&#xff0c;反思了一下原因&#xff0c;1是自己之前学的东西记不清了&#xff0c;各种配置搞的很晕&#xff0c;看了半天&#xff0c;2是网上的教程实在不堪入目&#xff0c;跟着走让人云里雾里&#xff0c;费…...

    2024/4/24 21:14:20
  17. Mac安装nacos

    一、前言 初次使用Mac&#xff0c;还不太习惯&#xff0c;但是鉴于朋友们都说mac用久了&#xff0c;你就会鄙视windows了&#xff0c;于是&#xff0c;步入了新系统的开发队伍中&#xff0c;本次安装nacos&#xff0c;特此记录一下&#xff1b; 二、下载 1、下载安装包 nac…...

    2024/4/27 0:55:23
  18. 程序员艰苦奋战三个月后终于成功斩获字节跳动offer[Java研发岗]

    前言: 经历不断学习加上总结&#xff0c;终于开始出效果。努力没有白费。 相比来说等offer真煎熬&#xff0c;但是终于还是到了。发完就去搬砖啦&#xff0c;明天还有其他面试呢~ 面的是Java研发实习生... 一、字节跳动技术一面&#xff08;算法&#xff09; Java 的 16 进…...

    2024/4/20 9:53:02
  19. 日志查找常用命令-超实用

    0 前言 &#xff08;1&#xff09;命令的尾部添加 --color 或者 --colorauto 可以使关键字带颜色&#xff0c;很清晰。 1 Linux日志查找常用命令 1.1 cat、zcat cat -n app.log | grep "error"&#xff1a;查询日志中含有某个关键字error的信息&#xff0c;显示行…...

    2024/4/11 4:38:21
  20. 一个冒号带来的错误 ——No suitable driver found for jdbc:mysql:/…错误

    No suitable driver found for jdbc:mysql:/…错误 用的IDEA2018.2版本连接mysql数据库&#xff0c;sql版本是8.0.20&#xff0c;相对应的jar包是 用JDBC注册并连接数据库&#xff0c;出现错误… 我把网上的方法都试了一遍 这儿在test连接数据库的时候可能出现can’t connect…...

    2024/4/27 9:31:26

最新文章

  1. 多模态视觉大模型(2): 常用模型介绍(CLIP和LLAVA)

    文章目录 1.CLIP 讲解1.1 clip 预训练过程1.2 利用clip进行图像分类1.3 CLIP代码详解1.3.1 Image Encoder 和 Text Encoder的实现1.3.2 搭建CLIP模型1.3.3 准备数据1.3.4 Loss的定义1.4 完整代码2.GLIP 讲解2.1 GLIP 介绍2.2 GLIP 网络结构3.Flamingo3.1 模型介绍3.2 Loss 定义…...

    2024/4/28 22:42:39
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 企业常用Linux文件命令相关知识+小案例

    远程连接工具无法连接VMWARE&#xff1a; 如果发现连接工具有时连不上&#xff0c;ip存在&#xff0c;这时候我们查看网络编辑器&#xff0c;更多配置&#xff0c;看vnet8是不是10段&#xff0c;nat设置是否是正确的&#xff1f; 软件重启一下虚机还原一下网络编辑器 查看文件…...

    2024/4/28 13:37:23
  4. 第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组 题解

    VP比赛链接 : 数据加载中... - 蓝桥云课 1 . 九进制 转 十进制 直接模拟就好了 #include <iostream> using namespace std; int main() {// 请在此输入您的代码int x 22*92*81*9;cout << x << endl ;return 0; } 2 . 顺子日期 枚举出每个情况即可 : …...

    2024/4/23 6:37:37
  5. 一个浮动绝对居中的tailwindcss

    今天改进图片组件&#xff0c;遇到个SVG绝对居中的问题。想起之前大概是通过top left来实现&#xff0c;由于组件的宽高需要动态输入。不能定死宽高&#xff0c;于是想起来问GPT。刚开始老是给一些很菜的代码&#xff0c;不是我想要的 气不打一处来&#xff0c;索性给他限死框框…...

    2024/4/26 21:09:53
  6. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/4/28 4:04:40
  7. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/4/28 12:01:04
  8. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/4/28 16:34:55
  9. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/4/28 18:31:47
  10. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/4/28 12:01:03
  11. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/4/28 12:01:03
  12. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/4/28 12:01:03
  13. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/4/28 16:07:14
  14. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/4/27 21:08:20
  15. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/4/28 9:00:42
  16. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/4/27 18:40:35
  17. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/4/28 4:14:21
  18. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/4/27 13:52:15
  19. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/4/27 13:38:13
  20. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/4/28 12:00:58
  21. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/4/28 12:00:58
  22. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/4/27 22:51:49
  23. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/4/28 7:31:46
  24. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/4/28 8:32:05
  25. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/4/27 20:28:35
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57